版权属于: Postbird - There I am , in the world more exciting!
原文地址: http://www.ptbird.cn/thinkphp-modules-index-action0u/
转载时必须以链接形式注明原始出处及本声明。
版权属于: Postbird - There I am , in the world more exciting!
原文地址: http://www.ptbird.cn/thinkphp-modules-index-action0u/
转载时必须以链接形式注明原始出处及本声明。
描述:
TP3.1使用独立分组,分组默认路径为/Modules/,在Modules下有Index和Admin两个文件夹,分别是两个模块,路径格式如下所示。
遇到的问题:
在/Index操作模块下, __ACTION__和U(“”)方法(请注意使用默认的U(“”),而分页类Page()中如果没有传递第四个参数,那么就会使用U(“”)产生当前的路径,从而生成分页的url)。
但是现在发现在Index模块下的__ACTION__方法和U(“”)方法生成的url均不对,少了一个./Index/(分组名),所以分页也出现了问题。
这个问题在Index/的操作下才会出现,但是Admin/下的操作则不会出现(目前我也不知道为什么,这个问题蛋疼了好久)。
在两个操作中使用的代码相同,生成的路径url对比如图:
【可以明显的看出,代码一样,但是Index下的路径少了一个Index分组,/Index/Index/pointlist/变成了 /Index/pointlist/】
【因为上述问题的存在,导致分页的时候,分页显示不正确】
解决问题:
Page类在引用的时候有四个参数分别如下,
/**
* 架构函数
* @access public
* @param array $totalRows 总的记录数
* @param array $listRows 每页显示记录数
* @param array $parameter 分页跳转的参数
*/
public function __construct($totalRows,$listRows='',$parameter='',$url='')
如果我们不传递第四个URL参数,那么他会使用U(“”)方法生成一个路径,当然可以修改源代码,但是修改源代码以方便无法做到响应式的创造url,另外由于只有Index分组存在这个问题(我一直在想是不是因为两个Index重复所以导致了一个),所以使用另外一种解决方案。
创造一个全局函数,不能使用__ACTION__,也不能用__SELF__,都不起作用(我试过了),因此创建一个函数,全局性质的函数,模拟U(“”)生成路径。
函数的名字命名为 function UU(),函数只是返回一个正常的 __ACTION__应该有的(也就是 /Index/Index/pointlist),加上了分组名称。
在声明Page类的对象的时候,将第四个参数传递进去 即 $Page=new Page($count,20,”,UU()); 第三个参数不需要给的。
代码:
函数很简单,只有几行,但是这个发现问题和研究源代码的过程是很有意义的。
最近我写代码的注释真的是越来越多。
下面就是代码和注释,如果站点代码显示有问题,代码可以去gitosc查看
链接地址为:http://git.oschina.net/postbird/0yj641p7dnhc3woxk5em841.code.git
//解决系统由于使用了自定义分组产生的分页路径问题
// 函数说明 模拟U("")方法生成正确的当前地址,并且最后执行操作
/*
* powered by postbird
* http://www.ptbird.cn
* lience MIT
* 2016-10-24
*/
/*
问题描述:
自定义分组路径为 APP/Modules/Index/IndexAction.class.php
发现 __ACTION__,U(""), 两种形式均少一个Index
正常路径应为 xxx/Index/Index/pointlist (分组名/模块名/操作名)
发现分组名没了
//后期发现的问题 ;发现只有分组名称为Index,而操作是Index/Action/的时候
__ACTION__和U("")方法才会产生问题,
从而导致在分页过程中使用U("")方法出现问题
*/
/** 主要用在 Page上的第四个参数
------------------------------------------
| $page=new Page($count,100,'',UU()); |
------------------------------------------
* array $totalRows 总的记录数
* array $listRows 每页显示记录数
* array $parameter 分页跳转的参数
* public function __construct($totalRows,$listRows='',$parameter='',$url='')
*/
function UU(){
//正确的__ACTION__应该为:
// /二级目录(如果有)/index.php(如果文件)/Index(独立模块名 并加上GROUP_NAME)/Index(ACTION)/pointlist(操作)
// 问题 :/sciplat/index.php/Index/pointlist 可以看出少了一个Index(模块名称 并加上GROUP_NAME)
$str =__ACTION__;
//去掉index.php,并加上GROUP_NAME
$str =GROUP_NAME.substr($str,strpos($str,"index.php/")+strlen("index.php/")-1,strlen($str))."/p/";
// dump($str);
// 效果 string(22) "/Index/Index/pointlist"
return $str;
}