找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1845|回复: 0
打印 上一主题 下一主题

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

[复制链接]

2617

主题

2617

帖子

7789

积分

论坛元老

Rank: 8Rank: 8

积分
7789
跳转到指定楼层
楼主
发表于 2018-2-14 05:38:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            本文实例讲述了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类似如下:

  
  my app
  
   
    header
   
   
     layout() -> content;?>
   
   
    header
   
  

这里的
layout() -> content;?>
是比较重要的。表示此处为布局的内容,也就是会动态变化的地方。
这样,运行一下程序
www.localzend.com/layout_demo1/public/
生成的html源码如下

  
  my app
  
   
    header
   
   
   
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%;
}
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类
不言自明。
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));
}
}
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;
  }
}
}
_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多模块多布局配置
  • zend Framework中的Layout(模块化得布局)详解
  • Zend Framework教程之Autoloading用法详解
  • Zend Framework教程之Loader以及PluginLoader用法详解
  • Zend Framework教程之配置文件application.ini解析
  • Zend Framework教程之Application和Bootstrap用法详解
  • Zend Framework教程之资源(Resources)用法实例详解
  • Zend Framework教程之Bootstrap类用法概述
  • Zend Framework自定义Helper类相关注意事项总结
  • Zend Framework教程之Application用法实例详解
  • Zend Framework+smarty用法实例详解
  • Zend Framework连接Mysql数据库实例分析
  • Zend Framework基本页面布局分析
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端