Zend framework 如何在zend framework中向layout.phtml添加动态生成下拉列表

Zend framework 如何在zend framework中向layout.phtml添加动态生成下拉列表,zend-framework,Zend Framework,我想在布局中添加一个下拉菜单。 我有一张旅馆的名单。我想从下拉列表中更改酒店,我需要将该下拉列表保留在layout.phtml中。 问题是酒店列表是动态的。 我能这样做吗,在zend这可能吗 这是我的布局,phtml 我需要在 否。布局文件表示页面的静态结构,如页眉和页脚以及围绕动态内容的所有内容 所以这是不推荐的。但是,您可以解决实现主控制器的\u init方法并使用该主控制器扩展任何控制器的问题: class MainController extends Zend_Action_Contro

我想在布局中添加一个下拉菜单。 我有一张旅馆的名单。我想从下拉列表中更改酒店,我需要将该下拉列表保留在layout.phtml中。 问题是酒店列表是动态的。 我能这样做吗,在zend这可能吗

这是我的布局,phtml

我需要在


否。布局文件表示页面的静态结构,如页眉和页脚以及围绕动态内容的所有内容

所以这是不推荐的。但是,您可以解决实现主控制器的
\u init
方法并使用该主控制器扩展任何控制器的问题:

class MainController extends Zend_Action_Controller{

    function init(){
        $this->view->foo = "Show everywhere!";
    }
}

class IndexController extends MainController{

    public function indexAction(){
        $this->view->bar = "Show only on index/index";
    }
}
或者你可以使用一个插件,这将是更优雅的方式

class MyPlugin extends Zend_Controller_Plugin_Abstract{

    public function preDispatch(Zend_Controller_Request_Abstract $request){

        $view = Zend_Controller_Action_HelperBroker::
                      getStaticHelper('viewRenderer')->view;

        $view->foo = "bar";
    }
}
在你的引导过程中注册这个插件

Zend_Controller_Front::getInstance()->registerPlugin(new MyPlugin);

不可以。布局文件表示页面的静态结构,如页眉和页脚以及围绕动态内容的所有内容

所以这是不推荐的。但是,您可以解决实现主控制器的
\u init
方法并使用该主控制器扩展任何控制器的问题:

class MainController extends Zend_Action_Controller{

    function init(){
        $this->view->foo = "Show everywhere!";
    }
}

class IndexController extends MainController{

    public function indexAction(){
        $this->view->bar = "Show only on index/index";
    }
}
或者你可以使用一个插件,这将是更优雅的方式

class MyPlugin extends Zend_Controller_Plugin_Abstract{

    public function preDispatch(Zend_Controller_Request_Abstract $request){

        $view = Zend_Controller_Action_HelperBroker::
                      getStaticHelper('viewRenderer')->view;

        $view->foo = "bar";
    }
}
在你的引导过程中注册这个插件

Zend_Controller_Front::getInstance()->registerPlugin(new MyPlugin);

您可以在基本控制器类中创建preDispatch函数。 然后,您将获得酒店列表并将其发送至查看:

$this->view->hotels = $hotels;

在布局中,您可以根据需要对其进行解析。

您可以在基本控制器类中创建preDispatch函数。 然后,您将获得酒店列表并将其发送至查看:

$this->view->hotels = $hotels;
在您的布局中,您可以根据需要解析它。

我在这里看到两个问题:

  • 在下拉列表中使用您的酒店列表表明,您将有一个表单
    My_form_Hotels
    扩展
    Zend_form
    ,它接受酒店列表作为构造函数参数

  • 您应该在哪里填充酒店列表,实例化表单,并将所有这些信息传达给视图/布局进行渲染

  • 听起来像是一个很好的解决方案。由于布局资源作为插件在
    postDispatch()
    中运行较晚,因此您需要在此之前运行自己的插件<代码>dispatchLoopStartup()应该可以

    library/My/Plugin/HotelForm.php
    中类似的内容:

    class My_Plugin_HotelForm extends Zend_Controller_Plugin_Abstract
    {
        public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
        {
            $hotelModel = new My_Model_Hotel();
            $hotels = $hotelModel->getAllHotels();
            $form = new My_Form_Hotels($hotels);
            $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
            $view = $viewRenderer->getView();
            $view->hotelForm = $form;
        }
    }
    
    然后在布局中,只需使用
    $this->hotelForm
    转储表单即可

    要启用插件,请添加到
    应用程序/configs/application.ini

    autoloaderNamespaces[] = 'My_"
    resources.frontcontroller.plugins[] = "My_Plugin_HotelForm"
    
    我在这里看到两个问题:

  • 在下拉列表中使用您的酒店列表表明,您将有一个表单
    My_form_Hotels
    扩展
    Zend_form
    ,它接受酒店列表作为构造函数参数

  • 您应该在哪里填充酒店列表,实例化表单,并将所有这些信息传达给视图/布局进行渲染

  • 听起来像是一个很好的解决方案。由于布局资源作为插件在
    postDispatch()
    中运行较晚,因此您需要在此之前运行自己的插件<代码>dispatchLoopStartup()应该可以

    library/My/Plugin/HotelForm.php
    中类似的内容:

    class My_Plugin_HotelForm extends Zend_Controller_Plugin_Abstract
    {
        public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
        {
            $hotelModel = new My_Model_Hotel();
            $hotels = $hotelModel->getAllHotels();
            $form = new My_Form_Hotels($hotels);
            $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
            $view = $viewRenderer->getView();
            $view->hotelForm = $form;
        }
    }
    
    然后在布局中,只需使用
    $this->hotelForm
    转储表单即可

    要启用插件,请添加到
    应用程序/configs/application.ini

    autoloaderNamespaces[] = 'My_"
    resources.frontcontroller.plugins[] = "My_Plugin_HotelForm"
    

    事实上,情况是表单应该出现在我的所有页面中,事实上,情况是表单应该出现在我的所有页面中,您也可以将创建下拉列表的逻辑设置为部分(用于干净的布局)为什么要发布我的答案的副本?我认为引导是这个函数的错误位置,但我可能是错误的;)您还可以将创建下拉列表的逻辑设置为部分(用于干净的布局)为什么要发布我的答案的副本?我认为引导是这个函数的错误位置,但我可能错了;)嗯。。。。。。。试图理解这一点。我能做到这一点。谢谢你们的帮助,伙计们:D:)嗯。。。。。。。试图理解这一点。我能做到这一点。谢谢你们的帮助,伙计们:D:)