Zend Framework教程之Zend_Layout布局助手詳解,zendzend_layout_PHP教程

來源:互聯網
上載者:User

Zend Framework教程之Zend_Layout布局助手詳解,zendzend_layout


本文執行個體講述了Zend Framework教程之Zend_Layout布局助手。分享給大家供大家參考,具體如下:

一、作用

布局的作用和模版的作用類似。可以認為是把網站通用、公用的部分拿出來作為通用的頁面架構。例如一個基本的web頁面,可能頁面的頭和尾都是一樣,不一樣的可能只是內容body部分不一樣,可以把公用的部分做成模版。不僅可以提高開發效率,也為後期的維護帶來方便。

二、使用

這裡舉一個簡單的例子。

首先用zend studio建立一個基本的zend framework項目:layout_demo1

結構大概如下“

├─.settings
├─application
│ ├─configs
│ ├─controllers
│ ├─models
│ └─views
│ ├─helpers
│ └─scripts
│ ├─error
│ └─index
├─docs
├─library
├─public
└─tests
├─application
│ └─controllers
└─library

1.加入layout功能:

應用設定檔/layout_demo2/application/configs/application.ini,加入如下配置

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"resources.frontController.params.displayExceptions = 0resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"[staging : production]

2.相應的目錄和布局模版檔案 /layout_demo2/application/layouts/scripts/layout.phtml

├─application
│ ├─configs
│ ├─controllers
│ ├─layouts
│ │ └─scripts
│ ├─models
│ └─views

layout.html類似如下:

     my app         header          <?php echo $this -> layout() -> content;?>          header     

這裡的

<?php echo $this -> layout() -> content;?>

是比較重要的。表示此處為布局的內容,也就是會動態變化的地方。

這樣,運行一下程式

www.localzend.com/layout_demo1/public/

產生的html源碼如下

     my app         header           

Welcome to the Zend Framework!

This is your project's main page

Helpful Links:
Zend Framework Website | Zend Framework Manual

header

中間部分就是/layout_demo1/application/views/scripts/index/index.phtml的內容。

注入:可以通過zf的命令工具自動產生layout的配置和檔案。

命令如下:

zf enable layout

可以參考命令列章節

三、配置

1.自訂存放位置和名稱可以通過application.ini設定檔配置布局檔案的存放位置以及布局檔案的名稱,例如:

resources.layout.layoutPath = APPLICATION_PATH "/mylayouts/scripts"resources.layout.layout = "mylayout"

2.在action中使用layout對象

可以通過

$layout = $this->_helper->layout();

或者

$helper = $this->_helper->getHelper('Layout');$layout = $helper->getLayoutInstance();

擷取布局對象。

可以通過如下方式禁用當前action使用配置模式

$layout->disableLayout();

可以通過

$layout->setLayout('other');

來設定使用另一個布局檔案

可以通過來傳遞賦值

$layout->assign('headertitle', 'app title');$layout->somekey = "value"

3.其它擷取layout對象的方法

(1)

$layout = Zend_Layout::getMvcInstance();

(2)

$layout = $bootstrap->getResource('Layout');

四、其它用法,實現原理

具體其它的使用方法可以參考

Zend_Layout_Controller_Action_Helper_Layout類,
Zend_Layout_Controller_Plugin_Layout類
Zend_View_Helper_Layout類
不言自明。

