对控制层(control)扩展

2014-09-01 15:13:29
王春生
49896
最后编辑:朱金勇 于 2023-03-20 08:55:24
分享链接
摘要:对现有模块的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一个方法只能有一个扩展。


注意:本文档是针对禅道16.5版本之前的zentaoPHP框架,禅道最新版本的二次开发文档请参照新版:
https://devel.easycorp.cn/book/extension-new/intro-52.html

评论列表
ted 2023-03-13 17:02:17
按照所讲在module下创建ext,但没找到怎么调用的方式。不列出demo真的难懂,也不知道拓展的里面该写类还是脚本
朱金勇 2023-03-15 11:12:12
禅道自16.5版本后扩展方式发生了变化,主要修改的内容是将之前在各模块ext下的扩展代码统一放到extension/custom目录下。
详细的内容请阅读新的二次开发文档:
https://devel.easycorp.cn/book/extension-new/intro-52.html
扩展的文件里面需要写一个继承于control或者model的类,然后扩展相应的同名方法。根据您的建议,我们这周会在文档中对demo的代码进行更清楚的说明。
jmy 2023-01-11 09:36:34
我想在control中新增一个方法 也要写到ext扩展中吗
王春生 2023-01-12 13:08:42
是的。这样我们升级的时候不会覆盖你的代码。
胖哥 2022-05-15 21:45:05
想重写project control中的create方法,直接在创建了ext/control/create.php,里面很多方法无法使用,连$this->post_qc都无法使用。
21:36:19 Uncaught Error: Using $this when not in object context in D:\xampp\zentao\module\project\ext\control\create.php:5
Stack trace:
#0 D:\xampp\zentao\framework\base\helper.class.php(195): include()
#1 D:\xampp\zentao\framework\base\router.class.php(1645): baseHelper::import('D:\\xampp\\zentao...')
#2 D:\xampp\zentao\www\index.php(72): baseRouter->loadModule()
#3 {main}
thrown in D:\xampp\zentao\module\project\ext\control\create.php on line 5 when visiting project-create
王春生 2022-05-16 08:40:19
请仔细看我们的扩展文档。
元曦 2022-04-02 18:21:30
如果我再user模块下的ext文件夹下面有多个扩展类,我其中一个扩展类引入另外一个扩展类的方法,总是提示我Fatal error: Cannot declare class user, because the name is already in use in F:\phpstudy_pro\WWW\cczq\cczq_pms\module\user\control.php on line 949

18:15:40 Cannot declare class user, because the name is already in use in F:\phpstudy_pro\WWW\cczq\cczq_pms\module\user\control.php on line 949 when visiting user-logoutex
但是实际上我并没有实例化,不知道怎么回事,求大佬帮助
王春生 2022-04-06 20:27:17
有重复定义。
元曦 2022-03-16 16:43:11
如果我想在新的模块中,在control层增加一个基类(如:新增个newcommon文件夹,下面写一个control文件,里面有个baseControl方法,它继承了control),让所有新的模块的控制器继承这个新的基类方法,baseControl,这种如何实现?
MIKE 2022-03-02 00:17:55
class user extends control 的写法不对,无法调用到;
要改成 class myblock extends block
牛尊堡 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'
MIKE 2022-03-01 01:51:17
请问解决了吗,如何解决的
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
注意文件的大小写。
1/3
发表评论
评论通过审核后显示。