Bonsoir,
plutôt habitué avec les css simples, je me met enfin à PHP et à cakePHP (ouaaais \o/ ), mais je rencontre un problème à l'utilisation des Helpers.
En effet, j'ai crée un Helper qui doit afficher un menu unique indiqué dans chaque Controller (pour lister les pages dispos du Controller courant donc). À noter que je n'ai que des pages statiques, je ne fais qu'un petit site sans prétention pour le moment :)
Voici mon helper (MenuHelper.php):
App::uses('AppHelper', 'View/Helper');
class MenuHelper extends Helper {
function show_menu() {
$menu_string = '<div id="header-page-title-submenu">
<ul>';
foreach($this->set($MenuController) as $item => $value) {
$menu_string .= '<li><a href="'.$this->Html->url('/TV/', true).''.$item'item'].'" title="">'.$item'value'].'</a></li>';
}
$menu_string.= '</ul>
</div>';
return $menu_string;
}
}
Voici mon TVController.php :
class TVController extends AppController {
$MenuController = array(
'index' => 'Index',
'contribution' => 'Proposer une vidéo'
);
public function index() {
}
public function contribution() {
}
}
et dans mon layout default:
<?php echo $this->Menu->show_menu(); ?>
J'ai des erreurs "Undefined variable: MenuController" , "Method MenuHelper::set does not exist" :/
J'ai essayé de m'appuyer sur des exemples de la doc officielle mais rien n'y fait, je dois vraiment être un boulet :(
Oula c'est anti mvc ce que tu veux faire. Le mieux c'est d'envoyer ta variable contenant le menu à la vue. Une bonne technique c'est d'utiliser le beforeFilter si tu le veux tout le temps :)
Tu pourrais très bien le faire en utilisant un élément, comme par exemple :
Dans ton controller ( TVController.php ):
<?php
App::uses('AppController', 'Controller');
class TVController extends AppController{
public function beforeFilter(){
parent::beforeFilter();
$menu = array(
'index' => 'Index',
'contribution' => 'Proposer une vidéo'
);
return $this->set(compact('menu'));
}
public function index(){
}
public function contribution(){
}
}
Dans l'élément menu (app/View/Elements/ menu.ctp ):
<div id="header-page-title-submenu">
<ul>
<?php foreach($menu as $item => $value): ?>
<li><?= $this->Html->link($value, array('controller'=>'TV', 'action'=>$item)); ?></li>
<?php endforeach; ?>
</ul>
</div>
Si tu ne veux pas que ce soit forcément sur le controller TV pour les liens mais récupérer le controller courant dans les liens :
<div id="header-page-title-submenu">
<ul>
<?php foreach($menu as $item => $value): ?>
<li><?= $this->Html->link($value, array('controller'=>$this->request->controller, 'action'=>$item)); ?></li>
<?php endforeach; ?>
</ul>
</div>
Et si tu veux aller plus loin en rajoutant une classe dans le li pour le lien de l'action courante :
<div id="header-page-title-submenu">
<ul>
<?php foreach($menu as $item => $value): ?>
<li<?php if($this->request->action == $item): echo ' class="active"'; endif; ?>>
<?= $this->Html->link($value, array('controller'=>$this->request->controller, 'action'=>$item)); ?></li>
<?php endforeach; ?>
</ul>
</div>
Dans ton layout default.ctp :
<?= isset($menu)?$this->element('menu'):''; ?>
J'ai testé et ça fonctionne bien, lorsque tu définies la variable menu dans le controller courant il t'affiche le menu, sinon il ne fait rien.
J'espère t'avoir fourni un peu d'aide.