[原创]Zend_Controller_Action_Helper的使用
|
 
|
[原创]Zend_Controller_Action_Helper的使用
本帖最后由 seraph 于 2009-5-14 18:49 编辑
前面我说过,Zend framework的MVC一个很强大的地方就是插件机制(帮手制度),
视图有视图帮手 可以参考 http://www.phpchina.com/bbs/thread-38266-1-1.html
Zend_Controller_Front 有注册插件的机制 可以参考http://framework.zend.com/manual/zh/zend.controller.plugins.html
$this->_frontCtrl->registerPlugin(new ControllerPlugin_Test());
但是这个前端分配器的插件制度虽然太强大(如果做调测,几乎能控制Zend_Controller_Front分配url和数值传递的每一步),但是总感觉没有多大用用处;至少,我现在假象的应用场景,无法应用。
下面,要讲的是Zend_Controller_Action的插件 也可以叫Action帮手
官方定义:动作助手可以向任何Zend_Controller_Action的衍生动作控制器中,即时的加入功能(runtime and/oron-demand functionality),以使得增加公共的动作控制器功能时,尽量减少衍生动作控制器类的必要。
系统在默认状态下已经存在FlashMessenger Redirector 和ViewRenderer三个Action帮手;因为ViewRenderer做的事情太多,反而过头了,有时候我们必须
$this->_helper->viewRenderer->setNoRender(); 停止该帮手。
下面要讲的是自定义Action帮手。
利用Action帮手 首先要注册Action帮手的类名前缀
Zend_Controller_Action_HelperBroker::addPrefix('ActionHelper');
然后 在ActionHelper目录下,定义一个类(必须符合命名规则)
[php]
//这个插件,当获得一个分页的html 时候,将其中的{start}或者{next}等根据当前语言包替换成最初、下一页等
<?php
class ActionHelper_Pagehtml extends Zend_Controller_Action_Helper_Abstract{
/**
* 分页数据取得后,根据不同语言环境,替换'下一页'、'前一页'等表示
* @param array $htmls
* @param mix $_changeArray
* @throws Exception
* @return array
*/
public function changePagehtml($htmls,$_changeArray) {
if(empty($_changeArray) or empty($htmls)){
throw new Exception('Params are wrong.');
}
if($_changeArray instanceof Zend_Config_Xml){
$_changeArray = $_changeArray->page->toArray();
}
if(!is_array($_changeArray)){
throw new Exception('Param _changeArray is wrong.');
}
if(is_array($htmls)){
foreach ($htmls as $key=>$value){
if(!empty($value)){
foreach ($_changeArray as $kkey =>$vvalue){
$value = str_replace("{".$kkey."}", $vvalue, $value);
}
}
$_htmls[$key] = $value;
}
return $_htmls;
}else{
$value = $htmls;
foreach ($_changeArray as $kkey =>$vvalue){
$value = str_replace("{".$kkey."}", $vvalue, $value);
}
return $value;
}
}
}
[/php]
这样,我们就可以在Controller里直接使用
[php]
//这是一个显示users list的Action;BasicController_User_Basic 继承于Zend_Controller_Action
class Admin_UserController extends BasicController_User_Basic {
public function indexAction(){
$this->view->title = $this->_basicLangXml->menu->userlist;
$userModule = Module_User::getInstance();
if(!isset($this->_pageInfo['counts']) or empty($this->_pageInfo['counts'])){
// 分页 我们没有必要一下子取得所有的用户数据,但是我们必须知道用户总数。
$this->_pageInfo['counts'] = $userModule->getUserCounts(null,Object_User::USER);
}
//其实 这也是我的另外一个Action插件,用来返回正确的page设定数组
$pageInfoArray = $this->_helper->getHelper('Pageinfo')->getPageinfo($this->_pageInfo,'admin/user/index',5);
//利用这个page设定,就可以获得该页面需要显示的用户数据和分页的html代码
$result = $userModule->getUserDataAndHtml(null,Object_User::USER,$pageInfoArray);
if(!empty($result)){
// 这是前面求得用户数据
$this->view->users = $result['data'];
// 关键在这里。
// 根据$userModule 我们已经获得分页部分的html($result['html'])
// 但是这里面的文字还只是{start}{next}等 需要根据当前语言设置进行变换
$this->view->html = $this->_helper->getHelper('Pagehtml')->changePagehtml($result['html'],$this->_basicLangXml);
}else{
$this->view->users = null;
}
$this->render();
}
}
[/php]
Zend framework 从一开始Zend_Controller_Front开始,到Zend_Controller_Action 以及Zend_View,Zend framework都提供一套扩展机制。反正,我个人觉得这是一个很很成功的设计。尤其是常用的Zend_View_Helper ,可以省去大多我很闹心的代码copy,而且模块化之后,功能集中,利于维护。
[ 本帖最后由 qqinxl 于 2007-10-9 19:48 编辑 ] |
|
|
|
|
|
|
|