对控制层(control)扩展

2014-09-01 15:13:29
王春生
40585
最后编辑:王春生 于 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一个方法只能有一个扩展。

评论列表
牛尊堡 2021-06-30 10:43:05
针对project/control.php 的create进行扩展重写。 发现$this->fetch('project','tips',"projectID=$$projectID") 没有结果。执行后结果为空。
创建迭代后的弹出框异常。
王春生 2021-07-01 09:44:36
跟踪代码,看看代码执行到什么地方,有什么错误。
牛尊堡 2021-07-01 13:40:42
执行到control.class.php->fetch()的ob_get_contents()。 输出为空
call_user_func_array() expects parameter 1 to be a valid callback,class 'myproject' does not have a method 'tips'
sric 2021-06-23 15:43:32
我要用java代码进行对禅道的扩展,可以实现吗?
王春生 2021-06-25 08:36:43
从理论上讲可以,但需要对禅道的框架结构非常了解,很难。
小小 2021-06-02 15:25:42
请教一下 项目- 任务 - 报表,关于报表是用canvas来实现的,但canvas是基于js才能实现,请问js在哪里引入的呢?还请指点一下谢谢。
王春生 2021-06-03 09:09:33
可以查看源代码,看js引入的路径。
报表组件应该是在zui框架里面的。
czl 2021-05-31 08:33:19
新扩展了control,权限也维护好了,但还是不能使用
08:32:18 ERROR: the module task has no batchrelationshiptask method in /usr/share/nginx/zentaopms/framework/base/router.class.php on line 1658, last called by /usr/share/nginx/zentaopms/www/index.php on line 72 through function loadModule.
in /usr/share/nginx/zentaopms/framework/base/router.class.php on line 2234 when visiting /index.php?m=task&f=batchRelationshipTask&projectID=102&taskID=825
王春生 2021-05-31 21:10:51
注意文件的大小写。
Archon 2020-05-29 17:12:06
请问,如果需要在验证关闭Bug的时候提交测试的数据,此页面如何添加一个模块用来保存验证的测试数据做验证关闭的证据?

也就是我需要在验证关闭时能上传附件,以确保测试人员测试的结果正确性
王春生 2020-06-02 10:58:38
你需要先搞清楚我们的mvc结构。搞清楚了就知道在什么地方做。
zt 2020-01-07 10:14:51
在module/user/ext/control下面创建register.php,然后怎么访问register.php中的方法呢?
王春生 2020-01-07 11:10:17
参考我们其他的方法。
tan 2019-12-27 16:25:10
静态方法不能重写吗
tan 2019-12-27 09:42:10
__construct 构造方法貌似不能覆盖。。
代学 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扩展就需要自己实现相应的逻辑。
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()了两次
1/3
发表评论
评论通过审核后显示。