Edit :Yii版本1.1.14
我正在尝试获取当前模块/控制器/操作并自调用以来手动构建URL
$url = Yii::app()->urlManager->parseUrl(Yii::app()->request)
除了路径格式之外我没有工作 .
我为什么需要那个?因为当我点击具有列表视图的URL时,通过将CActiveDataProvider构造函数中的pagination-> route属性分配给Yii :: app() - > urlManager-> parseUrl(Yii :: app() - > request)将生成效果如下:
-
单击"page 1"项目(或第2页上的"previous"项目)将重定向到"$url"
-
单击另一个链接将重定向到"$url/page/(pageNumber)" .
但是当urlFormat是PATH时,我的$ url将嵌入GET参数,如果有的话 . 这是:如果我现在在第2页(它也适用于不是第一页的任何页面),当前网址将是:
(module)/(controller)/(action)/page/2 (2或其他)
和页面X的生成链接(对于X> 1):
(module)/(controller)/(action)/page/2/page/X
和第1页的生成链接:
(module)/(controller)/(action)/page/2
这是有问题的,因为我无法回到第1页 .
所以我尝试了以下方法:通过访问当前控制器对象数据( no: assigning the urls manually is NOT an option )以编程方式生成[module /]控制器/操作路由:
$module = $controller->module ? $controller->module->id : ''
$controller = $controller->id
$action = $controller->action->id
但即使当前路线(是的,在我的浏览器网址中)是admin / accessLog / list(模块,控制器,动作),我的网址解析规则是这样的:
'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>'
),
(是的,有's an admin app inside an admin module, and the same for client app. but please remember the current url starts with admin/accessLog/list. This doesn'吨意味着它目前没有't occur in other urls: it only means I' m正在使用此网址,因此请将其作为起点)
$ 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(),
),
Edit :我目前安装的 modules 是:
/ admin / module:
Yii::setPathOfAlias('admin', dirname(__FILE__));
class AdminModule extends CWebModule {
public $defaultController = 'admin';
public $controllerMap = array(
'catalog' => 'admin.controllers.AdminCatalogController'
);
}
/ client / module:
Yii::setPathOfAlias('client', dirname(__FILE__));
class ClientModule extends CWebModule {
public $defaultController = 'client';
public $controllerMap = array(
'catalog' => 'client.controllers.ClientCatalogController'
);
}
再一次,我的问题是:
假设$这是当前控制器是AccessLogController的一个实例(在模块/ admin /中而不是通过外部映射),为什么两者:
$module = $this->module ? $this->module->id : ''
$controller = $this->id
是空的?
1 回答
找到解决方案:
NEVER 覆盖__construct($ id,$ module = null) . 改为覆盖init() . 如果您非常需要覆盖前面提到的构造函数(OR是像我这样的n00b并且不知道init()方法),请在第一行或任何副作用之前调用parent :: __ construct($ id,$ module)发生(除了你知道你在做什么) .
init()在构造之后在外部调用(在(CWebApplication实例) - > runController()中,在调用$ this-> createController之后创建它) .
如果覆盖构造函数但不执行父调用,则将取消设置属性id和模块,因为它们不是由应用程序在外部设置的 .