最近一个项目需要整合 Ecshop 和 Discuz。整合过程很简单,最新版的 Discuz! X2 已经自带了 uc_server 和 uc_client。由于主目录是 Ecshop,Discuz 放在 bbs 目录下,为了减少垃圾文件,我全局修改了 Ecshop 里关于 uc_client 的调用路径,改成了 discuz 里自带的,这样两个程序就共用一个 uc_client。
全部设置成接口调用方式后测试发现,两边登陆都可以同步登陆到另一程序上,但退出则无法实现同步登陆。顺着 Ecshop 的退出流程,顺藤摸瓜找到了 lib_common.php 文件中的 uc_call 这个方法。这个方法的第二个参数 $params 的默认值是 null。而 Ecshop 注销时只传了调用 uc_client 中同步退出方法名做为一个参数的值,第二个参数使用的是默认值。而这个方法中通过 call_user_func_array($func, $params); 来调用对应的方法,问题就在这,第二个 $params 参数如果是 null 则 call_user_func_array 执行失败。解决办法很简单,修改 Ecshop 里 lib_common.php 中 function uc_call($func, $params=null) 这一行改成 function uc_call($func, $params=array()) 即可。
PHP
这个缩略图生成类是根据从 PHPCMS 挖出来的相关函数简单修改而来的。自觉使用起来挺方便的,呵呵。
用法也简单,范例如下:
$thumb = new thumb(str_replace("\\","/",dirname(__FILE__))."/"); \\定义根物理路径
$thumb->get('images/107.jpg'); \\输入图片路径生成缩略图并返回缩略图路径
以上写法也可以改成
$thumb = new thumb();
$thumb->get('E:/htdocs/magki/include/images/107.jpg');
不过前一种返回的是缩略图的相对路径,而后一种是返回缩略图的绝对物理路径。
缩略图的命名只定义了三个标签如下:
%maxwidth% get 方法中所定义的缩略图的最大宽度,默认 100
%maxheight% get 方法中所定义的缩略图的最大高度,默认 100
%basename% 所要生成缩略图的原图文件名
类中默认使用的缩略图命名是 thumb_%maxwidth%_%maxheight%_%basename% 像上面范例中所生成的缩略图命名就是根据默认来生成的,所得到的缩略图文件名为 thumb_100_100_107.jpg。有需要的可以自己扩展更多的缩略图命名标签。
另外,这个类的 get 方法还有一个参数是 autocut,如果赋值为 1 (默认值)则如果原图高宽比例和所指定的缩略图高宽比例不一致则会进行裁剪而非变形拉伸。
阅读全文...
PHP
代码片段
最近几个单都是用 PHPCMS 做二次开发,包括现在正在进行的这个大单,有多大?给客户添数据后,光是栏目数就已经设置到3000+并且上升势头不减……
以前没遇到过一个网站有那么多栏目的情况,估计 PHPCMS 的开发人员也没遇到过,因为我发现栏目越多,添加和修改栏目的速度越慢,栏目数过1000的时候,基本修改一次栏目就得花上1分钟时间,现在 3000+ 栏目已经要4,5分钟了……查阅了下 PHPCMS 的代码发现了问题所在。
PHPCMS 的栏目相关处理方法都是在 include\admin\category.class.php 里,这个类文件中有一个被频繁使用的方法 repair,问题就出在这里。无论是添加、删除还是其他的一些栏目操作,大多都会执行一次这个方法(有个地方连续执行两次,不解,应该是开发人员的失误)。而这个方法的主要工作就是将整个站的所有栏目遍历一次遍,对每个栏目都更新一下 arrparentid, parentdir, arrchildid 三个字段的内容。妈妈呀,那3000多个栏目岂不是要执行3000多次 update?怪不得……
阅读全文...
PHP
源码修改
HAS_ONE:当前表的每一条记录都拥有最多一条(0–1)关联记录
HAS_MANY:当前表的每一条记录都拥有多条(0-n)关联记录
MANY_TO_MANY:当前表的每一条记录都和其他表的多条(0-n)记录关联
BELONGS_TO:当前表的每一条记录都属于另一个表的某条记录
关联中必须设置的属性为:
'name', // 关联的名字(如:hasOne、hasMany)
'tableClass', // 关联的表数据入口对象名
'mappingName', // 字段映射名
可选属性:
'foreignKey', //外键字段名
'sort', //对关联表进行查询时使用的排序参数
'conditions', //对关联表进行查询时使用的条件参数
'fields', //对关联表进行查询时要获取的关联表字段
'limit', //对关联表进行查询时限制查出的记录数
'enabled', //是否处理关联,设置为falses时,不处理该表入口的任何关联。enabled 的优先级高于 linkRead、linkCreate、linkUpdate 和 linkRemove。
'countOnly', //指示在查询关联表时是否仅仅统计记录数,而不实际查询数据
'counterCache', //将关联记录总数缓存到指定的字段,数据表中要建立相应的字段
'linkRead', //指示是否在主表读取记录时也读取该关联对应的关联表的记录,默认ture
'linkCreate', //指示是否在主表创建记录时也创建该关联对应的关联表的记录,默认ture
'linkUpdate', //指示是否在主表更新记录时也更新该关联对应的关联表的记录,默认ture
'linkRemove', //指示是否在主表删除记录时也删除该关联对应的关联表的记录,默认ture
'linkRemoveFillValue', //当删除主表记录而不删除关联表记录时,用什么值填充关联表记录的外键字段,默认0
'saveAssocMethod', //指示当保存关联数据时,采用何种方法,默认为 save,可以设置为 create、update 或 replace
关联:一个关联是一个关系,这个关系属于某一个数据表。例如 users 表可能就拥有一个或者多个关联。
主表:对于一个关联,拥有该关联的数据表就是主表。例如 posts 表定义了一个 MANY_TO_MANY 关联。那么在这里(指这个关联),posts 就是主表。
关联表:在一个关联中,关联表就是除主表外的另一个表。
外键:在数据库原理中,外键的含义很复杂。但在 FleaPHP 框架中的数据库关联功能中,外键泛指一个记录中用于关联另一个记录的字段。例如 profile 表中的 user_id 字段就是用于关联 users 表的字段。这个 user_id 字段就是一个外键。
中间表:在 MANY_TO_MANY 关联中,除了主表和关联表,还需要另一个表来保存这两个表的记录之间的互相关联关系。这个表称为中间表。
PHP
笔记