0

编辑: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. 单击“第 1 页”项目(或在第 2 页时单击“上一个”项目)将重定向到“$url”
  2. 单击另一个链接将重定向到“$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  

空空如也?

4

1 回答 1

0

找到了解决方案:

永远不要覆盖 __construct($id, $module=null)。改写 init()。如果您非常需要覆盖前面提到的构造函数(或者是像我这样的 n00b 并且不知道 init() 方法),请在第一行或任何副作用之前调用 parent::__construct($id, $module)发生(除非你知道你在做什么)。

init() 在构造之后被外部调用(在(CW​​ebApplication 实例)->runController() 中,在调用 $this->createController 之后创建它)。

如果您覆盖构造函数但不执行父调用,则属性 id 和模块将被取消设置,因为它们不是由应用程序在外部设置的。

于 2014-02-17T20:18:37.697 回答