Je cherche un moyen efficace de vérifier si une ligne est pleine (une rangée a 12 colonnes) à l'intérieur d'une boucle.Iterator Silverstripe vérifier si la ligne est pleine
Le cas est le suivant, j'ai un type de page qui peut contenir plusieurs vidéos. Ces vidéos peuvent varier en taille de colonne. par exemple, la première vidéo peut être réglée sur 12 colonnes, la seconde à 8, ce qui suit à 4, etc.
La façon dont je le fais maintenant, qui fonctionne, est:
<div class="row">
<% loop $MediaTest %>
<% if $Row %>
</div><div class="row">
<% else %>
<% include MediaBlock FixedRatio=true %>
<% end_if %>
<% end_loop %>
</div>
Cette boucle sur les données renvoyées par la méthode
public function getMediaTest()
{
$out = new ArrayList();
$cols = 0;
foreach ($this->Media() as $mediaItem) {
$cols += $mediaItem->Size;
$out->push($mediaItem);
if ($cols >= 12) {
$cols = 0;
$row = new ViewableData();
$row->Row = true;
$out->push($row);
}
}
return $out;
}
Mais je mets en doute l'efficacité de cette solution, en raison de boucle les données et la modification avant de passer à la boucle suivante (dans le modèle).
Je pensais à étendre la classe SSViewer_BasicIteratorSupport
avec une méthode Row()
que je pourrais appeler dans la boucle. Mais cette classe n'est pas extensible. J'ai également essayé de sous-classer la classe et de la remplacer par la configuration Injector
. Je souhaite obtenir votre point de vue dans ce cas, peut-être que la solution est assez efficace, mais je suis toujours ouvert pour apprendre de meilleures solutions plus efficaces!
Merci
Merci pour la réponse, oui je vais maintenant mettre en cache la liste. J'ai aussi rencontré des problèmes de pagination parce que je faisais partie des lignes de la liste. J'ai changé la méthode pour regrouper les colonnes en sous-listes que j'ajoute dans la liste principale qui est envoyée au paginateur. La liste principale est également la liste qui est mise en cache. –