2013-04-12 6 views
2

J'ai mis en place un menu dans Yii (mon premier projet utilisant) comme ceci:Yii CMenu Widget - Comment obtenir Page d'accueil

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

Chacun de ces chemins d'URL, tels que /exemples est un itinéraire défini dans ma config afin qu'il ne ressemble pas site/exemples.

Pour le lien Accueil, j'essaie d'obtenir simplement un lien vers le niveau racine du site. Apparemment, le widget CMenu passe l'URL par CHtml::normalizeUrl() en premier ce qui finit par le faire pointer sur la page en cours. Donc, si je suis sur la page des exemples, le lien de la maison pointe à /exemples.

C'est ce que normalizeUrl() dit qu'il fait:

Si le paramètre d'entrée est une chaîne vide, l'URL demandée actuellement sera retourné.

Si le paramètre d'entrée est une chaîne non vide, il est traité comme une URL valide et sera renvoyé sans aucune modification.

Si le paramètre d'entrée est un tableau, il est traité comme une route de contrôleur et une liste de paramètres GET, et la méthode CController :: createUrl sera invoquée pour créer une URL.

J'ai essayé de passer une chaîne vide et elle pointe vers l'URL de la requête en cours comme prévu. J'ai essayé de passer "/" qui est une chaîne non-vide et points toujours à l'URL de la requête en cours. J'ai également essayé de lui passer un tableau et il meurt avec trim() expects parameter 1 to be string, array given parce que le CMenu attend une chaîne. J'essaie de faire les choses de la manière Yii mais je suis sérieusement sur le point de laisser le menu statique s'il ne peut pas répondre à quelque chose d'aussi simple que de retourner à la page d'accueil. Comment puis-je faire en sorte que le widget CMenu de Yii crée un lien vers "/" ou vers le domaine de base?

Répondre

4

Lorsque vous utilisez tableau comme url il va essayer de créer url basé sur la configuration de votre routeur, mais si vous passez chaîne comme param il sera passé littéralement, à savoir:

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

Oh, et c'est la règle pour tous les endroits où vous pouvez utiliser l'URL.

+1

cool C'est exactement ce que je voulais. Merci! –

+0

quel fichier devrais-je mettre cela? – David

+0

Vous pouvez mettre cet extrait dans n'importe quel fichier –

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

Cette solution fonctionne aussi bien, merci! –

2

Une autre option

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

Cela aide si votre baseUrl est pas votre homeUrl.

+0

Cool!Curieusement, j'ai cherché des solutions comme celle-ci pendant un moment et je n'ai rien trouvé. Je suppose que je suis le seul à trébucher sur ce trottoir. –

0

obtenir une URL absolue de Webroot, et la bande de http [s]: //

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