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


Posted in PHP onMarch 04, 2016

本文实例讲述了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;?>

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

这样,运行一下程序

www.localzend.com/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#welcome
 {
  color: #FFFFFF;
  background-image: url(http://framework.zend.com/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.com/images/bkg_body-bottom.gif);
  height: 100%;
 }
</style>
<div id="welcome">
 <h1>Welcome 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.com/images/PoweredBy_ZF_4LightBG.png" /></p>
  <p>
   Helpful Links: <br />
   <a href="http://framework.zend.com/">Zend Framework Website</a> |
   <a href="http://framework.zend.com/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://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();
 }
}

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

PHP 相关文章推荐
php在window iis的莫名问题的测试方法
May 14 PHP
php curl获取网页内容(IPV6下超时)的解决办法
Jul 16 PHP
thinkphp数据查询和遍历数组实例
Nov 28 PHP
php将字符串全部转换成大写或者小写的方法
Mar 17 PHP
php中判断数组相等的方法以及数组运算符介绍
Mar 30 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
May 13 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
Mar 07 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
php简单实现数组分页的方法
Apr 30 PHP
PHP中file_put_contents追加和换行的实现方法
Apr 01 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
php实现对文件压缩简单的方法
Sep 29 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
Mar 04 #PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 #PHP
PHP生成和获取XML格式数据的方法
Mar 04 #PHP
PHP使用fopen与file_get_contents读取文件实例分享
Mar 04 #PHP
PHP截取IE浏览器并缩小原图的方法
Mar 04 #PHP
zend framework中使用memcache的方法
Mar 04 #PHP
PHP结合Mysql数据库实现留言板功能
Mar 04 #PHP
You might like
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
基于laravel where的高级使用方法
2019/10/10 PHP
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
js 动态为textbox添加下拉框数据源的方法
2014/04/24 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
2016/12/25 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
2019/01/09 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
python 读写、创建 文件的方法(必看)
2016/09/12 Python
python实现随机梯度下降法
2020/03/24 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
Python如何实现爬取B站视频
2020/05/20 Python
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
库房管理员岗位职责
2014/03/09 职场文书
党员承诺书内容
2014/03/26 职场文书
爱护公物演讲稿
2014/09/09 职场文书
青春飞扬演讲稿
2014/09/11 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
Python 数据结构之十大经典排序算法一文通关
2021/10/16 Python
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