【问题标题】:Passing url parameters to Zend_Navigation using an XML-file使用 XML 文件将 url 参数传递给 Zend_Navigation
【发布时间】:2010-11-08 11:13:53
【问题描述】:

我正在使用 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 的基本要求,我很确定我的解决方案太复杂、太昂贵,而且必须有一个“开箱即用”的更简单的解决方案。

【问题讨论】:

    标签: php zend-framework 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());
    }
    

    【讨论】:

    • 然后使用Plugin根据数据库数据动态添加Zend_Navigation_Page的
    • 你有手头的在线资源作为起点如何写这个插件?
    • 我在答案中添加了示例导航插件。也许这不是常见的方式,但我发现做任何自定义导航都非常灵活。
    • 戴蒙,非常感谢!!我将发布我的解决方案(基于您的单独发布)。我的沟通又不是很清楚了...我在数据库中没有完整的导航,但是从数据库中检索了一些动态部分,作为url参数传输并用于链接。通过您的示例,我终于可以制定出我的解决方案(顺便说一句,请随时改进)。 :-)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多