解决ThinkPHP3.1由于独立分组导致部分__ACTION__和U(“”)方法失效

描述

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;
}

赞( 0)

你可能感兴趣的:(ThinkPHP)