编辑:Yii 版本 1.1.14
自调用以来,我正在尝试获取当前模块/控制器/操作并手动构建一个 url
$url = Yii::app()->urlManager->parseUrl(Yii::app()->request)
除了路径格式外,它没有像我一样工作。
我为什么需要那个?因为当我点击具有列表视图的 url 时,通过将 CActiveDataProvider 构造函数中的 pagination->route 属性分配给 Yii::app()->urlManager->parseUrl(Yii::app()->request) 将产生以下效果:
- 单击“第 1 页”项目(或在第 2 页时单击“上一个”项目)将重定向到“$url”
- 单击另一个链接将重定向到“$url/page/(pageNumber)”。
但是当 urlFormat 为 PATH 时,我的 $url 将嵌入 GET 参数(如果有)。这是:如果当前我在第 2 页(它也适用于不是第一页的任何页面),则当前 url 将是:
(module)/(controller)/(action)/page/2 (2 或其他)
以及为页面 X 生成的链接(对于 X > 1):
(模块)/(控制器)/(动作)/page/2/page/X
以及为第 1 页生成的链接:
(模块)/(控制器)/(动作)/page/2
这是有问题的,因为我无法返回第 1 页。
所以我尝试了以下方法:通过访问当前控制器对象数据以编程方式生成 [module/]controller/action 路由(否:手动分配 url 不是一个选项):
$module = $controller->module ? $controller->module->id : ''
$controller = $controller->id
$action = $controller->action->id
但是即使当前路由(是的,在我的浏览器 url 中)是 admin/accessLog/list(模块、控制器、操作)并且我的 url 解析规则是这样的:
'urlFormat'=>'path',
'showScriptName'=>false,
'rules'=>array(
array('admin/admin/index', 'pattern' => 'admin'),
array('client/client/index', 'pattern' => 'client'),
array('admin/admin/<action>', 'pattern' => 'admin/<action:(login|logout|index|profile)?>'),
array('client/client/<action>', 'pattern' => 'client/<action:(login|logout|index|profile|recoverPassword)?>'),
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'<action:\w+>' => 'site/<action>'
),
(是的,管理模块中有一个管理应用程序,客户端应用程序也是如此。但请记住当前 url 以 admin/accessLog/list 开头。这并不意味着它不会出现在其他 url 中:它只是表示我目前正在使用这个 url,所以以它为起点)
$module 为空(应为“admin”),$controller 为空(应为“accessLog”),action 为“list”(预期值)。
我当前安装的模块是(应用程序级):
'modules'=>array(
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'developer',
'ipFilters'=>array('127.0.0.1','::1'),
),
'admin'=>array(),
'client'=>array(),
),
编辑:我目前安装的模块是:
/管理员/模块:
Yii::setPathOfAlias('admin', dirname(__FILE__));
class AdminModule extends CWebModule {
public $defaultController = 'admin';
public $controllerMap = array(
'catalog' => 'admin.controllers.AdminCatalogController'
);
}
/客户端/模块:
Yii::setPathOfAlias('client', dirname(__FILE__));
class ClientModule extends CWebModule {
public $defaultController = 'client';
public $controllerMap = array(
'catalog' => 'client.controllers.ClientCatalogController'
);
}
而且,再一次,我的问题:
假设 $this 是当前控制器是 AccessLogController 的一个实例(在模块 /admin/ 中,而不是通过外部映射),为什么两者:
$module = $this->module ? $this->module->id : ''
$controller = $this->id
空空如也?