2012-05-07 4 views
0

Я хотел бы создать меню в макете, элементы которого связаны с другим модулем.Yii: Элементы CMenu для разных модулей

например: Пункт «Продукт», связанный с действием в модуле продукта, пункт «Сервис», связанный с действием в сервисном модуле.

Это не будет работать, когда я установил 'url'=>('product/<controllerID>/<actionID>') и 'url'=>('service/<controllerID>/<actionID>'), потому что когда мы в модуле продукта и нажмите на меню «Сервис», то URL стать

index.php?r=product/service/<controllerID>/<actionID>

вместо

index.php?r=service/<controllerID>/<actionID> 

и будет ошибкой 404. (конечно, потому что Сервисный модуль не находится в модуле продукта, но URL-адрес делает это так).

Любое решение для этого?

+0

вы можете показать свои линии для CMenu виджета? –

+0

Я показал код для связанного массива 'url'. Я думаю, что это самая важная часть кода этой проблемы. –

+0

Я просто хотел удостовериться, что нет никаких опечаток, во всяком случае, я думаю, что у меня есть решение, lemme поставил его. –

ответ

3

Проверьте createUrl() документация:

URL-адрес маршрута. Это должно быть в формате «ControllerID/ActionID». Если идентификатор ControllerID отсутствует, текущий идентификатор контроллера будет привязан к маршруту. Если маршрут пуст, предполагается, что это текущее действие. Если контроллер принадлежит модулю, идентификатор модуля будет привязан к маршруту. (Если вы не хотите, префикса модуля ID, маршрут должен начинаться с косой чертой «/».)

Последняя строка говорит нам все. Лучше всего для вас сделать, это начать все маршруты с /:

'url'=>array('/<moduleID>/<controllerID>/<actionID>') 
+0

Вы проверили решение? Неужели это не сработало? вы хотите уточнить? –

1

Проверить это

'url'=>$this->createUrl('/<moduleId>/<controllerID>/<actionID>') 
+2

nope, это не сработало. До сих пор я знаю, что каждое значение, связанное с 'url' в CMenu, будет передано в CHtml :: normalizeUrl, а затем передано CController :: createUrl(). Таким образом, будет создана двойная вложенная createUrl(), значит ошибка 404. –