09 caricare una porzione di codice e cicli

Rifacendoci al layout di prima, un caso tipico potrebbe essere quello di non voler caricare del codice javascript in delle specifiche pagine (o qualsiasi altro tipo di codice).

Oppure un altro contesto potrebbe essere quello di voler aggiungere altro codice personalizzato in alcune pagine.

In tutti questi casi utilizziamo la direttiva @section che viene chiusa con @show

@section('footer')
 <script     src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.min.js"> 
 </script>
@show

In questo modo tutto il codice compreso tra @section e @show verrà automaticamente caricato e mostrato in ogni pagina, ma abbiamo la possibilità di avere un riferimento per poterlo intercettare da altre parti.

Infatti usando la direttiva @section(‘footer’) nel file staff.blade.php possiamo sovrascrivere il codice

@section('footer')

@stop

Con questo sistema il codice javascript non verrà caricato in questa specifica pagina, ma si in tutte le altre. Da notare l’uso di @stop per delineare la fine della @section, ha la stessa funzione di @endsection che ormai sta andando in disuso.

Ora possiamo caricare del nostro codice nella pagina

@section('footer')
 <script>alert('ciao');</script>
@stop

a questo punto verrà caricato nel punto della sezione footer di layout l’alert() inserito nella sezione footer della pagina staff. Se volessimo caricare anche lo script di layout insieme all’ alert() bisognerà utilizzare l’attributo @parent

@section('footer')
 @parent
 <script>alert('ciao');</script>
@stop

Con @parent viene caricato lo script compreso tra @section e @show, quindi prima dell’alert, se volessimo invertire basterà posizionare @parent dopo l’alert.

Usare @section nelle pagine che condivideranno il codice è molto diverso rispetto a @yield che è solo un segnaposto per caricare del codice. Con @section si può eliminare modificare sovrascrivendolo o ampliare il codice.

@else

Come per il costrutto condizionale @if visto in precedenza

@if($staff)
 <ul>
  @foreach ($staff as $persona)
   <li> {{$persona['nome']}} {{$persona['cognome']}} </li>
  @endforeach
 </ul>
@endif

analogamente a php possiamo utilizzare @else per visualizzare un messaggio qual’ora la condizione non si vera

@if($staff)
 <ul>
  @foreach ($staff as $persona)
   <li> {{$persona['nome']}} {{$persona['cognome']}} </li>
  @endforeach
 </ul>
 @else
  <p>nessuno staff</p>
@endif

@forelse @empty

Un costrutto che non abbiamo in php, ma è tipico di blade è il @forelse / @empty al posto di @if, @foreach, @else.

<ul>
 @forelse($staff as $persona)
  <li> {{$persona['nome']}} {{$persona['cognome']}} </li>
 @empty
  <li>nessuno staff</li>
 @endforelse
</ul>

Il @forelse cicla uguale al @foreach, ma senza dover specificare la condizione di true o false con @if. Se il @forelse fosse vuoto verrà mostrato il codice dopo @empty che in questo caso sostituirebbe @else.

Da notare che la lista <ul> verrà comunque caricata, anche se il @forelse fosse vuoto, perchè dobbiamo caricarla prima del ciclo, e dopo il @endforelse, cosa che con @if non accadrebbe. Bisogna quindi sempre vagliare il corretto utilizzo del @forelse che non sempre potrebbe risultare idoneo ad ogni situazione.

$loop

Con il @foreach in blade abbiamo a disposizione un oggetto predefinito che si chiama $loop che permette di effettuare alcune operazioni sugli elementi del ciclo, per esempio

<li> {{$loop->first}} {{$loop->last}} {{$persona['nome']}} {{$persona['cognome']}}</li>

Con $loop->first si seleziona il primo valore dell’array, con $loop->last l’ultimo, per esempio posso colorare di rosso il primo valore del ciclo

<li style="{{$loop->first ? 'color:red;':''}}">

Con loop->remaining vengono conteggiati i records. Tutte le altre proprietà di $loop si possono trovare nella documentazione di laravel blade.

@for

Come in php esistono anche il @for / @endfor

<ul>
 @for($i=0; $i<count($staff); $i++)
  <li> {{ $staff[$i]['nome'].' '.$staff[$i]['cognome'] }} </li>
 @endfor
</ul>

@while

e anche il @while @endwhile

<ul>
 @while($persona = array_shift($staff))
  <li> {{ $persona['nome'].' '.$persona['cognome'] }} </li>
 @endwhile
</ul>

le stesse cose che abbiamo in php le ritroviamo in blade, l’unica differenza è che dobbiamo mettere la chiocciola davanti e chiudere il costrutto con end , non usare le graffe e i punti e virgola e l’ echo o il print vengono sostituiti dalle doppie graffe.

In blade le operazioni da eseguire devono comunque essere basilari perchè è un linguaggio per template che deve risultare semplice e snello. Se il codice si appesantisce, per esempio annidando cicli e condizioni, vuol dire che stiamo concettualmente sbagliando e dobbiamo spostare la logica al controller