使用XML文件将url参数传递给Zend_Navigation

时间:2010-11-08 11:13:53

标签: php zend-framework zend-navigation

我正在使用Zend Framework 1.10.8。

我想在layout.phtml中创建一个breadcrumb部分。我的菜单中有一些链接包含动态网址参数,例如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 个答案:

答案 0 :(得分: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 init这个插件

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

答案 1 :(得分:1)

更新:我最终丢掉了xml文件。我现在做什么:

  • 我写了一个插件(参见Daimon的方法)
  • 在这个插件中我将导航结构配置为数组, 从Zend_Request
  • 检索动态参数
  • 然后我使用这个数组启动导航