设为首页收藏本站
本地化部署微社区

Discuz! 官方站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 220399|回复: 78

DISCUZX2.5/X3/X3.1扩展框架DXEXTEND1.3.0版本发布[9.25升级X31重要提示]

[复制链接]
发表于 2013-6-28 16:50:31 | 显示全部楼层 |阅读模式
本帖最后由 Luca. 于 2014-3-31 16:09 编辑

9.25 升级3.1提示:论坛2.5/3.0版本已经安装了框架的升级到最新版3.1的,请下载覆盖最新包并手动删除extend/class/class_cloud_ext.php文件

8.9更新到1.3.0beta

1,新增EXTEND_NO_DETECT常量,默认为false,会自动检测框架源文件更新情况。当更新各扩展的时候不需要再删除缓存文件。当功能稳定而不需要更新扩展的时候可以设置成true。

7.19更新到1.2.2beta

1,修复自定义常量失效

7.18更新到新版1.2beta
1,修复支持discuz_application类扩展

7.17更新到版本1.1.2beta

1,类名方法名大小写不敏感

7.16更新到版本1.1.1beta:
1,新增开关常量,在config文件里写$_config['extend']['innodb']['on'] = 1;用来代表开关,在系统中生成INNODB常量值为1.
2,新增文件依赖,即使启用缓存了也会优先保证extend文件夹的ext类存在才会执行。
3,新增云上报的类在extend文件夹里的映射,对应关系为:api/manyou 对应 extend/class/api/manyou




现有的插件机制是一种HOOK钩子机制,可以大致理解成是一种半路拦截的机制,在核心类实例化后运行runhooks(),在编译好的模板顶端运行hookscriptoutput()。这种方法虽然好用,但是当我们想修改一些核心类库的时候,就不是那么方便了。

比如当我们需要在table_forum_post类的fetch_all_prune_by_search方法里增加一个参数,让里面的搜索由sphinx来完成(举个例子,可行性暂不说)。
或者我们觉得mysql用来做计数不方便,要改用redis来统计的时候,我们不得不修改源码,其他似乎找不到可以不改源码的方法。
又比如我们论坛使用了云主机,不允许本地IO,我们需要把所有的附件传到另外一个提供了上传API的云服务器,我们还是不得不修改底层的upload类或者使用效率低下的FTP远程附件。


那么有没有不修改源码就能实现所有类扩展的方法呢?我们最近在进行一系列论坛优化方案的时候就遇到了这个问题,比如INNODB,redis分页,计划任务分离等都需要修改底层的类来实现。所以我们推出了适应于X25/X3的扩展框架。


扩展框架的目标:
我们可以在不修改任何源码的情况下,修改、新增source/class目录下所有的类文件。


扩展框架的原理:
我们通过修改论坛的自动加载机制,让他优先加载我们的扩展类,而扩展类均继承了需要扩展的父类。


安装和使用方法:
1,下载对应的文件包,覆盖到根目录,其实只修改了一个文件:class_core.php,我们在里面修改了自动加载机制。
2,在论坛下建立新的文件夹extend/class,而这个class里面的目录和文件列表均和source/class下的保持一致。
3,比如我们需要修改source/class/discuz/discuz_upload.php里面的类,把它的save,makedir等方法修改,则只需要在extend/class下建立一个discuz文件夹,再建立一个名为discuz_upload_ext.php的文件,这个表示这个类是扩展的。
4,在discuz_upload_ext.php文件里,我们对类discuz_upload进行修改,则只需要写一个类继承discuz_upload类。示例如下:
  1. <?php

  2. class discuz_upload_ext extends discuz_upload {
  3.         function save(){......}
  4. }
复制代码
这样你写的save方法就替代了论坛所有调用discuz_upload->save()的地方了,是不是很方便呢?
5,又比如,我们准备对table文件夹下的某个数据库操作的方法进行重写,类似,在extend/class下建立table文件夹,在里面建立比如table_forum_post_ext.php文件,然后写一个子类,class table_forum_post_ext extends table_forum_post{},在里面可以新增或者对已有的方法进行重载,这个会让整个论坛所有调用此方法都使用你修改后的方法。

