2016-12-02 6 views
3

У меня есть SearchModule.php имеет следующее:getUrlRules - переход на контроллер

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', 
     ); 
    } 
} 

То, что я пытаюсь выяснить, как использовать другой контроллер, если моя тема»установлен на„тест“. Сейчас у него есть поисковые контроллеры, называемые HotelsController или LocationsController. То, что я пытаюсь достичь, - это то, что если имя темы задано для «теста», оно должно направлять все запросы в TestHotelsController или TestLocationsController с ИДЕННОГО URL (/ поиск/отели должны направляться в TestHotelsController вместо HotelsController).

Я попытался сделать это, добавив «Тест» ко второй части таблицы маршрутизации, но это, казалось, ничего не делало.

ответ

2

Я нашел способ это с помощью setControllerPath так:

$customController = (Yii::app()->theme->getName() == 'test' ? 'test' : ''); 
$this->setControllerPath(__DIR__ ."/controllers/$customController"); 

в функция init() модуля. Таким образом, имя настраиваемого контроллера остается неизменным, изменяется только каталог для него.

2

Вы не объединяете ключевое слово <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; 
} 
+0

Это не похоже на трюк, поскольку он не вызывает действия TestController. Я могу позвонить им напрямую, однако с этой маршрутизацией он продолжает звонить в стандартный HotelsController. Я немного изменил имя функции и контроллера, и когда я прямо звоню/search/hotelsTest, он правильно вызывает действие тестового контроллера, ОН ХОТЕЛЕТ, что он не переключается на вызов по мере необходимости. –

Смежные вопросы