Zend_View_Helper_Navigation_Menu
を拡張し、RecursiveIteratorIterator
を使用してメニューツリーを反復処理します。ツリー内のブランチレベルの最初の項目か最後の項目かどうかを判断できるようにする必要があります。ここでPHP RecursiveIteratorIterator:各ブランチレベルの最初と最後の項目を決定する
は私が探しているものの例です:
- ナビ1(最初の)
- ナビ1.1(最初&最後)
- ナビ1.1.1(最初の)
- Nav 1.1.2
- Nav 1.1.3(最終)
- ナビ1.1(最初&最後)
- ナビ2
- ナビ2.1(第一)
- ナビゲーション2.2(最後)
- ナビ3(最後)
- ナビ3.1(第一)
- ナビ3.2(最後)
追加情報
- PHPバージョン5.2.13
ソリューション2つの変数がを追跡するために使用することができますforeach ($iterator as $page)
ループ内
深さ、$depth
および$prevDepth
。単純比較条件では、ブランチレベルの最初の項目を確認することができます:if ($depth > $prevDepth)
。
Zend_Navigation_Container
オブジェクトを使用してRecursiveCachingIterator
を作成し、それを使用してRecursiveIteratorIterator
を作成すると、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;
}
'getChildren'や' nextElement'を使ってどうしようもありません...しかし、悲しいことに、これらのクラスはあまり詳しく書かれていません。http://www.php.net/manual/en/class.recursiveiteratoriterator.php –
modeは 'RecursiveIteratorIterator'で実行されます(コンストラクタの2番目のパラメータです)。 'LEAVES_ONLY'、' CHILD_FIRST'または 'SELF_FIRST'(' LEAVES_ONLY'がデフォルトです)? – ircmaxell
あなたはそれを使用する方法の使用例を与えることができます – Gordon