我有一个searchmodule.php有以下功能:

class SearchModule extends CWebModule
{
    // function init() { }
    /**
     * @return array Правила роутинга для текущего модуля
     */
    function getUrlRules()
    {
        $customController = (Yii::app()->theme->getName() == 'test' ? 'Test' : '') . '<controller>';

        return array(
            $this->id.'/<controller:\w+>/<action:(SupportBlock)>/<countryId:\d+>' => $this->id.'/' . $customController . '/<action>',
            $this->id.'/<controller:\w+>/<action:(SupportBlock)>/<countryId:\d+>/<cityId:\d+>' => $this->id.'/' . $customController . '/<action>',
            $this->id.'/visas' => $this->id.'/visas/fullVisasInfo',
        );
    }
}

我想弄清楚的是,如果我的主题设置为“test”,如何使用另一个控制器。现在它有一个名为hotelscontroller或locationscontroller的搜索控制器。我试图实现的是,如果主题的名称设置为“test”,那么它应该将所有请求从同一个url路由到test hotelscontroller或testlocationscontroller(/search/hotels应该路由到testhotelscontroller而不是hotelscontroller)。
我试过在路由表的第二部分附加“test”来完成这项工作,但这似乎没有任何效果。

最佳答案

不能将关键字<controller>与任何类型的控制器名称组合在一起。您可以给它一个自定义的唯一控制器名称,或者使用<controller>关键字来读取给定的控制器。并且您的控制器名称不是TestController,而是TestHotelsController,因此,请尝试如下更改代码:

function getUrlRules()
{
    $customController = (Yii::app()->theme->getName() == 'test' ? 'hotelsTest' : 'hotels');

    if(strpos(Yii::app()->urlManager->parseUrl(Yii::app()->request), 'hotel')) {
        $rules = array(
            $this->id . '/<controller:\w+>/<action:(SupportBlock)>/<countryId:\d+>' => $this->id . '/' . $customController . '/<action>',
            $this->id . '/<controller:\w+>/<action:(SupportBlock)>/<countryId:\d+>/<cityId:\d+>' => $this->id . '/' . $customController . '/<action>',
            $this->id . '/visas' => $this->id . '/visas/fullVisasInfo',
        );
    }
    else {
        $rules = array(
            $this->id.'/<controller:\w+>/<action:(SupportBlock)>/<countryId:\d+>' => $this->id.'/<controller>/<action>',
            $this->id.'/<controller:\w+>/<action:(SupportBlock)>/<countryId:\d+>/<cityId:\d+>' => $this->id.'/<controller>/<action>',
            $this->id.'/visas' => $this->id.'/visas/fullVisasInfo',
        );
    }

    return $rules;
}

07-24 19:08