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 :(

2 réponses


Grafikart
Réponse acceptée

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 :)

Lartak
Réponse acceptée

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.