我想添加一个下拉菜单到我的布局。我有一份旅馆的清单。我想从下拉菜单中更改酒店,我需要在布局中保留下拉菜单。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;
在你的布局中,你可以按照你的意愿解析它
我看到了两个问题:
-
在一个下拉列表中使用您的酒店列表表明您将有一个扩展
Zend_Form
的表单My_Form_Hotels
,它接受酒店列表作为构造函数参数。 -
您应该在哪里填充酒店列表,实例化表单,并将所有这些传达给视图/布局以进行渲染?
听起来像一个前端控制器插件可以做这项工作。由于布局资源作为插件在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"