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));
布局切换器插件的代码如下:
所以为了提供方便的对不同的功能模块提供不同的页面布局控制,我写了一个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]); } } }
相关文章推荐
- Hexo博客实现首页和子页面不同layout布局
- Androd Studio layout页面布局无法预览
- JSP页面的统一布局(Layout)与外观(Look and Feel)
- express 4.14.1版本 npm版本3.10.10版本下 没有layout.js文件的解决方法 页面布局设置的方法
- express 4.X.X版本 npm版本3.X.X版本以上 没有layout.js文件的解决方法 页面布局设置的方法
- 自定义FlexibleLayout动态加载页面布局实现标题与内容分离
- 能展示不同页面的加载LoadingLayout布局
- Ext的layout页面布局解析[转]
- Zend Framework教程之Zend_Layout布局助手详解
- easyui layout布局的根据浏览器页面大小自动调整大小
- 响应式WEB页面布局插件——XMlayout.js
- 【小结】Zend Framework Quick Start 之Create A Layout
- ExtJs 入门教程十六[页面布局:Layout]
- Mvc4 Layout布局与页面SEO信息title,keyword,description
- Adobe的文字布局框架TextLayout Framework
- TabLayout+ViewPager+Fragment主页面布局
- TabLayout 和ViewPager和Fragment的多页面滑动(主要实现一个水平的布局用来展示Tabs加上ViewPager实现联动效果)
- Android页面布局优化之ConstraintLayout
- 表格布局TableLayout ——实现商品浏览页面
- App FrameWork框架的页面布局