您的位置:首页 > 编程语言 > PHP开发

zend framework layout(页面布局)切换器

2010-05-25 12:54 295 查看
zend framework 框架的 MVC 组件很强大,很好用。Zend_Layout 组件提供对页面布局的支持,往往一个网站都有着统一的页面布局,例如头部(包含LOGO,导航菜单,用户状态信息等),主部(页面的主要内容),尾部(一般包括版权信息)。但也有可能因为不同的功能模块,页面的结构布局会不同,例如前台的布局与后台管理的页面布局可能是不一样的,或者前台的新闻页面布局与会员中心的页面布局是不一样的。

所以为了提供方便的对不同的功能模块提供不同的页面布局控制,我写了一个layout切换插件,可以为不同的模块(module)、控制器(controller)、活动(action)配置不同的布局。

使用说明:

使用这个布局切换器,只需要配置布局影射即可,配置的参数结构是一个数组结构,例如要为admin模块设定为使用布局 adminLayout,则配置如下:

array(

'admin' => 'adminLayout'

)

也可以这样写:

array(

'admin' => array('layout' => 'adminLayout')

)

以上两个配置是一样的。如果要为admin模块的user控制器(controller)设定使用另一个布局 userLayout,则可以这样配置:

array(

'admin' => array(

'layout' => 'adminLayout', // 当没有匹配到控制器时,使用该布局

'controllers' => array(

'user' => 'userLayout'

)

)

)

以上这个配置,当进入到模块admin的user控制器时,则使用userLayout布局,否则如果进入模块admin的其它控制器,则使用 adminLayout布局。以上的配置也可写成如下这样:

array(

'admin' => array(

'layout' => 'adminLayout', // 当没有匹配到控制器时,使用该布局

'controllers' => array(

'user' => array('layout' => 'userLayout')

)

)

)

配置匹配动作(action)也是一样的道理,如让admin模块的user控制器的profile动作使用 profileLayout 布局,则配置如下:

array(

'admin' => array(

'controllers' => array(

'actions' => array(

'profile' => 'profileLayout'

)

)

)

)

使用示例:

$options = array(

'admin' => 'adminLayout' // 为模块 admin 配置布局为 adminLayout

'user' => array(

'controllers' => array(

'profile' => 'profileLayout', // 为模块user的控制器profile配置布局为profileLayout

'account' => array('layout' => 'accountLayout') // 为模块user的控制器account配置布局为 accountLayout

)

),

'shop' => array(

'controllers' => array(

'product' => array(

'actions' => array(

'detail' => 'detailLayout', // 为模块shop的控制器product的detail动作配置布局为 detailLayout

'list' => 'listLayout' // action的布局指定只能是字符串,不能用 array('layout'=>'layoutName')的形式

)

)

)

)

);

Zend_Front::getInstance()->registerPlugin(new Jans_Controller_Plugin_LayoutSwitcher($options));

布局切换器插件的代码如下:

<?php
/**
* LayoutSwitcher
*
* 布局切换器可以用于根据不同的模块(module)来使用不同的页面布局(layout),
* 也可以根据不同的控制器(controller)或动作(action)来选择页面布局。
*
* @package Jans_Controller_Plugin
* @copyright JANS Studio (http://www.JANSt.com)
* @author Jacky
*
*/
class Jans_Controller_Plugin_LayoutSwitcher extends Zend_Controller_Plugin_Abstract {
/**
* @var $_mapping array
*/
protected $_mapping;
function __construct($mapping = array()) {
$this->setLayoutMapping($mapping);
}
/**
* 设置layout影射
*
* @param array $mapping
*/
public function setLayoutMapping(array $mapping) {
if (!is_array($mapping)) {
throw new Exception('参数必须是数组');
}
$this->_mapping = $mapping;
}
public function preDispatch($request) {
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
$layout = null;
if (!isset($this->_mapping[$module])) {
return;
}
$moduleMapping = $this->_mapping[$module];
$layoutInstance = Zend_Layout::getMvcInstance();
if (is_string($moduleMapping)) {
$layoutInstance->setLayout($moduleMapping);
} elseif (isset($moduleMapping['layout'])) {
$layout = $moduleMapping['layout'];
if (!isset($moduleMapping['controllers']) || !isset($moduleMapping['controllers'][$controller])) {
$layoutInstance->setLayout($layout);
return;
}
$controllerMapping = $moduleMapping['controllers'][$controller];
if (is_string($controllerMapping)) {
$layoutInstance->setLayout($controllerMapping);
return;
} elseif (isset($controllerMapping['layout'])) {
$layout = $controllerMapping['layout'];
}
if (!isset($controllerMapping['actions']) || !isset($controllerMapping['actions'][$action])) {
$layoutInstance->setLayout($layout);
return;
}
$layoutInstance->setLayout($controllerMapping['actions'][$action]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: