对模型层(model)扩展

2014-09-01 15:13:29
王春生
19001
最后编辑:郑乔尹 于 2017-07-14 08:16:55
简介:model为模型方法,主要用来处理各种数据的查询、更新。model的扩展分为三种方式,一种是直接新增或者覆盖方法,一种是通过钩子来实现,第三种则是完全定义一个新的类。

model为模型方法,主要用来处理各种数据的查询、更新。model的扩展分为三种方式,一种是直接新增或者覆盖方法,一种是通过钩子来实现,第三种则是完全定义一个新的类,下面分别来讲述下各自实现的机制。

一、直接新增或者覆盖方法

不管是新增方法还是覆盖现有的方法,都是在模块的ext/model/目录下面建立相应的以方法为名的文件。比如,我们打算对misc的model新增一个方法,叫做foo,那么只需要在misc/ext/model/下面建立foo.php,代码如下:

public function foo()
{ 
     return 'foo';
} 
需要说明的是这里面的定义 不包含类的声明,就只是一个方法的声明。禅道框架在执行的时候,会自动将扩展目录下面的foo.php里面的代码,替换misc/model.php中的foo方法的代码。如果是新增的方法,则会追加到misc/model.php的代码中,最终生成一个合并之后的model类文件。

二、通过钩子来扩展

除了新增或者覆盖方法之外,还可以通过钩子方式来扩展。所有的钩子都是存放在ext/model/hook目录下面,文件命名规则是:方法名.扩展名.php

比如我对misc模块中的helllo方法进行钩子的扩展,在misc/ext/model/hook/下面创建hello.abc.php的文件,然后在里面实现代码就可以了。

禅道框架会把某一个方法的所有的钩子代码合并到终的代码中。

不过 这种 方法 很多 限制, 会有 意想不到 行为, 不建议 大家 使用。

三、通过类的方式来扩展

除了上面两种方式之外,model的扩展还有第三种方式,就是将所有的扩展放在一个类里面,然后通过框架的loadExtension()方法来加载。这种主要是为了解决加密文件冲突的问题。zentaoPHP框架在处理model的扩展时,会把相应的代码进行合并,但这时候问题就来了。如果对第一种方法的扩展,也就是exe/model/abc.php进行加密,就会和其他的开源的model扩展冲突。如果不加密,无法保护作者的代码。为了解决这个问题,我们特地实现了第三种扩展方法,下面我们来说明下:


3.1 在ext/model/class/下面创建一个类,文件名的规则是插件名.class.php。

比如我们的甘特图插件,定义为project/ext/model/class/gantt.class.php,里面定义各种代码。

类名规则是{插件名}{模块名},模块名首字母大写,如ganttProject。

class ganttProject extends projectModel
{
    public function createRelationOfTasks($projectID)
    {
    }
}

注意:这个地方类是继承自projectModel,这样还可以重用原来的代码。


3.2 在ext/model/创建调用的程序。比如叫做project/ext/model/gantt.php
public function createRelationOfTasks($projectID)
{
    $this->loadExtension('gantt')->createRelationOfTasks($projectID);
}
通过loadExtension()方法来调用3.1里面调用的gantt.class.php里面的方法。
这样禅道框架只需要对所有的class扩展进行加密就可以了,就可以解决加密文件冲突的问题了。
评论列表
春哥 2018-07-05 10:20:33
删除返回值怎么设置啊 找不到PDOStatement这个类
王春生 2018-07-08 20:06:27
不太明白你的意思哦。
陈先生 2018-01-31 17:47:52
您好,今天我将禅道项目部署到linux虚拟机上,然后安装我平时在windows下开发的插件时,出现以下错误:
Call to a member function hello() on boolean in /opt/zbox/app/zentao/tmp/model/product.php on line 36 when visiting /zentao/index.php?m=product&f=index
好像所有的ext/model/class里的方法都无法调用
请问是什么原因啊,谢谢了。
王春生 2018-01-31 19:24:32
检查大小写。
安安 2017-12-13 09:06:45
请问:
三、通过类的方式来扩展,在class下面扩展的代码必须要加密吗?不加密这样扩展可以吗?
王春生 2017-12-14 08:28:20
不是必须的。如果不需要加密,可以直接扩展model。如果需要加密的话,用第三种方式。
user 2017-10-20 14:54:47
group模块下的resource.php怎么扩展?放在ext/lang下还是别的地方?
王春生 2017-10-23 08:26:35
按照语言扩展就行。
user 2017-10-20 14:21:09
model扩展中怎么新增类的属性?
王春生 2017-10-20 14:26:25
直接声明好了。虽然会有警告。没有其他更好的办法。
minghua 2017-09-29 15:35:46
额,sorry,我一个问题得发两次了。加上static后,正常运行,但是修改的代码没生效。
minghua 2017-09-29 15:18:28
另外,加了你们客服QQ,申请进群,好多天了,加了两次了,也没动静。求带入组织
minghua 2017-09-29 15:17:27
刚开始学习禅道,请教下。我在common模块下的ext/model中新建printTopBar.php。
该文件内容为:
public function printTopBar(){}
访问报错:
Fatal error: Cannot make static method commonModel::printTopBar() non static in class tmpExtcommonModel in E:\workspace\php\www\zentaopms\tmp\model\tmpcommon.php on line 6

15:16:36 Cannot make static method commonModel::printTopBar() non static in class tmpExtcommonModel in tmp\model\tmpcommon.php on line 6 when visiting

请问下,这个是哪里的问题呢
sql中的或条件怎么写 2017-01-17 17:55:30
我想查询7月的任务,任务开始时间在7月或截至时间在7月,这个或语句怎么写?请春哥指点,谢谢!没找到例子
王春生 2017-01-18 11:36:09
看我们的搜索表单。
王春生 2017-01-18 11:37:39
orWhere,禅道里面有很多的或查询。
午阳 2017-01-01 08:35:02
3.2中“这样禅道框架只需要对所有的class扩展进行加密就可以了,就可以解决加密文件冲突的问题了。”---请问是如何针对class扩展加密的?要借用什么工具吗
王春生 2017-01-03 09:13:00
我们是用的ioncube和zend加密的。
午阳 2017-01-03 14:39:14
上传插件到禅道的平台(上传时,选择加密的方式),如果插件里的的model 文件采用class扩展的方式开发的,上传后会平台会对直接这个class文件加密,但是调用这个class的文件(如下)也会被加密,“zentaoPHP框架在处理model的扩展是,会把相应的代码进行合并,但这时候问题就来了。”
public function createRelationOfTasks($projectID)
{
$this->loadExtension('gantt')->createRelationOfTasks($projectID);
}

平台是推荐插件开发者如何处理这个问题?是插件开发者购买ioncube加密工具,单独对这个class扩展文件加密吗?
王春生 2017-01-04 09:33:26
看你自己的选择了。你要是源代码开放的话,就无所谓。
如果你需要加密,而且对model做了扩展,建议用这种方式。
你如果上传到我们平台的话,选择商业软件的话,我们会帮你加密。
1/2
发表评论
评论通过审核后显示。