1. 程式人生 > >zend framework 如何在整體佈局中嵌入個區域性佈局?

zend framework 如何在整體佈局中嵌入個區域性佈局?

如何在整體佈局中嵌入個區域性佈局?

玩zend framework有一年半了,經常沒事時去解析它的原始碼,也因此對MVC模式的設計實現有了更深瞭解,同時在技術應用上也產生了些想法。之前覺認為Zend framework在佈局應用上只能使用個佈局模板,但在經過對程式碼的分析,找到了一個可以使用整體佈局中巢狀一個區域性佈局。

如上圖所示,對於整體佈局即導航欄,它是所有模組中檢視都要出現在,左側的“產品分類”和“最新產品”希望它能夠在點選它們下面的連結時下面右側對應相應ACTION的檢視能夠正常出面,這樣我們在保用整體佈局的同時也用到了區域性的佈局。

實現程式碼如下:

下面為對應controller的檔案程式碼:

class Product_IndexController extends Zend_Controller_Action
{
	public $product_layout;
	
	public function init()
	{
		$product_layout = new Zend_Layout();//區域性佈局的Zend_Layout
		$product_layout->setLayoutPath(APPLICATION_PATH.'/modules/product/layouts/scripts/');//設定區域性佈局的指令碼的位置			$product_layout->setLayout('index'); //區域性佈局模板檔名
		
		$this->product_layout = $product_layout;
		
      		$product_category = new Application_Model_ProductCategoryModel();
		$product = new Application_Model_ProductModel();
        	$this->view->product_category = $product_category;
        	$this->view->product = $product;
	}
	
    public function indexAction ()
    {
		$this->view->test = 123;
    }
    
    public function showAction()
    {
    	$this->view->test = 'show';
    }
 
    
    public function postDispatch()
    {
    	$controller = $this->_request->getControllerName();
    	$action = $this->_request->getActionName();
    	$content = array('content'=>$this->view->render('/'.$controller.'/'.$action.'.phtml'));
    	$this->product_layout->assign($content);
    	$this->_response->setBody($this->product_layout->render());
    	$viewRenderer = Zend_Controller_Action_HelperBroker::getExistingHelper('viewRenderer');
    	$viewRenderer->setNoRender(true);
    }
}

下面對應佈局指令碼:

<div class="content-left">
	<div class="product-category">
		<div class="product-category-header">產品分類</div>
		<div>
		<ul class="product-category-list">
		<?php 
		$this->product_category->reset();
		if (!$this->product_category->isEmpty()){
			do {
				echo '<li><a href="#">'.$this->product_category.'(?)</a></li>';
			}while ($this->product_category->next());
		}
		?>
		</ul>
		</div>
	</div>	
	<div class="product-new">
		<div class="product-new-header">最新產品</div>
		<div>
		<ul class="product-new-list">
		<?php 
		$this->product->loadNewProductsData();
		if (!$this->product->isEmpty()){
			do {
				echo '<li><a href="'.$this->url(array('module'=>'product','controler'=>'index','action'=>'show'),null,true).'">'.$this->product->product_name.'</a></li>';
			}while ($this->product->next());			
		}		
		?>
		</ul>		
		</div>
	</div>	
</div>
<div class="content-right">
<?=$this->layout()->content ?>
</div>

下面為對應的action檢視指令碼

<?php
echo $this->test;

以上程式碼能夠實現整體佈局裡嵌入區域性佈局。

好睏呀!望高手指教。