对控制层(control)扩展

2014-09-01 15:13:29
王春生
30892
最后编辑:王春生 于 2014-09-01 16:50:47
简介:对现有模块的control层的扩展有两种,一种是覆盖现有的方法,一种是增加新的方法。下面我们来看下如何进行扩展。

对现有模块的control层的扩展有两种,一种是覆盖现有的方法,一种是增加新的方法。下面我们来看下如何进行扩展。

一、文件命名规则

无论是覆盖现有的方法,还是新增方法,扩展文件都是以方法名为名,保存到ext/control目录下面。文件名都是小写。

比如以user模块为例,我们想重新定义它的注册逻辑,只需要在module/user/ext/control下面创建register.php,然后实现代码即可。

如果我们想为user模块增加一个开放登录功能,比如叫做oauth,只需要在module/user/ext/control下面创建oauth.php,然后实现代码即可。

二、独立扩展代码

在对control层进行扩展的时候,可以完全独立,也可以重用主干代码在control里面定义的方法。下面的例子是完全的独立的。

class user extends control
{
    public function register()
    {
        $this->view->header->title = 'getsid';
        $this->view->sid = session_id();
        $this->view->test = $this->misc->test();
        $this->display();
    }
} 
请大家注意类名的定义:user,从control基类派生而来。这样的定义是完全独立的。

三、继承扩展

上面的例子是独立的扩展,但很多时候还想重用禅道原来的代码,则可以通过继承扩展的方式来实现。
include '../../control.php'; 
class myUser extends user
{
    public function register()
   {
        ....
        $this->process()    // process方法是在../../control.php里面定义
   }
}

首先需要手工包含../../control.php,然后类名定义是 myUser(my + 模块名),从user类派生而来,这样就可以在register方法里面调用../../control.php里面定义的process方法了。

四、限制

由于框架加载机制的限制,control一个方法只能有一个扩展。

评论列表
代学 2019-05-14 23:16:15
各位开发者们好,禅道新版本(11.4)似乎有个bug,对于control.php里面的方法扩展,若该方法调用了fetch方法,扩展后就会有问题。例如,我在module/project/ext/control/下面新建了一个create.php来扩展原create方法,该方法在传了projectid的情况下应该弹出提示关联需求、设置团队等;但是由于create里面fetch了tips方法,扩展后我发现不会弹出来了,必须要在ext/control/下再新建一个tips.php文件才会弹出来,这个新建的tips.php哪怕是个空文件都行,但就是必须要有。逐行调试了一下发现问题是出在fetch方法的helper::import()方法上面,把这一行注释掉的话,ext/control/下面不创建tips.php也能正常弹出提示框了。不知道这是不是个bug
王春生 2019-05-15 08:18:13
你对control扩展就需要自己实现相应的逻辑。
代学 2019-05-15 08:49:24
我是有自己实现相应的逻辑的,只是我扩展后的create方法也会调用原来就存在的fetch()方法,我发现不新建tips.php的话调用fetch()方法就会有问题。我又简单验证了一下,module/project/ext/control/下面新建了一个story.php文件继承扩展原project类,story方法里就写三行echo js::alert(0);$this->fetch('project','tips','projectID=1');echo js::alert(1);,如果我不新建一个tips.php,访问project模块的story方法的时候就只会弹出0,不会弹出1.但是如果我新建一个tips.php(空文件),弹出0之后会弹出1。这说明不新建tips.php的话调用原control.php方法里面的fetch()方法会走不下去。
tony 2019-05-08 08:43:15
扩展项目project控制器,在ext下新增create.php,在create.php中调用fetch('project','tips')方法,其中tips方法在project主干代码中已存在,实际使用报错,can't declare project,提示该类已经被定义,什么原因,如何解决,是不是project被helper::import()了两次
tony 2019-05-07 19:12:04
扩展control,新建一个control文件,然后通过fetch获取父control中方法的内容,会报错,说父control重复定义,不知道有人遇到过没
王春生 2019-05-08 10:13:27
我们新版本的禅道应该是支持的。最近改过。你用的版本估计有些老。
和平哥 2019-05-07 11:46:08
请问一下,我需要单独写一个模块放在my的block下显示,这就需要新增一个printXXXXStatisticBlock方法,为了保证不污染禅道的代码,不能直接写到block/control.php里。经过测试,不能被printStatisticBlock调用,提示Call to undefined method block::printXXXXStatisticBlock。
我的做法是:
在block/ext/control下新建printXXXXStatisticBlock.php,这里用了方法1和方法2的方式,但是都不能被调用,这里应该有什么注意的呢?
王春生 2019-05-07 15:34:26
可以改my下面的视图扩展。在那里面调用。
和平哥 2019-05-07 15:43:49
感谢回复
这个调用我看了一下代码(module/block/control.php和module/block/view/dashboard.html.php),是从数据库拿到block,foreach调用的printStatisticBlock($module = 'product'),再根据参数的module调用其他的子方法,而不是自己写的调用。我的思路就是,禅道有Project模块,Product模块等。我想扩展一个和他们平级的XXXX模块。但是这些Project和Product是在block的control源码中的,所以我想以ext方式增加我的模块内容,这就导致这个本应由禅道调用的方法,我自己没办法调用……
代学 2019-04-24 10:49:17
请问对control进行继承扩展的时候,类名必须按照my+模块名来命名吗?还有,上面说类名是myUser,但是新版禅道中利用二次开发编辑器生成的类名是myuser,类名有影响吗?
王春生 2019-04-24 17:31:19
类名不区分大小写。自己动手试一下就知道了。
fei 2018-12-14 18:20:46
请问control的ext第三种扩展,目录结构是怎样的
mary 2017-11-10 17:05:33
我想对关闭任务页面里增加关联和检查用例的功能,需要扩展并修改相应的control、model、view三个文件,如果是像这样二次开发了,下次禅道升级里我应该如何合并代码呢 ?
王春生 2017-11-14 14:16:20
按照扩展机制修改。
Young 2017-05-19 18:23:08
我扩展了task-control的start方法,而且扩展文件名也按照规范start.php
ERROR: the control task not found in framework\base\router.class.php on line 1417, last called by www\index.php on line 67 through function loadModule.
in framework\base\router.class.php on line 1932 when visiting /ZenTaoPMS.9.2/www/index.php?m=task&f=start&taskID=20936&onlybody=yes
王春生 2017-05-22 08:16:49
注意里面的类名定义。
lnln 2016-11-08 19:55:12
尝试用echo json_encode($response) 返回json对象,但是调用方接收到的content type是text/html,导致解析json失败;是否可以控制content type
王春生 2016-11-10 08:16:16
可以自己发header信息。
xiewei 2016-06-29 17:57:34
请教个问题,对control扩展了两个方法,分别为 a() 和 b()。 不过a()调用b()的时候会报错,应该怎么写呢
王春生 2016-06-30 09:02:00
control的扩展文件都是独立的,彼此之间没有办法调用。
公共的函数建议放在model层的扩展。
1/2
发表评论
评论通过审核后显示。