对控制层(control)扩展

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

评论列表
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层的扩展。
馒头仔 2016-06-01 16:10:15
上面说的扩展方法,比如我现在想为user模块增加一个开放登录功能,在module/user/ext/control下面创建了一个oauth.php文件,但是为什么访问一直不成功呢,提示的是:Forbidden
You don't have permission to access /chandao/www/user-oauth-L2NoYW5kYW8vd3d3L3VzZXItb2F1dGgtTDJOb1lXNWtZVzh2ZDNkM0wzVnpaWEl0YjJGMWRHZ3RUREpPYjFsWE5XdFpWemgyWkROa00wd3pWbnBhV0VsMFlqSkdNV1JIWjNSVVJFcFBZakZzV0U1WGRGcFdlbWd5V2tST2EwMHdkM3BXYm5CaFYwVnNNRmxxU2tkTlYxSklXak5TVlZKRmNGQlpha1p6VjBVMVdHUkdjRmRsYldkNVYydFNUMkV3TUhkbFJFNVJWa1JDTVZsVmFGTmtSMHBDVUZRd2RXRklVblJpUVQwOUxtaDBiV3c9Lmh0bWw=.html on this server.
请问这个是什么情况呢?
王春生 2016-06-02 08:38:55
这个地址太长了。webserver给禁止了。
可以用get方式传参。
luke 2016-10-13 16:00:17
用admin应该是可以的吧
hello 2016-04-14 11:35:44
admin权限 新增加一个方法,zentao/www/index.php?m=project&f=hello 提示 抱歉,您无权访问『项目视图』模块的『hello』功能 group lang 里面也修改了 ,还是提醒 怎么解决
王春生 2016-04-15 08:26:46
在权限分组里面要给相应的人分配权限。
fallen 2016-03-31 17:27:31
sendmail方法好像无法扩展
xiii 2016-04-01 08:33:59
为啥会这样,你试过么?
xiii 2016-03-31 13:21:36
请问为什么我扩展一个sendmail方法(这个方法是被其他方法调用的,原来的control中有这个方法),无论采用哪种扩展,都不能使用,系统还是调用原control中的sendmail方法
王春生 2016-04-01 08:21:49
可以对mail模块的sendmail方法做扩展。
xiii 2016-04-01 08:34:41
可我是想对bug模块里的sendmail扩展,这样不能扩展么?
王春生 2016-04-05 08:10:58
因为最终调用的都是mail模快的方法。
bug的sendmail方法现在是放在control里面的,主要是为了渲染视图,作为发信的内容用。也可以扩展,不过就是曲折一点:
1. 你可以把每个调用sendmail的control方法扩展,然后在里面调用自己的扩展的sendmail方法。
2. 你可以考虑对sendmail方法的视图文件做扩展。
xiii 2016-04-05 10:24:34
我就不懂为什么其他方法可以扩展,就sendmail不行呢!我现在只能尝试在sendm的html文件进行扩展,因为control里面调用sendm的方法太多了
newbmiao 2015-11-16 16:07:37
继承扩展的命名规则是什么,比方说扩展user,是再/ext/control中写myuser.php? 还是control.php?都不生效啊
王春生 2015-11-17 08:10:45
手册写得清清楚楚。
Young 2017-05-27 11:56:18
关于继承Control的问题,走查了代码,发现好像真的没有实现哦

首先文件命名,手册里没有说明;除了方法以外的命名,都无法加载

router.class.php里打印的所有路径只支持方重载
/*
* 引入该模块的control文件。
* Include the control file of the module.
**/
$file2Included = $this->setActionExtFile() ? $this->extActionFile : $this->controlFile;
chdir(dirname($file2Included));
include $file2Included;
$this->triggerError("##########file2Included######### $file2Included##############################", __FILE__, __LINE__, $exit = true);
Young 2017-05-27 11:57:26
不知道我看的有没问题,求指导
1/2
发表评论
评论通过审核后显示。