He extendido Zend_View_Helper_Navigation_Menu
, y usa un RecursiveIteratorIterator
para recorrer el árbol del menú. Lo que quiero poder determinar es si estoy en el primer o el último elemento para un nivel de rama en el árbol.PHP RecursiveIteratorIterator: determinando el primer y último elemento en cada nivel de rama
He aquí un ejemplo de lo que estoy buscando:
- de navegación 1 (primera)
- Nav 1.1 (primera & pasado)
- Nav 1.1.1 (primera)
- Nav 1.1.2
- Nav 1.1.3 (último)
- Nav 1.1 (primera & pasado)
- Nav 2
- Nav 2.1 (primera)
- Nav 2.2 (última)
- Nav 3 (última)
- Nav 3.1 (primera)
- Nav 3.2 (último)
Información adicional
- PHP Versión 5.2.13
Solución
dentro del bucle foreach ($iterator as $page)
dos variables se pueden utilizar para realizar un seguimiento de la profundidades, $depth
y $prevDepth
. Un simple condicional de comparación puede determinar el primer elemento en un nivel de rama: if ($depth > $prevDepth)
.
Creación de una RecursiveCachingIterator
utilizando el objeto Zend_Navigation_Container
y luego utilizar eso para crear la RecursiveIteratorIterator
agrega el método hasNext()
.
$rci = new RecursiveCachingIterator($container, CachingIterator::FULL_CACHE);
$iterator = new RecursiveIteratorIterator($rci,
RecursiveIteratorIterator::SELF_FIRST);
/* snip */
$prevDepth = -1;
foreach ($iterator as $page) {
$depth = $iterator->getDepth();
/* snip */
if ($depth > $prevDepth) {
// first branch item
}
/* snip */
if (!$iterator->hasNext()) {
// last branch item
}
/* snip */
$prevDepth = $depth;
}
Debería ser posible de alguna manera usar 'getChildren' o' nextElement' ... Pero lamentablemente, esas clases no están muy documentadas aún http://www.php.net/manual/en/class.recursiveiteratoriterator.php –
What modo es el 'RecursiveIteratorIterator' corriendo con (es el segundo parámetro para el constructor)? 'LEAVES_ONLY',' CHILD_FIRST' o 'SELF_FIRST' (' LEAVES_ONLY' es el valor predeterminado)? – ircmaxell
¿Puedes dar un ejemplo de uso de cómo piensas usarlo? – Gordon