如何在布局中添加动态生成的下拉菜单?php在zend框架



我想添加一个下拉菜单到我的布局。我有一份旅馆的清单。我想从下拉菜单中更改酒店,我需要在布局中保留下拉菜单。phtml。问题是酒店名单是动态的。

这是我的布局,php

我需要给<div class="floatright wid35 textaligncenter padtop5">添加一个下拉菜单

<html>
<head>
    <?php echo $this->docType(); ?>
    <?php echo $this->headTitle(); ?>
    <?php echo $this->headScript(); ?>
    <?php echo $this->headLink(); ?>
    <?php echo $this->headStyle(); ?>
</head>
<body>
<?php echo $this->render('admin/header.phtml'); ?>

<div id="contentColumns" class="columns">
    <div id="columnRight" class="column-right"></div>
    <div id="columnLeft" class="column-right">
        <div class="link-guide">
            <div id="breadcrumbs" class="floatleft wid60">
                <?php echo $this->navigation()->breadcrumbs()->setLinkLast(false)->setMinDepth(0)->render(); ?>
            </div>
            <div class="floatright wid35 textaligncenter padtop5">
            </div>
        </div>
        <div class="padding-box">
            <?php echo $this->layout()->content; ?>
        </div>
    </div>
    <div class="clear"></div>       
</div>                  
<?php echo $this->render('admin/footer.phtml'); ?>
</body>
</html>

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

所以不建议这么做。但是,您可以通过实现主控制器的_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函数。然后获得酒店列表并将其发送到view:

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

在你的布局中,你可以按照你的意愿解析它

我看到了两个问题:

  1. 在一个下拉列表中使用您的酒店列表表明您将有一个扩展Zend_Form的表单My_Form_Hotels,它接受酒店列表作为构造函数参数。

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

听起来像一个前端控制器插件可以做这项工作。由于布局资源作为插件在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转储表单。

要启用您的插件,添加到application/configs/application.ini:

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

最新更新