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

Tags: Framework Zend_Layout

分享到: