2017-08-10 4 views
1

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

Répondre

2

je pense que la méthode est très bien comme elle est ... semble que vous faites l'optimisation prématurée ici. Si vous rencontrez vraiment des problèmes de performance avec ceci, vous pouvez toujours utiliser un bloc <% cached %> qui ne se met à jour que lors d'une modification de vidéo, par exemple. quelque chose comme:

<div class="row"> 
    <% cached 'mediablocks', $Media.max('LastEdited'), $Media.count() %> 
     <% loop $MediaTest %> 
      <% if $Row %> 
       </div><div class="row"> 
      <% else %> 
       <% include MediaBlock FixedRatio=true %> 
      <% end_if %> 
     <% end_loop %> 
    <% end_cached %> 
</div> 
+0

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. –