首页 文章

Yii:控制器ID和模块为空

提问于
浏览
0

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 回答

  • 0

    找到解决方案:

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

    init()在构造之后在外部调用(在(CWebApplication实例) - > runController()中,在调用$ this-> createController之后创建它) .

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

相关问题