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

网络编程 2021-07-05 09:10www.168986.cn编程入门
这篇文章主要介绍了Zend Framework教程之Zend_Layout布局助手用法,结合实例形式详细分析了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 = 0
resources.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类似如下

<!doctype html>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  <title>my app</title>
  <body>
   <div id="header">
    header
   </div>
   <div id="content">
    <?php echo $this -> layout() -> content;?>
   </div>
   <div id="footer">
    header
   </div>
  </body>
</html>

这里的

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

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

这样,运行一下程序

.localzend./layout_demo1/public/

生成的html源码如下

<!doctype html>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  <title>my app</title>
  <body>
   <div id="header">
    header
   </div>
   <div id="content">
    <style>
 a:link,
 a:visited
 {
  color: #0398CA;
 }
 span#zf-name
 {
  color: #91BE3F;
 }
 div#wele
 {
  color: #FFFFFF;
  background-image: url(http://framework.zend./images/bkg_header.jpg);
  width: 600px;
  height: 400px;
  border: 2px solid #444444;
  overflow: hidden;
  text-align: center;
 }
 div#more-information
 {
  background-image: url(http://framework.zend./images/bkg_body-bottom.gif);
  height: 100%;
 }
</style>
<div id="wele">
 <h1>Wele to the <span id="zf-name">Zend Framework!</span></h1>
 <h3>This is your project's main page</h3>
 <div id="more-information">
  <p><img src="http://framework.zend./images/PoweredBy_ZF_4LightBG.png" /></p>
  <p>
   Helpful Links: <br />
   <a href="http://framework.zend./">Zend Framework Website</a> |
   <a href="http://framework.zend./manual/en/">Zend Framework Manual</a>
  </p>
 </div>
</div>   </div>
   <div id="footer">
    header
   </div>
  </body>
</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类
不言自明。

<?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://.zend.)
  @license http://framework.zend./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 $_isActionControllerSuessful = 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->_isActionControllerSuessful = 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 (aording to this plugin) as Running suessfully
  
   @return Zend_Layout_Controller_Action_Helper_Layout
  /
 public function postDispatch()
 {
  $this->_isActionControllerSuessful = true;
  return $this;
 }
 /
   Did the previous action suessfully plete?
  
   @return bool
  /
 public function isActionControllerSuessful()
 {
  return $this->_isActionControllerSuessful;
 }
 /
   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://.zend.)
  @license http://framework.zend./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->getMvcSuessfulActionOnly()
    && (!empty($helper) && !$helper->isActionControllerSuessful())))
  {
   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://.zend.)
  @license http://framework.zend./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相关内容感兴趣的读者可查看本站专题《》、《》、《》、《》、《》、《》及《》

希望本文所述对大家PHP程序设计有所帮助。

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by