当前位置:首页 > CMS教程 > 其它CMS > 列表

Zend Framework教程之Zend_Layout布局助手详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-07-13 10:38:36 浏览: 评论:0 

这篇文章主要介绍了Zend Framework教程之Zend_Layout布局助手用法,结合实例形式详细分析了Layout布局的相关实现技巧,需要的朋友可以参考下。

本文实例讲述了Zend Framework教程之Zend_Layout布局助手,分享给大家供大家参考,具体如下:

一、作用

布局的作用和模版的作用类似。可以认为是把网站通用、公共的部分拿出来作为通用的页面框架。例如一个基本的web页面,可能页面的头和尾都是一样,不一样的可能只是内容body部分不一样,可以把公共的部分做成模版。不仅可以提高开发效率,也为后期的维护带来方便。

二、使用

这里举一个简单的例子。

首先用zend studio创建一个基本的zend framework项目:layout_demo1

结构大概如下“

  1. ├─.settings 
  2. ├─application 
  3. │  ├─configs 
  4. │  ├─controllers 
  5. │  ├─models 
  6. │  └─views 
  7. │      ├─helpers 
  8. │      └─scripts 
  9. │          ├─error 
  10. │          └─index 
  11. ├─docs 
  12. ├─library 
  13. ├─public 
  14. └─tests 
  15.     ├─application 
  16.     │  └─controllers 
  17.     └─library 

1.加入layout功能:

应用配置文件/layout_demo2/application/configs/application.ini,加入如下配置

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

2.相应的目录和布局模版文件 /layout_demo2/application/layouts/scripts/layout.phtml

  1. ├─application 
  2. │  ├─configs 
  3. │  ├─controllers 
  4. │  ├─layouts 
  5. │  │  └─scripts 
  6. │  ├─models 
  7. │  └─views 

layout.html类似如下:

  1. <!doctype html> 
  2. <html> 
  3.  <head> 
  4.   <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> 
  5.   <title>my app</title> 
  6.   <body> 
  7.    <div id="header"> 
  8.     header 
  9.    </div> 
  10.    <div id="content"> 
  11.     <?php echo $this -> layout() -> content;?> 
  12.    </div> 
  13.    <div id="footer"> 
  14.     header 
  15.    </div> 
  16.   </body> 
  17. </html> 

这里的

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

是比较重要的,表示此处为布局的内容,也就是会动态变化的地方。

这样,运行一下程序

www.localzend.com/layout_demo1/public/

生成的html源码如下

  1. <!doctype html> 
  2. <html> 
  3.  <head> 
  4.   <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> 
  5.   <title>my app</title> 
  6.   <body> 
  7.    <div id="header"> 
  8.     header 
  9.    </div> 
  10.    <div id="content"> 
  11.     <style> 
  12.  a:link, 
  13.  a:visited 
  14.  { 
  15.   color: #0398CA; 
  16.  } 
  17.  span#zf-name 
  18.  { 
  19.   color: #91BE3F; 
  20.  } 
  21.  div#welcome 
  22.  { 
  23.   color: #FFFFFF; 
  24.   background-image: url(http://framework.zend.com/images/bkg_header.jpg); 
  25.   width: 600px; 
  26.   height: 400px; 
  27.   border: 2px solid #444444; 
  28.   overflow: hidden; 
  29.   text-align: center; 
  30.  } 
  31.  div#more-information 
  32.  { 
  33.   background-image: url(http://framework.zend.com/images/bkg_body-bottom.gif); 
  34.   height: 100%; 
  35.  } 
  36. </style> 
  37. <div id="welcome"> 
  38.  <h1>Welcome to the <span id="zf-name">Zend Framework!</span></h1> 
  39.  <h3>This is your project's main page</h3> 
  40.  <div id="more-information"> 
  41.   <p><img src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" /></p> 
  42.   <p> 
  43.    Helpful Links: <br /> 
  44.    <a href="http://framework.zend.com/">Zend Framework Website</a> | 
  45.    <a href="http://framework.zend.com/manual/en/">Zend Framework Manual</a> 
  46.   </p> 
  47.  </div> 
  48. </div>   </div> 
  49.    <div id="footer"> 
  50.     header 
  51.    </div> 
  52.   </body> 
  53. </html> 

中间部分就是/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类

不言自明。

  1. <?php 
  2. /** Zend_Controller_Action_Helper_Abstract */ 
  3. require_once 'Zend/Controller/Action/Helper/Abstract.php'
  4. /** 
  5.  * Helper for interacting with Zend_Layout objects 
  6.  * 
  7.  * @uses  Zend_Controller_Action_Helper_Abstract 
  8.  * @category Zend 
  9.  * @package Zend_Controller 
  10.  * @subpackage Zend_Controller_Action 
  11.  * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) 
  12.  * @license http://framework.zend.com/license/new-bsd  New BSD License 
  13.  */ 
  14. class Zend_Layout_Controller_Action_Helper_Layout extends Zend_Controller_Action_Helper_Abstract 
  15.  /** 
  16.   * @var Zend_Controller_Front 
  17.   */ 
  18.  protected $_frontController
  19.  /** 
  20.   * @var Zend_Layout 
  21.   */ 
  22.  protected $_layout
  23.  /** 
  24.   * @var bool 
  25.   */ 
  26.  protected $_isActionControllerSuccessful = false; 
  27.  /** 
  28.   * Constructor 
  29.   * 
  30.   * @param Zend_Layout $layout 
  31.   * @return void 
  32.   */ 
  33.  public function __construct(Zend_Layout $layout = null) 
  34.  { 
  35.   if (null !== $layout) { 
  36.    $this->setLayoutInstance($layout); 
  37.   } else { 
  38.    /** 
  39.     * @see Zend_Layout 
  40.     */ 
  41.    require_once 'Zend/Layout.php'
  42.    $layout = Zend_Layout::getMvcInstance(); 
  43.   } 
  44.   if (null !== $layout) { 
  45.    $pluginClass = $layout->getPluginClass(); 
  46.    $front = $this->getFrontController(); 
  47.    if ($front->hasPlugin($pluginClass)) { 
  48.     $plugin = $front->getPlugin($pluginClass); 
  49.     $plugin->setLayoutActionHelper($this); 
  50.    } 
  51.   } 
  52.  } 
  53.  public function init() 
  54.  { 
  55.   $this->_isActionControllerSuccessful = false; 
  56.  } 
  57.  /** 
  58.   * Get front controller instance 
  59.   * 
  60.   * @return Zend_Controller_Front 
  61.   */ 
  62.  public function getFrontController() 
  63.  { 
  64.   if (null === $this->_frontController) { 
  65.    /** 
  66.     * @see Zend_Controller_Front 
  67.     */ 
  68.    require_once 'Zend/Controller/Front.php'
  69.    $this->_frontController = Zend_Controller_Front::getInstance(); 
  70.   } 
  71.   return $this->_frontController; 
  72.  } 
  73.  /** 
  74.   * Get layout object 
  75.   * 
  76.   * @return Zend_Layout 
  77.   */ 
  78.  public function getLayoutInstance() 
  79.  { 
  80.   if (null === $this->_layout) { 
  81.    /** 
  82.     * @see Zend_Layout 
  83.     */ 
  84.    require_once 'Zend/Layout.php'
  85.    if (null === ($this->_layout = Zend_Layout::getMvcInstance())) { 
  86.     $this->_layout = new Zend_Layout(); 
  87.    } 
  88.   } 
  89.   return $this->_layout; 
  90.  } 
  91.  /** 
  92.   * Set layout object 
  93.   * 
  94.   * @param Zend_Layout $layout 
  95.   * @return Zend_Layout_Controller_Action_Helper_Layout 
  96.   */ 
  97.  public function setLayoutInstance(Zend_Layout $layout
  98.  { 
  99.   $this->_layout = $layout
  100.   return $this
  101.  } 
  102.  /** 
  103.   * Mark Action Controller (according to this plugin) as Running successfully 
  104.   * 
  105.   * @return Zend_Layout_Controller_Action_Helper_Layout 
  106.   */ 
  107.  public function postDispatch() 
  108.  { 
  109.   $this->_isActionControllerSuccessful = true; 
  110.   return $this
  111.  } 
  112.  /** 
  113.   * Did the previous action successfully complete? 
  114.   * 
  115.   * @return bool 
  116.   */ 
  117.  public function isActionControllerSuccessful() 
  118.  { 
  119.   return $this->_isActionControllerSuccessful; 
  120.  } 
  121.  /** 
  122.   * Strategy pattern; call object as method 
  123.   * 
  124.   * Returns layout object 
  125.   * 
  126.   * @return Zend_Layout 
  127.   */ 
  128.  public function direct() 
  129.  { 
  130.   return $this->getLayoutInstance(); 
  131.  } 
  132.  /** 
  133.   * Proxy method calls to layout object 
  134.   * 
  135.   * @param string $method 
  136.   * @param array $args 
  137.   * @return mixed 
  138.   */ 
  139.  public function __call($method$args
  140.  { 
  141.   $layout = $this->getLayoutInstance(); 
  142.   if (method_exists($layout$method)) { 
  143.    return call_user_func_array(array($layout$method), $args); 
  144.   } 
  145.   require_once 'Zend/Layout/Exception.php'
  146.   throw new Zend_Layout_Exception(sprintf("Invalid method '%s' called on layout action helper"$method)); 
  147.  } 
  148.  
  149. <?php 
  150. /** Zend_Controller_Plugin_Abstract */ 
  151. require_once 'Zend/Controller/Plugin/Abstract.php'
  152. /** 
  153.  * Render layouts 
  154.  * 
  155.  * @uses  Zend_Controller_Plugin_Abstract 
  156.  * @category Zend 
  157.  * @package Zend_Controller 
  158.  * @subpackage Plugins 
  159.  * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) 
  160.  * @license http://framework.zend.com/license/new-bsd  New BSD License 
  161.  * @version $Id: Layout.php 23775 2011-03-01 17:25:24Z ralph $ 
  162.  */ 
  163. class Zend_Layout_Controller_Plugin_Layout extends Zend_Controller_Plugin_Abstract 
  164.  protected $_layoutActionHelper = null; 
  165.  /** 
  166.   * @var Zend_Layout 
  167.   */ 
  168.  protected $_layout
  169.  /** 
  170.   * Constructor 
  171.   * 
  172.   * @param Zend_Layout $layout 
  173.   * @return void 
  174.   */ 
  175.  public function __construct(Zend_Layout $layout = null) 
  176.  { 
  177.   if (null !== $layout) { 
  178.    $this->setLayout($layout); 
  179.   } 
  180.  } 
  181.  /** 
  182.   * Retrieve layout object 
  183.   * 
  184.   * @return Zend_Layout 
  185.   */ 
  186.  public function getLayout() 
  187.  { 
  188.   return $this->_layout; 
  189.  } 
  190.  /** 
  191.   * Set layout object 
  192.   * 
  193.   * @param Zend_Layout $layout 
  194.   * @return Zend_Layout_Controller_Plugin_Layout 
  195.   */ 
  196.  public function setLayout(Zend_Layout $layout
  197.  { 
  198.   $this->_layout = $layout
  199.   return $this
  200.  } 
  201.  /** 
  202.   * Set layout action helper 
  203.   * 
  204.   * @param Zend_Layout_Controller_Action_Helper_Layout $layoutActionHelper 
  205.   * @return Zend_Layout_Controller_Plugin_Layout 
  206.   */ 
  207.  public function setLayoutActionHelper(Zend_Layout_Controller_Action_Helper_Layout $layoutActionHelper
  208.  { 
  209.   $this->_layoutActionHelper = $layoutActionHelper
  210.   return $this
  211.  } 
  212.  /** 
  213.   * Retrieve layout action helper 
  214.   * 
  215.   * @return Zend_Layout_Controller_Action_Helper_Layout 
  216.   */ 
  217.  public function getLayoutActionHelper() 
  218.  { 
  219.   return $this->_layoutActionHelper; 
  220.  } 
  221.  /** 
  222.   * postDispatch() plugin hook -- render layout 
  223.   * 
  224.   * @param Zend_Controller_Request_Abstract $request 
  225.   * @return void 
  226.   */ 
  227.  public function postDispatch(Zend_Controller_Request_Abstract $request
  228.  { 
  229.   $layout = $this->getLayout(); 
  230.   $helper = $this->getLayoutActionHelper(); 
  231.   // Return early if forward detected 
  232.   if (!$request->isDispatched() 
  233.    || $this->getResponse()->isRedirect() 
  234.    || ($layout->getMvcSuccessfulActionOnly() 
  235.     && (!emptyempty($helper) && !$helper->isActionControllerSuccessful()))) 
  236.   { 
  237.    return
  238.   } 
  239.   // Return early if layout has been disabled 
  240.   if (!$layout->isEnabled()) { 
  241.    return
  242.   } 
  243.   $response = $this->getResponse(); 
  244.   $content = $response->getBody(true); 
  245.   $contentKey = $layout->getContentKey(); 
  246.   if (isset($content['default'])) { 
  247.    $content[$contentKey] = $content['default']; 
  248.   } 
  249.   if ('default' != $contentKey) { 
  250.    unset($content['default']); 
  251.   } 
  252.   $layout->assign($content); 
  253.   $fullContent = null; 
  254.   $obStartLevel = ob_get_level(); 
  255.   try { 
  256.    $fullContent = $layout->render(); 
  257.    $response->setBody($fullContent); 
  258.   } catch (Exception $e) { 
  259.    while (ob_get_level() > $obStartLevel) { 
  260.     $fullContent .= ob_get_clean(); 
  261.    } 
  262.    $request->setParam('layoutFullContent'$fullContent); 
  263.    $request->setParam('layoutContent'$layout->content); 
  264.    $response->setBody(null); 
  265.    throw $e
  266.   } 
  267.  } 
  268.  
  269. <?php 
  270. /** Zend_View_Helper_Abstract.php */ 
  271. require_once 'Zend/View/Helper/Abstract.php'
  272. /** 
  273.  * View helper for retrieving layout object 
  274.  * 
  275.  * @package Zend_View 
  276.  * @subpackage Helper 
  277.  * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) 
  278.  * @license http://framework.zend.com/license/new-bsd  New BSD License 
  279.  */ 
  280. class Zend_View_Helper_Layout extends Zend_View_Helper_Abstract 
  281.  /** @var Zend_Layout */ 
  282.  protected $_layout
  283.  /** 
  284.   * Get layout object 
  285.   * 
  286.   * @return Zend_Layout 
  287.   */ 
  288.  public function getLayout() 
  289.  { 
  290.   if (null === $this->_layout) { 
  291.    require_once 'Zend/Layout.php'
  292.    $this->_layout = Zend_Layout::getMvcInstance(); 
  293.    if (null === $this->_layout) { 
  294.     // Implicitly creates layout object 
  295.     $this->_layout = new Zend_Layout(); 
  296.    } 
  297.   } 
  298.   return $this->_layout; 
  299.  } 
  300.  /** 
  301.   * Set layout object 
  302.   * 
  303.   * @param Zend_Layout $layout 
  304.   * @return Zend_Layout_Controller_Action_Helper_Layout 
  305.   */ 
  306.  public function setLayout(Zend_Layout $layout
  307.  { 
  308.   $this->_layout = $layout
  309.   return $this
  310.  } 
  311.  /** 
  312.   * Return layout object 
  313.   * 
  314.   * Usage: $this->layout()->setLayout('alternate'); 
  315.   * 
  316.   * @return Zend_Layout 
  317.   */ 
  318.  public function layout() 
  319.  { 
  320.   return $this->getLayout(); 
  321.  } 
  322. }

Tags: Framework Zend_Layout

分享到: