E' molto semplice da fare ma difficile da spiegare così su due piedi... vedrò di fare del mio meglio.
prima del foreach, che è il codice che si ripete per ogni libro (o quello che è) determina una nuova variabile, chiamandola come vuoi... nel mio esempio $grid
$grid = 0;
A questo punto entra nel foreach e appena prima del codice che stampa l'output del singolo libro metti una cosa del genere
if ($grid == 0) {
echo '<table>';
$grid++;
}
if ($grid == 1) {
echo '<tr>';
}
echo '<td>';
In questo modo, se la tabella è appena stata iniziata mette il tag <table> e fa salire di uno il valore di grid. A questo punto se il valore di grid è 1, e quindi siamo alla prima colonna, aggiunge anche il tag <tr> per fare una riga. Il tag <td> viene aggiunto sempre per ogni articolo.
Subito dopo la parte che stampa l'output del singolo libro va inserito qualcosa tipo
echo '</td>';
if ($grid == X) { //X è il numero di colonne dopo cui creare una nuova riga
echo '</tr>';
$grid = 1;
}else{
$grid++;
}
La colonna viene sempre chiusa, non penso vada spiegato il perchè visto che la apriamo sempre. se il numero della colonna attuale raggiunge la X (il numero di colonne che vogliamo) allora chiudiamo anche la riga e settiamo il numero della colonna a 1 in modo che dopo venga aperta un'altra riga. Se invece non siamo ancora all'ultima colonna della riga, e quindi $grid ha un valore intermedio, aumentiamo $grid di 1 (e quello è il valore che esso avrà per il prossimo articolo - mettendo la dichiarazione di $grid nel foreach avremmo avuto sempre prime colonne).
A questo punto ci basta chiudere la tabella alla fine del modulo, subito dopo la chiusura del foreach. Per evitare di chiudere tabelle che non sono state aperte perchè non c'erano articoli basta aggiungere
if ($grid != 0) {
echo '</table>';
}
Ovviamente puoi mettere le impostazioni che vuoi ai tag table, per esempio per determinare una larghezza fissa delle colonne. Consiglio, usando questo metodo, di fissare un'altezza per il tag <div> contenente il libro (<div style="width: XXXpx;">) in modo che essi risultino più ordinati.
Ho usato questo metodo nel mio modulo, quindi non dovrebbero esserci problemi, ma visto che l'ho riscritto a memoria potrei aver fatto qualche errore di battitura o aver dimenticato qualcosa. Fammi sapere se funziona