<?php/** Zend_Controller_Action_Helper_Abstract */require_once 'Zend/Controller/Action/Helper/Abstract.php';/** * Helper for interacting with Zend_Layout objects * * @uses  Zend_Controller_Action_Helper_Abstract * @category Zend * @package Zend_Controller * @subpackage Zend_Controller_Action * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd  New BSD License */class Zend_Layout_Controller_Action_Helper_Layout extends Zend_Controller_Action_Helper_Abstract{ /**  * @var Zend_Controller_Front  */ protected $_frontController; /**  * @var Zend_Layout  */ protected $_layout; /**  * @var bool  */ protected $_isActionControllerSuccessful = false; /**  * Constructor  *  * @param Zend_Layout $layout  * @return void  */ public function __construct(Zend_Layout $layout = null) {  if (null !== $layout) {   $this->setLayoutInstance($layout);  } else {   /**    * @see Zend_Layout    */   require_once 'Zend/Layout.php';   $layout = Zend_Layout::getMvcInstance();  }  if (null !== $layout) {   $pluginClass = $layout->getPluginClass();   $front = $this->getFrontController();   if ($front->hasPlugin($pluginClass)) {    $plugin = $front->getPlugin($pluginClass);    $plugin->setLayoutActionHelper($this);   }  } } public function init() {  $this->_isActionControllerSuccessful = false; } /**  * Get front controller instance  *  * @return Zend_Controller_Front  */ public function getFrontController() {  if (null === $this->_frontController) {   /**    * @see Zend_Controller_Front    */   require_once 'Zend/Controller/Front.php';   $this->_frontController = Zend_Controller_Front::getInstance();  }  return $this->_frontController; } /**  * Get layout object  *  * @return Zend_Layout  */ public function getLayoutInstance() {  if (null === $this->_layout) {   /**    * @see Zend_Layout    */   require_once 'Zend/Layout.php';   if (null === ($this->_layout = Zend_Layout::getMvcInstance())) {    $this->_layout = new Zend_Layout();   }  }  return $this->_layout; } /**  * Set layout object  *  * @param Zend_Layout $layout  * @return Zend_Layout_Controller_Action_Helper_Layout  */ public function setLayoutInstance(Zend_Layout $layout) {  $this->_layout = $layout;  return $this; } /**  * Mark Action Controller (according to this plugin) as Running successfully  *  * @return Zend_Layout_Controller_Action_Helper_Layout  */ public function postDispatch() {  $this->_isActionControllerSuccessful = true;  return $this; } /**  * Did the previous action successfully complete?  *  * @return bool  */ public function isActionControllerSuccessful() {  return $this->_isActionControllerSuccessful; } /**  * Strategy pattern; call object as method  *  * Returns layout object  *  * @return Zend_Layout  */ public function direct() {  return $this->getLayoutInstance(); } /**  * Proxy method calls to layout object  *  * @param string $method  * @param array $args  * @return mixed  */ public function __call($method, $args) {  $layout = $this->getLayoutInstance();  if (method_exists($layout, $method)) {   return call_user_func_array(array($layout, $method), $args);  }  require_once 'Zend/Layout/Exception.php';  throw new Zend_Layout_Exception(sprintf("Invalid method '%s' called on layout action helper", $method)); }}
<?php/** Zend_Controller_Plugin_Abstract */require_once 'Zend/Controller/Plugin/Abstract.php';/** * Render layouts * * @uses  Zend_Controller_Plugin_Abstract * @category Zend * @package Zend_Controller * @subpackage Plugins * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd  New BSD License * @version $Id: Layout.php 23775 2011-03-01 17:25:24Z ralph $ */class Zend_Layout_Controller_Plugin_Layout extends Zend_Controller_Plugin_Abstract{ protected $_layoutActionHelper = null; /**  * @var Zend_Layout  */ protected $_layout; /**  * Constructor  *  * @param Zend_Layout $layout  * @return void  */ public function __construct(Zend_Layout $layout = null) {  if (null !== $layout) {   $this->setLayout($layout);  } } /**  * Retrieve layout object  *  * @return Zend_Layout  */ public function getLayout() {  return $this->_layout; } /**  * Set layout object  *  * @param Zend_Layout $layout  * @return Zend_Layout_Controller_Plugin_Layout  */ public function setLayout(Zend_Layout $layout) {  $this->_layout = $layout;  return $this; } /**  * Set layout action helper  *  * @param Zend_Layout_Controller_Action_Helper_Layout $layoutActionHelper  * @return Zend_Layout_Controller_Plugin_Layout  */ public function setLayoutActionHelper(Zend_Layout_Controller_Action_Helper_Layout $layoutActionHelper) {  $this->_layoutActionHelper = $layoutActionHelper;  return $this; } /**  * Retrieve layout action helper  *  * @return Zend_Layout_Controller_Action_Helper_Layout  */ public function getLayoutActionHelper() {  return $this->_layoutActionHelper; } /**  * postDispatch() plugin hook -- render layout  *  * @param Zend_Controller_Request_Abstract $request  * @return void  */ public function postDispatch(Zend_Controller_Request_Abstract $request) {  $layout = $this->getLayout();  $helper = $this->getLayoutActionHelper();  // Return early if forward detected  if (!$request->isDispatched()   || $this->getResponse()->isRedirect()   || ($layout->getMvcSuccessfulActionOnly()    && (!empty($helper) && !$helper->isActionControllerSuccessful())))  {   return;  }  // Return early if layout has been disabled  if (!$layout->isEnabled()) {   return;  }  $response = $this->getResponse();  $content = $response->getBody(true);  $contentKey = $layout->getContentKey();  if (isset($content['default'])) {   $content[$contentKey] = $content['default'];  }  if ('default' != $contentKey) {   unset($content['default']);  }  $layout->assign($content);  $fullContent = null;  $obStartLevel = ob_get_level();  try {   $fullContent = $layout->render();   $response->setBody($fullContent);  } catch (Exception $e) {   while (ob_get_level() > $obStartLevel) {    $fullContent .= ob_get_clean();   }   $request->setParam('layoutFullContent', $fullContent);   $request->setParam('layoutContent', $layout->content);   $response->setBody(null);   throw $e;  } }}
<?php/** Zend_View_Helper_Abstract.php */require_once 'Zend/View/Helper/Abstract.php';/** * View helper for retrieving layout object * * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd  New BSD License */class Zend_View_Helper_Layout extends Zend_View_Helper_Abstract{ /** @var Zend_Layout */ protected $_layout; /**  * Get layout object  *  * @return Zend_Layout  */ public function getLayout() {  if (null === $this->_layout) {   require_once 'Zend/Layout.php';   $this->_layout = Zend_Layout::getMvcInstance();   if (null === $this->_layout) {    // Implicitly creates layout object    $this->_layout = new Zend_Layout();   }  }  return $this->_layout; } /**  * Set layout object  *  * @param Zend_Layout $layout  * @return Zend_Layout_Controller_Action_Helper_Layout  */ public function setLayout(Zend_Layout $layout) {  $this->_layout = $layout;  return $this; } /**  * Return layout object  *  * Usage: $this->layout()->setLayout('alternate');  *  * @return Zend_Layout  */ public function layout() {  return $this->getLayout(); }}

更多關於zend相關內容感興趣的讀者可查看本站專題:《Zend FrameWork架構入門教程》、《php優秀開發架構總結》、《Yii架構入門及常用技巧總結》、《ThinkPHP入門教程》、《php物件導向程式設計入門教程》、《php+mysql資料庫操作入門教程》及《php常見資料庫操作技巧匯總》

希望本文所述對大家PHP程式設計有所協助。

您可能感興趣的文章:

  • Zend Framework教程之模型Model基本規則和使用方法
  • zend framework中使用memcache的方法
  • zend framework架構中url大小寫問題解決方案
  • Zend Framework 2.0事件管理器(The EventManager)入門教程
  • Zend Framework頁面緩衝執行個體
  • 非常好用的Zend Framework分頁類
  • zend Framework中的Layout(模組化得布局)詳解
  • zend framework配置操作資料庫執行個體分析
  • windows下zendframework項目環境搭建(通過命令列配置)
  • Zend Framework教程之模型Model用法簡單一實例

http://www.bkjia.com/PHPjc/1106114.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1106114.htmlTechArticleZend Framework教程之Zend_Layout布局助手詳解,zendzend_layout 本文執行個體講述了Zend Framework教程之Zend_Layout布局助手。分享給大家供大家參考,具體如...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.