首页 | PHP资讯 | 技术专栏 | 资源共享 | PHP培训 | PHP职场 | 图书 | PHP ON WIN | PHP圈子 | PHPer学习大本营
返回列表 回复 发帖

[原创]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 编辑 ]

没看明白

TOP

返回列表