2013-04-12 7 views
2

Я сколотить меню в Yii (мой первый проект, используя его), как это:Yii CMenu Widget - Как получить Главная страница

$this->widget('zii.widgets.CMenu',array(
    'items'=>array(
     array('label'=>'Home', 'url'=>array('/')), 
     array('label'=>'Examples', 'url'=>array('/examples')), 
     array('label'=>'Contact', 'url'=>array('/contact')), 
     array('label'=>'FAQ', 'url'=>array('/faq')), 
     array('label'=>'Blog', 'url'=>array('/blog')), 
     array('label'=>'Order', 'url'=>array('/order')), 
    ), 
)); 

Каждый из этих путей URL, такие как /примеры это маршрут, определенный в моей конфигурации, так что он не выглядит так: сайт/примеры.

Для ссылки «Главная», я пытаюсь заставить ее просто ссылаться на корневой уровень сайта. Видимо, виджет CMenu передает URL-адрес через CHtml::normalizeUrl(), который заканчивается тем, что он указывает на текущую страницу. Поэтому, если я на странице примеров, главная ссылка указывает на /примеры.

Это то, что говорит normalizeUrl() делает:

Если входной параметр является пустой строкой, запрашиваемая в данный момент URL будет возвращен.

Если входной параметр является непустой строкой, он рассматривается как допустимый URL-адрес и будет возвращен без каких-либо изменений.

Если входной параметр является массивом, он рассматривается как маршрут контроллера и список параметров GET, а метод CController :: createUrl будет вызываться для создания URL-адреса.

Я пробовал передать пустую строку, и она заканчивается тем, что указывает на текущий URL-адрес запроса, как и ожидалось. Я пробовал передать «/», которая является непустой строкой, и она еще указывает на текущий URL-адрес запроса. Я также пробовал передать массив, и он умирает с trim() expects parameter 1 to be string, array given, потому что CMenu ожидает строку.

Я пытаюсь сделать что-то Yii, но я серьезно собираюсь просто оставить статическое меню, если оно не может адресовать что-то простое, как вернуться на домашнюю страницу.

TL; DR Как я могу сделать виджет CMenu в Yii создать ссылку на «/» или на базовый домен?

ответ

4

При использовании массива в качестве url он будет пытаться создать URL на основе вашей конфигурации маршрутизатора, но если вы передаете строку как пары он будет принят в буквальном смысле, то есть:

$this->widget('zii.widgets.CMenu',array(
    'items'=>array(
     // Root hardcoded 
     array('label'=>'Home', 'url'=>'/'), 
     // Root dynamic (works also if not in domain root) 
     array('label'=>'Home', 'url'=>Yii::app()->baseUrl), 
     // External url 
     array('label'=>'Examples', 'url'=> 'http://example.com/'), 
     // current url 
     array('label'=>'Contact', 'url'=> ''), 
     array('label'=>'FAQ', 'url'=>array('/faq')), 
     array('label'=>'Blog', 'url'=>array('/blog')), 
     array('label'=>'Order', 'url'=>array('/order')), 
    ), 
)); 

О, и правил Thats для все места, когда вы можете использовать url.

+1

Круто это именно то, что я хотел. Благодаря! –

+0

какой файл я должен поставить? – David

+0

Вы можете поместить этот фрагмент в любой файл вида – 2014-02-11 13:42:18

2
array('label'=>'Home', 'url'=>Yii::app() -> request -> baseUrl) 
+0

Это решение работает так же, спасибо! –

2

Другой вариант

array('label'=>'Home', 'url'=>Yii::app()->homeUrl) 

Это помогает, если ваш baseUrl не ваш homeUrl.

+0

Круто!Как ни странно, я долго искал подобные решения и не мог найти ничего. Угадай, что я единственный, кто путешествует по этому обочине. –

0

получить абсолютный WebRoot URL, и лишить HTTP [с]: //

array('label'=>'Home', 'url'=>Yii::app()->getBaseUrl(true)),