2017-10-05 10 views
1

Je cherche la manière la plus propre d'obtenir le prochain enfant d'un objet (enfant suivant du parent). Supposons dans cet exemple que nous parlons de pages (pages Sonata). Actuellement, j'ai Page 2 (Enfant 2), et j'ai besoin de la page suivante du même parent (dans ce cas l'enfant 3). Dans le cas où j'ai la dernière page (enfant 4), j'ai encore besoin du premier enfant.Symfony/Sonata obtient le prochain enfant (frères et soeurs)

Une option consisterait à demander le parent, puis demander tous les enfants, faire une boucle sur tous les enfants et rechercher l'enfant actuel. Ensuite, prenez l'enfant suivant, ou le premier au cas où il n'y en aurait pas un autre. Mais cela ressemble à beaucoup de code, avec beaucoup de laide si la logique et les boucles. Je me demande donc s'il existe une sorte de modèle pour résoudre ce problème.

Répondre

0

Finalement, je suis venu avec la solution suivante:

/** 
* $siblings is an array containing all pages with the same parent. 
* So it also includes the current page. 
* First check if there are siblings: Check if the parent has more then 1 child 
**/ 
if (count($siblings) != 1) { 
     // Find the current page in the array 
     for ($i = 0; $i < count($siblings); $i++) { 

      // If we're not at the end of the array: Return next sibling 
      if ($siblings{$i}->getId() === $page->getId() && $i+1 != count($siblings)) { 
       return $siblings{$i+1}; 
      } 

      // If we're at the end: Return first sibling 
      if ($siblings{$i}->getId() === $page->getId() && $i+1 == count($siblings)) { 
       return $siblings{0}; 
      } 
     } 
    } 

Cela semble être une solution tout à fait propre à résoudre ce problème. Nous n'avons pas une quantité excessive de boucles et si logique, cependant le code est encore lisible.