Bonsoir à tous,
Je reprend un site que j'avais abandonné depuis un bon bout de temps par manque de temps et je me demande si la méthodologie que j'ai employé pour créer mon menu est la bonne. Voila, je veux créer un menu avec des rubriques et des soucis rubrique, voici un petit exemple:
<ul id="level">
<li class="level"><a href="/">Actualité</a>
<li class="level"><a href="/pages/view/1">Présentation de l'école</a>
<ul>
<li class="level1"><a href="/pages/view/2">Historique de l’école</a></li>
<li class="level1"><a href="/pages/view/3">Inscription à l'école</a></li>
<li class="level1"><a href="/pages/view/4">Règlement de l’école de Musique</a></li>
</ul>
</li>
<ul>
Hors, pour faire cela, j'ai l'impression que, pour faire ce menu, je fait beaucoup trop de traitement, en effet. Dans mon layout, j'appelle mon controller pour générer le menu.
<?php
echo $this->requestAction(array('controller' =>'pages', 'action'=>'index', 'admin'=>false));
?>
Voici l'action de mon controller "Pages":
public function index() {
$pages = $this->Page->find('threaded', array(
'conditions' => array('Page.menu_id' => 1),
'fields' => array(
'Page.id',
'Page.name',
'Page.slug',
'Page.parent_id'
),
'order' => array('Page.lft ASC'),
));
$this->set('pages', $pages);
$this->render('index');
}
Et enfin mon fichier view (pages/index):
<?php
echo $this->Menu->create($pages,
'level',
'',
'pages',
'view',
array(
0 => array('name' => 'Actualité',
'url' => '/'
),
),
array(
0 => array(
'name' => 'Contact',
'controller' => 'posts',
'action' => 'index'
),
)
);
Dans cette vue, je fais appel à un helper que j'ai créé, (à partir d'une base trouvé sur un autre forum. Ci dessous mon helper:
<?php
class MenuHelper extends AppHelper {
public $helpers = array('Html');
public function create($pages, $identifiant = 'level', $level = 1, $model = null, $action = null, $begin = null, $end = null) {
$res = "\n<ul";
if (!$level) {
$res .= " id=\"$identifiant$level\"";
}
$res .= ">";
if ($begin) {
foreach ($begin as $b) {
if (isset($b['url'])) {
$res .= "\n\t<li class=\"$identifiant" . "$level\">" . $this->Html->link($b['name'], $b['url']);
} else {
$res .= "\n\t<li class=\"$identifiant" . "$level\">" . $this->Html->link($b['name'], array('controller' => $b['controller'], 'action' => $b['action']));
}
}
}
foreach ($pages as $page) {
$res .= "\n\t<li class=\"$identifiant" . "$level\">" . $this->Html->link($page['Page']['name'], array('controller' => $model, 'action' => $action, $page['Page']['id']));
if (!empty($page['children'])) {
$res .= $this->create($page['children'], $identifiant, $level + 1, $model, $action);
}
$res .= "</li>";
}
if ($end) {
foreach ($end as $e) {
if (isset($e['url'])) {
$res .= "\n\t<li class=\"$identifiant" . "$level\">" . $this->Html->link($e['name'], $e['url']);
} else {
$res .= "\n\t<li class=\"$identifiant" . "$level\">" . $this->Html->link($e['name'], array('controller' => $e['controller'], 'action' => $e['action']));
}
$res .= "</li>";
}
}
$res .= "\n</ul>";
return $res;
}
}
?>
Pensez vous qu'il s'agit de la bonne solution? Est-ce vraiment optimiser au maximum? J'aimerais avoir votre avis à ce sujet.
Merci d'avance pour vos retours.
leknoppix
Bonsoir, en cherchant sur d'autres forums et en testant, j'ai trouvé un moyen de le faire sans requestAction, c'est à dire en utilisant un beforefilter et en utilisant un element menu, le chargement est plus rapide.
Je pense que je couplerais ma solution avec un cache et le tour sera joué.
Bonne soirée.