2011-05-05 87 views
1

我想添加一个下拉菜单到我的布局。 我有一个酒店列表。我想从下拉菜单中更改酒店,我需要在layout.phtml中保留该下拉菜单。 问题是酒店名单是动态的。 我可以做到这一点,这可能在Zend中,我如何在zend框架中添加一个dynamiclally生成下拉列表layout.phtml

这里是我的布局,PHTML

我需要一个下拉列表添加到<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> 
+0

实际上,该案是形式应该出现在我的所有页面, – 2011-05-05 11:20:04

回答

3

号布局文件代表的静态结构一个像页眉和页脚的页面,以及包围动态内容的所有内容。

所以这不被推荐。然而,你能解决,实施你的主控制器的_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); 
+0

为什么张贴我的想法的副本???这只是玩笑,和平;) – Iscander 2011-05-05 13:25:23

+0

:D:D:D容易...;) – 2011-05-05 13:31:59

+0

毫米.......试图理解这一点。我将能够做到这一点。感谢您的帮助球员:D :) – 2011-05-05 13:34:40

1

你可以在你的基础控制器类中创建preDispatch函数。 然后你得到酒店列表并将其发送给视图:

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

而在你的布局,如你所愿,你可以解析它。

+0

也可以把逻辑创建下拉部分​​(为干净的布局) – Iscander 2011-05-05 13:02:01

+0

为什么张贴dublicate我的答案? – 2011-05-05 13:11:09

+0

我认为引导是这个功能的错误的地方,但我可能是错的;) – Iscander 2011-05-05 13:13:19

0

在这里我看到两个问题:

  1. 在下拉使用你的酒店名单表明,你将有My_Form_Hotels延伸Zend_Form一种形式,接受酒店列表作为构造函数的参数。

  2. 你应该在哪里填充酒店列表,实例化窗体,并将所有这些信息传递给视图/布局进行渲染?

听起来像front controller plugin会做这项工作。由于布局资源作为插件在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"