文件目录列表: QQ截图20130628170451.png

注意事项:
1,关于子类的命名请严格按照上面说的方式来命名,否则不会被读取。
2,写代码时请尽量按照discuz的书写格式来写,比如不要使用短标签等。
3,在class_core定义了一个EXTEND_NO_CACHE常量,当生成缓存出现问题时可以打开强制更新缓存,当代码测试无误后请修改为false。新增EXTEND_NO_DETECT常量,可以自动检测扩展源文件变动而自动更新缓存,默认为false,即此功能生效。当功能趋于稳定后可以考虑设为true。
4,该框架可以实现source/class目录下所有类的重写,但是class_core文件里的除外,因为我们已经修改了。
5,由于历史原因,class目录下的类的构造函数有些是与类名相同,有些使用了__construct,子类如果需要调用父类的构造函数统一写成parent::__contruct()
6,由于历史原因,有些文件里有两个或多个类,我们也可以对其中的一个或者多个进行继承,方法如上面所述。

7,部分类使用了instance方法把实例保存到静态变量中来避免重复实例化,遇到这种类子类也应当存在此方法,否则实例化的是父类而导致子类中的方法均不生效。
8,其他插件更新的时候在1.3.0beta版本以下的必须要去data/sysdata文件夹下删除所有_ext结尾的文件,以便新插件生效

欢迎各位开发者试用,发现问题或者有更好的想法欢迎留言。
今后我们的各种性能扩展也基本会在此框架下运行。

X3.1
upload_extend1.3.0_x3.1.zip (3.45 KB, 下载次数: 11845)

评分

4

查看全部评分

发表于 2013-7-17 14:15:53 | 显示全部楼层
发现一个小BUG,其实也不算

就是source/class/discuz/discuz_upload.php

这个类官方在编码时Class是大写C,此时楼主的改造框架将无法生成扩展类的缓存,

只要优化一下正则应该就能解决。
回复 支持 1 反对 0

使用道具 举报

发表于 2014-3-1 23:05:23 | 显示全部楼层
设置自定义二级域名以后 出现
Notice: Undefined index: config in ./source/class/class_core.php on line 356
DX3.1
回复 支持 1 反对 0

使用道具 举报

发表于 2013-6-28 17:24:15 | 显示全部楼层
前排支持技术贴!
回复 支持 1 反对 0

使用道具 举报

发表于 2013-7-22 15:17:56 | 显示全部楼层
如果能够扩展整个 source 整个目录的文件、类、方法就更好了
回复 支持 1 反对 0

使用道具 举报

发表于 2013-6-28 16:53:06 | 显示全部楼层
前排支持下啊。。。
回复 支持 1 反对 0

使用道具 举报

发表于 2013-6-28 17:47:45 | 显示全部楼层
好像挺不错,不过好像这样做以前买的插件都不能用了,又要找作者重新购买新版

点评

不需要,这个对插件机制没影响。  发表于 2013-6-29 13:19

评分

1

查看全部评分

回复 支持 0 反对 1

使用道具 举报

发表于 2013-6-28 16:56:55 | 显示全部楼层
支持,希望大家协助测试。
回复 支持 反对

使用道具 举报

发表于 2013-6-28 16:56:59 | 显示全部楼层
前排支持!!强大 专业 值得信赖!~~~
回复 支持 反对

使用道具 举报

发表于 2013-6-28 16:57:08 | 显示全部楼层
看着不错,支持下
回复 支持 反对

使用道具 举报

发表于 2013-6-28 17:07:05 | 显示全部楼层
本帖最后由 ihipop 于 2013-6-28 17:17 编辑

{:soso_e186:}顶顶楼主~~~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2013-6-28 17:10:26 | 显示全部楼层
看着不错,支持下
回复 支持 反对

使用道具 举报

发表于 2013-6-28 17:16:20 | 显示全部楼层
难得这么靠前……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|Comsenz ( 粤B2-20090059-165  

GMT+8, 2016-7-30 09:49 , Processed in 0.105761 second(s), 15 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表