Bonjour à tous
Je suis en train de faire un site internet qui remplacera un site codé par les pieds via wordpress.
Je dispose d'une table respectant les conventions cakephp. Voici ma table:
Je souhaite concevoir un menu html de cette forme:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 CREATE TABLE IF NOT EXISTS `pages` ( `id` int(255) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `slug` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `content` longtext COLLATE utf8_unicode_ci NOT NULL, `lft` int(255) NOT NULL, `rght` int(255) NOT NULL, `parent_id` int(255) NOT NULL, `online` int(11) NOT NULL, `menu_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `left` (`lft`), KEY `rght` (`rght`), KEY `parent_id` (`parent_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
En recherchant sur internet, j'ai trouvé une méthode mais cette dernière, est pour moi, un peu de bricolage. Voici comment je procède.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <ul> <li><a>niveau 1</a></li> <li><a>niveau 2</a><ul> <li><a>niveau 2.1</a></li> <li><a>niveau 2.2</a></li> </ul> <li><a>niveau 3</a></li> </ul>
Dans mon fichier PagesController.php:
Dans ma vue index du model page:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 <?php function index() { $d = array(); $d['menu'] = $this->getMenu( $this->Page->find('all', array( 'order' => array('Page.lft ASC'), 'conditions' => array('Page.menu_id' => 1), ) ) ); $this->set('menu', $d['menu']); $this->render('index'); } function getMenu($data) { $d = array(); foreach($data as $cat) { if($cat["Page"]["parent_id"] == 0){ $d['pages'][] = $cat["Page"]; }else{ $d['ss-pages'][] = $cat["Page"]; } } return $d; } ?>
Dans mon layout, j'appelle mon menu de cette manière:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 <?php $ci = 0; $pages = $menu['pages']; $ss_pages = $menu['ss-pages']; foreach($pages as $cat): if($ci != $cat["id"]): $ci = $cat["id"]; echo "<li><a href=\"\">"; echo $cat['name']."</a>"; echo "<ul class=\"ssmenu\">"; foreach($ss_pages as $ssC): if($cat["id"] == $ssC["parent_id"]): echo "<li><a href=\"#\">".$ssC['name']."</a>"; endif; endforeach; echo "</ul>"; echo "</li>"; endif; endforeach; ?>
Cela marche, mais je trouve que cette méthode est un peu "moche" à mon goût.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <?php echo $this->requestAction(array('controller' => 'pages', 'action' => 'index')); ?>
J'ai trouvé qu'il existe un helper treehelper sur le net: https://github.com/CakeDC/utils/blob...TreeHelper.php qui permet de récupérer la même structure html, sauf pas de système de lien. J'ai fait de essaie avec ces codes sources suivantes:
Fonction nav de mon controller pages:
Mon element nav.ctp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 <?php function nav(){ $pages = $this->Page->find('all', array( 'order' => array('Page.lft ASC'), 'conditions' => array('Page.menu_id' => 1), ) ); return $pages; } ?>
et dans mon layout:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <?php $pages = $this->requestAction(array('controller' =>'pages', 'action'=>'nav', 'admin'=>false)); ?> <?php echo $this->Tree->generate($pages, array( 'model'=>'Page', 'type'=>'ul', ) ); ?>
Auriez vous un helper ou des astuces à me conseiller dans le but de réaliser ma structure html que je souhaite?
Code : Sélectionner tout - Visualiser dans une fenêtre à part <?php echo $this->element('nav'); ?>
Merci d'avance.
lemirandais
Partager