Передача параметров URL в Zend_Navigation с использованием XML-файла - PullRequest
1 голос
/ 08 ноября 2010

Я использую Zend Framework 1.10.8.

Я хочу создать раздел крошки в файле layout.phtml.В моем меню есть несколько ссылок, которые имеют параметры динамического URL, такие как http://mydomain.com/editor/edit/id/42

Я пытаюсь выяснить, как передать id = XXX в Zend_Navigation, тогда как XXX поступает из базы данных и отличается в каждом запросе.

Одно решение, которое я нашел до сих пор, это добавление свойства, например params_id, в мое объявление xml:

в configs / navigation.xml

<pages>
   <editor>
     <label>Editor</label>
     <controller>editor</controller>
      <action>edit</action>
     <params_id>id</params_id>
     <route>default</route>  
  </editor>
 </pages>

и в цикле контроллера черезстраниц и динамическое добавление моего параметра id = 42 (в то время как 42 будет получено из объекта запроса в окончательной версии)

$pages = $this->view->navigation()->getContainer()->findAllBy('params_id','id');
            foreach ($pages as &$page) {
                $page->setParams(array(
                    'id' => 42,
                    'something_else' => 667

                ));
 }

Поскольку добавление динамических параметров URL кажется таким основным требованием для Zend_Navigation, я вполне уверен, чтомое решение слишком сложное, слишком дорогое, и должно быть гораздо более простое решение "из коробки".

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

Обновление: в конце концов я выбросил XML-файл. Что я делаю сейчас:

  • Я написал плагин (см. Подход Даймона)
  • в этом плагине я настраиваю свою структуру навигации как массив, динамические параметры извлекаются из Zend_Request
  • затем я запускаю навигацию, используя этот массив
1 голос
/ 08 ноября 2010

Это очень просто.Просто напишите в своем XML

<pages>
    <editor>
        <label>Editor</label>
        <controller>editor</controller>
        <action>edit</action>
        <params>
            <id>42</id>
            <someting_else>667</something_else>
        </params>
        <route>default</route>  
    </editor>
</pages>

Вот пример, чтобы сделать это динамически на основе данных базы данных

Сначала определите плагин загрузки навигацииНазовите файл Navigation.php и поместите его в каталог application / plugins /.Вот пример такого плагина:

class Plugin_Navigation extends Zend_Controller_Plugin_Abstract
{
    function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $view = Zend_Controller_Action_HelperBroker::getExistingHelper('ViewRenderer')->view;

        //load initial navigation from XML
        $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml','nav');
        $container = new Zend_Navigation($config);

        //get root page
        $rootPage = $container->findOneBy('sth', 'value');

        //get database data
        $data = Model_Sth::getData();

        foreach ($data as $row) {
            $rootPage->addPage(new Zend_Navigation_Page_Mvc(array(
                'module'     => 'default',
                'controller' => 'examplecontroller',
                'action'     => 'exampleaction',
                'route'      => 'exampleroute',
                'label'      => $row['some_field'],
                'params'     => array(
                    'param1' => $row['param1'],
                    'param2' => $row['param1']
                )
            )));
        }

        //pass container to view
        $view->navigation($container);
    }
}

Тогда у вас в Bootstrap init этот плагин

protected function _initNavigation() {
    Zend_Controller_Front::getInstance()->registerPlugin(new Plugin_Navigation());
}
...