ZendFramework - Zend_Navigation. Методы Find * удаляют страницы из объекта контейнера - PullRequest
2 голосов
/ 01 февраля 2012

При использовании метода findAll на найденных страницах Zend_Navigation_Container удаляются из объекта контейнера.

То же самое происходит, даже когда я клонирую контейнерный объект и вызывается findAll для этого клонированного.

Я не могу понять, как это происходит.

Однако я заметил, что это происходит только тогда, когда я пытаюсь «найти» страницы на втором уровне (или глубже)

Похоже, здесь описана та же проблема, ответа не было ...

Вот код для воспроизведения проблемы:

1. Первый метод, без клонирования, любая «найденная» страница удаляется из контейнера

<?php
$container = new Zend_Navigation(array(
    array(
        'label'   => 'Page 1',
        'route'   => 'default',
        'pages'   => array(
            array(
                'label'   => 'Page 1.1',
                'route'   => 'default',
            ),
        )
    ),
    array(
        'label'      => 'Page 2',
        'route'      => 'default',
    ),
    array(
        'label'      => 'Page 3',
        'route'      => 'default',
    )
));
echo $this->navigation($container)->menu()->renderMenu($container);
echo '<br /><hr /><br />';
echo $this->navigation($container)->menu()->renderMenu(new Zend_Navigation($container->findAllByLabel('Page 2')));
echo '<br /><hr /><br />';
echo $this->navigation($container)->menu()->renderMenu($container);
?>

2. Вторая попытка, клонирование, страница второго уровня (и более глубокая), которая "найдена", удалена из контейнера

<?php
$container = new Zend_Navigation(array(
    array(
        'label'   => 'Page 1',
        'route'   => 'default',
        'pages'   => array(
            array(
                'label'   => 'Page 1.1',
                'route'   => 'default',
            ),
        )
    ),
    array(
        'label'      => 'Page 2',
        'route'      => 'default',
    ),
    array(
        'label'      => 'Page 3',
        'route'      => 'default',
    )
));

$container1 = clone $container;
$container2 = clone $container;
$container3 = clone $container;

echo $this->navigation($container1)->menu()->renderMenu($container1);
echo '<br /><hr /><br />';
echo $this->navigation($container2)->menu()->renderMenu(new Zend_Navigation($container2->findAllByLabel('Page 1.1')));
echo '<br /><hr /><br />';
echo $this->navigation($container3)->menu()->renderMenu($container3);
?>

3. Последнее, клонирование, страница на первом уровне (и глубже), которая «найдена», НЕ удаляется из контейнера

Тот же код, что и выше, только «Страница 2» вместо «Страница 1.1»

Может кто-нибудь сказать мне, что здесь происходит?

Все, чего я хочу добиться, это отображать одно и то же меню в двух разных местах. В обоих местах меню построено из части страниц контейнера, отфильтровано методом findXXX ...

Но с описанной проблемой это кажется невозможным: (

Заранее спасибо за любые предложения.

1 Ответ

1 голос
/ 01 февраля 2012

Попробуйте, вы на правильном пути, я просто думаю, что у вас проблемы с разницей между Zend_Navigation и навигацией ().

<?php
//instantiate Zend_navigation object... This also registers this container to the view      helper
$container = new Zend_Navigation(array(
    array(
        'label'   => 'Page 1',
        'route'   => 'default',
        'pages'   => array(
            array(
                'label'   => 'Page 1.1',
                'route'   => 'default',
            ),
        )
    ),
    array(
        'label'      => 'Page 2',
        'route'      => 'default',
    ),
    array(
        'label'      => 'Page 3',
        'route'      => 'default',
    )
));
//now we use the view helper
echo $this->navigation()->menu()->renderMenu($container);
echo '<br /><hr /><br />';
$label = $this->navigation()->findAllByLabel('Page 2');
echo $this->navigation()->menu()->renderMenu($label);
echo '<br /><hr /><br />';
echo $this->navigation()->menu()->renderMenu($container);
?>

лично мне нравится настраивать навигацию в начальной загрузке и использовать файлы конфигурации для создания контейнеров.

 protected function _initNavigation() {

        $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/site.xml');
        $container = new Zend_Navigation($config);
        $registry = Zend_Registry::getInstance();
        $registry->set('Zend_Navigation', $container);
    }

Надеюсь, это поможет:)

...