2010-11-08 3 views
1

Я использую Zend Framework 1.10.8.Передача параметров url в Zend_Navigation с использованием XML-файла

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

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

Одно из решений, которое я нашел до сих пор, заключается в добавлении свойства, например. params_id к моему XML декларации:

в конфиги/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 я совершенно уверен, что мое решение слишком затруднит, слишком дорого, и там должно быть много проще решение «из коробки» ,

ответ

1

Это очень просто. Просто напишите в вашем 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 инициализации этот плагин

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

... 42 и 667 просто означало, как, например, идентификаторы приходят из базы данных .. – herrjeh42

+0

Затем с помощью плагина для динамического добавления Zend_Navigation_Page на основе данных базы данных – Daimon

+0

у вас есть интернет-ресурс от руки как отправной точки, как написать этот плагин? – herrjeh42

1

An обновление: Я, наконец, в конечном итоге выбрасывая файл XML. Что мне теперь делать:

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