Disponi gli elementi in colonne con Smarty
-
20-08-2019 - |
Domanda
Ho una pagina php che produce una serie di elementi.Per semplicità diciamo che contiene i numeri 1-5 in ordine numerico.Questi numeri devono essere equamente (o il più vicino possibile) divisi in due colonne (usando una tabella html) in questo modo:
1 4
2 5
3
Il numero di colonne potrebbe cambiare in futuro.Poiché si tratta di un cambiamento a livello di presentazione, presumo che dovrebbe essere qualcosa che può essere ottenuto apportando modifiche esclusivamente al file modello.Il che mi suggerisce che sia Smarty a gestire la divisione degli elementi in colonne.
C'è un modo per raggiungere questo obiettivo con Smarty (e come) o dovrei lasciare che il file php faccia tutto il lavoro?
Soluzione
È possibile farlo in modo intelligente, ma poiché HTML e CSS non supportano realmente le colonne, è una seccatura farlo.Si tratta di capire quanti elementi ci sono nell'array e utilizzare prima i tag {section} per prendere la prima metà (arrotondata per eccesso) degli elementi e visualizzarli in una colonna, quindi una {section} separata per prendere la seconda metà (arrotondata per eccesso) degli elementi e posizionarli nella seconda colonna.
Per {section} puoi specificare da quale indice dell'array iniziare e quanti elementi desideri.Se imposti il numero di elementi nell'array come un'altra variabile, puoi semplicemente calcolarlo.
Potresti provare un codice come questo, ma temo di non aver testato quei calcoli, quindi potrebbe essere sbagliato...
<td>
{section name=myitem loop=$items max=(($itemcount/2)+0.499)}
{$items[myitem]}
{/section}
</td>
<td>
{section name=myitem loop=$items start=(($itemcount/2)+0.499)}
{$items[myitem]}
{/section}
</td>
Altri suggerimenti
Ecco la mia soluzione usando foreach e iterazioni:
<ul>
{foreach from=$items item=item name=firstFE}
{if $smarty.foreach.firstFE.index lt ($items|@count / 2)}
<li>{$item->title}</li>
{/if}
{/foreach}
</ul><ul>
{foreach from=$items item=item name=secFE}
{if $smarty.foreach.secFE.index gte ($items|@count / 2)}
<li>{$item->title}</li>
{/if}
{/foreach}
</ul>