没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Zend Framework教程之教程之Zend_Helpers动作助手动作助手ViewRenderer用用
法详解法详解
主要介绍了Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法,结合实例形式较为详细的分析了
Zend_Helpers动作助手ViewRenderer的功能、使用方法与相关注意事项,需要的朋友可以参考下
本文实例讲述了Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法。分享给大家供大家参考,具体如下:
MVC结构中视图层和控制器的解耦,以及渲染。往往是重复或者冗余的工作。如果一个完善的框架,对MVC的使用,必定会对这些操
作进行合理的设计。让开发者更专注内容而不是控制逻辑结构本身。在ZendFramework中,主要是通过动作助手ViewRenderer来完成
这个操作的。ViewRenderer 自动的完成在控制器内建立视图对象并渲染视图的过程;
ViewRenderer
介绍介绍
视图解析(ViewRenderer)助手为实现下列目标设计:
不需要在控制器内创建视图对象实例;视图对象将在控制器内自动注册。
根据当前的模块自动地设置视图脚本、助手、过滤器路径。指派当前的模块名为助手和过滤器类的类名前缀。
为所有分发的控制器和动作创建全局有效的视图对象。
允许开发人员为所有控制器设置默认的视图解析选项。
加入无需干预自动解析试图脚本的功能。
允许开发人员为视图基路径和视图脚本路径创建自己的规范。
Note: 如果手动执行_forward()、redirect、或者render时,不会发生自动解析。因为执行这些动作时,等于告诉ViewRenderer,你要自
己确定输出结果。
Note: ViewRenderer助手默认启用。
你可以通过前端控制器的noViewRenderer方法、设定参数($front->setParam('noViewRenderer', true))或者从助手经纪人栈(helper
broker stack)中移除助手(Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer'))等方式禁用该助手。
如希望在分发前端控制器前修改ViewRenderer设定,可采用下面的两种方法:
创建实例并注册自己的ViewRenderer对象,然后传入到助手经纪人。
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
$viewRenderer->setView($view)
->setViewSuffix('php');
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
通过助手经纪人即时的初始化并/或获取ViewRenderer对象。
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->setView($view)
->setViewSuffix('php');
API
大多数使用中,只需要简单的创建 ViewRenderer对象,然后传入到动作助手经纪人。创建实例并注册的最简单方式是使用助手经纪人
的getStaticHelper()方法:
Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
动作控制器第一次实例化时,会触发ViewRenderer创建一个视图对象。动作控制器每次实例化都会调用ViewRenderer的init()方法,设
定动作控制器的视图属性,并以相对于当前模块的路径为参数调用addScriptPath()方法;调用时带有以当前模块命名的类前缀参数,
该参数对为该模块定义的所有助手和过滤器类都有效。(this will be called with a class prefix named after the current module,
effectively namespacing all helper and filter classes you define for the module. )
每次执行postDispatch()方法,它将为当前动作执行render()方法。
例如这个类:
// A controller class, foo module:
class Foo_BarController extends Zend_Controller_Action
{
// Render bar/index.phtml by default; no action required
public function indexAction()
{
}
// Render bar/populate.phtml with variable 'foo' set to 'bar'.
// Since view object defined at preDispatch(), it's already available.
public function populateAction()
{
$this->view->foo = 'bar';
}
}
...
// in one of your view scripts:
$this->foo(); // call Foo_View_Helper_Foo::foo()
ViewRenderer也定义了大量的访问器用来设定和获取视图选项。
setView($view)可以为ViewRenderer设定视图对象。以公共类属性$view获取设定值。
setNeverRender($flag = true)可以全局的启用或禁用自动解析,也就是对所有控制器都有效。如果设定为true,在所有控制器器
内,postDispatch()将不会自动调用render()。getNeverRender()返回当前的设定值。
setNoRender($flag = true) 用来启用或禁用自动解析,如果设置为true,在当前控制器内,postDispatch()不会调用render()方法。这个
设定在preDispatch()每次执行时会被重置。getNoRender()返回当前的设定值。
setNoController($flag = true)通知render()不要再到以控制器命名的子目录中寻找视图脚本。getNoController()返回当前值。
setNeverController($flag = true)与setNoController($flag = true)相似,但是其在全局范围内有效——也就是说,它不会在每次分发动作
时重置。getNeverController()返回当前值。
setScriptAction($name)用来指定解析的视图脚本。$name是脚本的名字去掉后缀(不带控制器子目录,除非noController已开启)。如果
没有指定,它将寻找以请求对象中的动作命名的视图脚本。getScriptAction()返回当前值。
setResponseSegment($name)用来指定解析到响应对象中的哪个命名片段。如果没有指定,解析到默认片断。
getResponseSegment()返回当前值。
initView($path, $prefix, $options)可以指定视图的基路径,为助手和过滤器脚本设置类前缀,设定ViewRenderer选项。可以传入以下
任意的标志:neverRender,noRender,noController, scriptAction,和responseSegment。
setRender($action = null, $name = null, $noController = false)可以一次设定scriptAction、responseSegment和noController。 direct()
是它的别名,使得控制器中可以方便的调用。
// Render 'foo' instead of current action script
$this->_helper->viewRenderer('foo');
// render form.phtml to the 'html' response segment, without using a
// controller view script subdirectory:
$this->_helper->viewRenderer('form', 'html', true);
Note: setRender() 和 direct()并不会实际解析视图脚本,而是提示postDispatch()和postDispatch()解析视图。
构造函数允许可选的传入参数视图对象和ViewRenderer选项,接受与initView()一样的标志(flags):
$view = new Zend_View(array('encoding' => 'UTF-8'));
$options = array('noController' => true, 'neverRender' => true);
$viewRenderer =
new Zend_Controller_Action_Helper_ViewRenderer($view, $options);
还有几个额外的方法用来定制路径规则,供确定视图基路径来增加视图对象,确定视图脚本路径查找并解析视图脚本时使用。这些方
法每个都带有下面一个或更多的占位符(placehodlers)。
:moduleDir 引用当前模块的基目录(常规的是模块的控制器目录的父目录)。
:module 引用当前的模块名。
:controller 引用当前的控制器名。
:action引用当前的模块名。
:suffix 引用当前的视图脚本后缀(可以通过setViewSuffix()来设置)。
控制器路径规则有关的方法:
setViewBasePathSpec($spec)可以改变确定加入到视图对象的基路径的路径规则。默认规则是:moduleDir/views。任何时候都可以使
用getViewBasePathSpec()获取当前的规则。
setViewScriptPathSpec($spec)允许改变确定到达单独的视图脚本路径(去除试图脚本基路径)的路径规则。默认的路径规则是
:controller/:action.:suffix。任何时候都可以通过getViewScriptPathSpec()获取当前规则。
setViewScriptPathNoControllerSpec($spec)允许改变 noController有效时确定到达单独的视图脚本路径(去除试图脚本基路径)的路径规
则。默认的规则是:action.:suffix,任何时候都可以通过getViewScriptPathNoControllerSpec()获取当前规则。
为在路径规范之上精心设计的控制,可以使用Zend_Filter_Inflector。深入地,视图解析器(ViewRenderer)已经使用inflector来执行
路径映射。为和inflector互动 - 或者设置你自己的或者修改缺省的inflector,下面的方法可以被使用:
getInflector() 将获取inflector。如果在视图解析器中不存在, 它用缺省的规则创建一个。
缺省地,它用静态规则引用和静态目标做为后缀和模块目录;这允许不同的视图解析器具备动态修改inflector能力的属性。
setInflector($inflector, $reference) 允许设置定制的inflector和视图解析器一起使用。如果$reference 是true,它将设置后缀和模块目录
作为静态引用和目标给视图解析器 属性。
Note: 缺省查找约定(Conventions)
视图解析器做了一些路径标准化使视图脚本查找更容易。缺省规则如下:
:module: 混合词和驼峰词被短横线分开,并整个串变成小写。例如:"FooBarBaz" 变成 "foo-bar-baz"。
在内部,变形器(inflector) 使用过滤器Zend_Filter_Word_CamelCaseToDash 和 Zend_Filter_StringToLower。
:controller: 混合词和驼峰词被短横线分开;下划线转换成目录分隔符,并且整个串变小写。例如:"FooBar" becomes "foo-bar";
"FooBar_Admin" 变成 "foo-bar/admin".
在内部,inflector 使用过滤器Zend_Filter_Word_CamelCaseToDash、Zend_Filter_Word_UnderscoreToSeparator 和
Zend_Filter_StringToLower。
:action: 混合词和驼峰词被短横线分开;非字母数字字符翻译成短横线,并且整个串变成小写。 例如 "fooBar" 变成 "foo-bar"; "foo-
barBaz" 变成 "foo-bar-baz"。
在内部,inflector 使用过滤器 Zend_Filter_Word_CamelCaseToDash、Zend_Filter_PregReplace 和 Zend_Filter_StringToLower。
视图解析器 API中的最后一项是关于实际确定视图脚本路径和解析视图的。包括:
renderScript($script, $name)允许解析指定路径的脚本,可选的命名的路径片段。(renderScript($script, $name) allows you to render a
script with a path you specify, optionally to a named path segment. )使用该方法时,ViewRenderer不会自动的确定脚本名称,而是直
接的向视图对象的render()传入$script参数。
Note: 当视图已经被解析到响应对象,将会设置noRender阻止相同的脚本被多次解析。
Note: 默认的,Zend_Controller_Action::renderScript()代理ViewRenderer的renderScript()方法。
getViewScript($action, $vars)基于传入的动作和/或$vars中的变量创建到视图脚本的路径。该数组中的键可以包含所有的路径指定键
('moduleDir','module', 'controller', 'action', and 'suffix')。传入的任何变量都会优先使用,否则利用基于当前请求的值。
getViewScript()根据noController标志的设定值使用viewScriptPathSpec或者viewScriptPathNoControllerSpec。
模块、控制器以及动作中的单词定界符将后替换成短线('-')。因此,控制器名称'foo.bar'和动作'baz:bat'按照默认的路径规则将会得到视
图脚本路径'foo-bar/baz-bat.phtml'。
Note: 默认的,Zend_Controller_Action::getViewScript()代理ViewRenderer的getViewScript()方法。
render($action, $name, $noController)首先检查$name或 $noController参数是否传入,如果传入,则在ViewRenderer中设定相应的标
志(分别是响应片段和noController)。然后传入$action参数到getViewScript(),最后传入计算的试图脚本路径到renderScript()。
Note: 注意使用render()的边际效应:传入的响应片段名称和noController标志在视图对象中存留。此外解析结束后noRender会被设
置。
Note: 默认的,Zend_Controller_Action::render()代理 ViewRenderer的render()方法。
renderBySpec($action, $vars, $name)允许传入路径规则变量以确定创建的视图脚本路径。它把$action和$vars传入到
getScriptPath(),将脚本路径结果和$name传入到renderScript()。
基础用法示例基础用法示例
Example #9 基本用法
大多数基础使用中,只需在bootstrap中使用助手经纪人简单的初始化和注册ViewRenderer 助手,然后在动作方法中设置变量。
// In your bootstrap:
Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
...
// 'foo' module, 'bar' controller:
class Foo_BarController extends Zend_Controller_Action
{
// Render bar/index.phtml by default; no action required
public function indexAction()
{
}
// Render bar/populate.phtml with variable 'foo' set to 'bar'.
// Since view object defined at preDispatch(), it's already available.
public function populateAction()
{
$this->view->foo = 'bar';
}
// Renders nothing as it forwards to another action; the new action
// will perform any rendering
public function bazAction()
{
$this->_forward('index');
}
// Renders nothing as it redirects to another location
public function batAction()
{
$this->_redirect('/index');
}
}
Note: 命名规则:控制器和动作名中的单词定界符
如果控制器或者动作名称由几个单词组成,分发器要求在URL中使用特定的路径和单词定界符分隔。ViewRenderer创建路径时将控制
剩余14页未读,继续阅读
资源评论
weixin_38537050
- 粉丝: 7
- 资源: 955
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 员工培训需求调查问卷.doc
- 如何确定针对性的培训需求.doc
- 素质能力培训需求分析模型.doc
- 怎样进行有效的培训需求分析(doc 9).doc
- 制造业各工位培训需求.doc
- 做好培训需求分析,奠定企业员工培训的基础(DOC 8页).doc
- SQLSERVER2005卸载方法word文档doc格式最新版本
- MicrosoftSQLServer2008安装和数据库实例创建操作手册doc版冯冰最新版本
- 西电微机原理实验PDF
- P6ProfessionalSetup R24.12 安装包
- MicrosoftSQLServer2008数据库安装图解集合[特别整理版]最新版本
- 含光伏的储能选址定容模型 14节点 程序采用改进粒子群算法,对分析14节点配网系统中的储能选址定容方案,并得到储能的出力情况,有相关参考资料 这段程序是一个粒子群算法(Particle Swarm O
- PROGPPCNEXUS读写烧录刷写软件 飞思卡尔MPC55xx 56xx 57xx 58xx 没有次数限制
- 01_python_基本语法_纯图版.pdf
- 考虑新能源消纳的火电机组深度调峰策略 摘要:本代码主要做的是考虑新能源消纳的火电机组深度调峰策略,以常规调峰、不投油深度调峰、投油深度调峰三个阶段,建立了火电机组深度调峰成本模型,并以风电全额消纳为前
- EV3100电梯专用变频器源代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功