Salut à tous!

J'ai besoin de vos lumières..
J'ai conçu un MVC grâce à la série de tutos présent sur le site de Graph, et je tente de l'améliorer petit à petit histoire de parfaire mes connaissances ;)

Je cherche actuellement à concevoir un sous-menu, et je commence à m'embrouiller je crois...
Voici ce que j'ai tenté:

Au niveau de ma base de données, j'ai ajouté un champ id_post, qui est en clé étrangère et qui référence le champ id de la table posts.
Ainsi, les élément qui correspondent bien au menu ont un id_posts null, et les élément correspondant au sous menu ont un id_posts valant 3, liant donc à l'id 3 de ma table.

Ensuite, dans mon layout par défaut, actuellement j'ai laissé la fonction telle qu'elle existe déjà dans le tutos:

<ul class="nav navbar-nav">
    <?php $pagesMenu = $this->request('Pages','getMenu'); ?>
    <?php foreach($pagesMenu as $p): ?>
    <li>
        <a href="<?php echo Router::url('pages/view/id:'.$p->id.'/slug:'.$p->slug); ?>" title="<?php echo $p->name; ?>"><?php echo $p->name; ?></a>
    </li> 
    <?php endforeach; ?>
</ul>

Enfin, j'ai modifié la fonction getMenu de mon PagesController.php. C'est elle qui gère donc les menus à la base:

function getMenu(){
    $this->loadModel('Post');
    return $this->Post->find(array(
        'conditions' => array('online' => 1,'type'=>'page','id_posts' => null)
    ));
}

J'espérais qu'en mettant cela, ça n'afficherait dans mon menu que les pages dont le champ id_posts serait null.
Ensuite, je pensais tout simplement créer une petit fonction dans le même style, pour afficher mon sous-menu...

Hélas, cela ne fonctionne pas. Aucun élément du menu ne s'affiche, et je n'ai pas de message d'erreur...

Voilà, j'essaye de comprendre mon erreur, peut être faut-il également modifier quelque chose dans un autre fichier du projet?
Je ne sais pas, donc si quelqu'un pouvait m'apporter un peu d'aide afin de capter mon erreur, ça serait bien cool.

D'avance merci!

30 réponses


Bahamut45
Réponse acceptée

Bonjour,

Ne vous inquietez pas, on va y arriver :

<ul class="nav navbar-nav">
    <?php $pagesMenu = $this->request('Pages','getMenu'); ?>
    <?php foreach($pagesMenu as $p): ?>
        <?php if (!empty($p->Subpage)): ?> //on vérifie si subpage est différent de vide
              <li class="dropdown">
                   <a href="#" class="dropdown-toggle" data-toggle="dropdown"><?php echo $p->name; ?><b class="caret"></b></a>
                   <ul class="dropdown-menu">                  
            <?php
                $subpages = explode('|',$p->Subpage); // on explode sur le pipe pour récuperer les ensembles de chaines
                foreach ($subpages as $subpage){ // on boucle sur le array de l'explode
                    $sub = explode(',',$subpage); // on explode sur la virgule pour récupérer les éléments de la chaines
            ?>
                        <li><a href="<?php echo Router::url('pages/view/id:'.$sub[0].'/slug:'.$sub[2]); ?>" title="<?php echo $sub[1] ?>"><?php echo $sub[1]; ?></a></li>
            <?php
                }
            ?>
                  </ul>
              </li>
        <?php else: ?> // si subpage est vide, on construit le menu normalement
             <li>
                 <a href="<?php echo Router::url('pages/view/id:'.$p->id.'/slug:'.$p->slug); ?>" title="<?php echo $p->name; ?>"><?php echo $p->name; ?></a>
             </li> 
        <?php endif ?>
    <?php endforeach; ?>
</ul>

Cordialement

Bonjour,

En sql tu ne peux pas faire de recherche sur un champ null via un where avec les opérateurs normal, il faut utiliser is null ou is not null, donc la condition est la suivante :

Select * FROM Posts WHERE online = 1 and id_posts is null

Cordialement

caema
Auteur

Le soucis, c'est que pour la fonction getMenu, comme vous pouvez le voir dans le code source que j'ai mis, on ne fait pas de requête sql...
J'ai beau regarder tout mon code, je ne vois pas comment transformer la requête dont vous me parler pour l'avoir sous forme d'une condition comme je dois l'utiliser dans la fonction getMenu...

Désolée :(

Bonjour,

Peut tu me copier la fonction find de ton Model.php ?

Le mien étant énormément modifier je ne sais plus ce qu'il y a à la base.

Cordialement

caema
Auteur

Bien sur ;)

Voilà la fameuse fonction find:

public function find($req = array()){
        $sql = 'SELECT ';
        if(isset($req'fields'])){
            if(is_array($req'fields'])){
                $sql .= implode(', ',$$req'fields']);
            }else{
                $sql .= $req'fields']; 
            }
        }else{
            $sql.='*';
        }
        $sql .= ' FROM '.$this->table.' as '.get_class($this).' ';
        // Liaison
        if(isset($req'join'])){
            foreach($req'join'] as $k=>$v){
                $sql .= 'LEFT JOIN '.$k.' ON '.$v.' '; 
            }
        }
        // Construction de la condition
        if(isset($req'conditions'])){
            $sql .= 'WHERE ';
            if(!is_array($req'conditions'])){
                $sql .= $req'conditions']; 
            }else{
                $cond = array(); 
                foreach($req'conditions'] as $k=>$v){
                    if(!is_numeric($v)){
                        $v = '"'.mysql_real_escape_string($v).'"'; 
                    }

                    $cond] = "$k=$v";
                }
                $sql .= implode(' AND ',$cond);
            }
        }
        if(isset($req'order'])){
            $sql .= ' ORDER BY '.$req'order'];
        }

        if(isset($req'limit'])){
            $sql .= ' LIMIT '.$req'limit'];
        }
        $pre = $this->db->prepare($sql); 
        $pre->execute(); 
        return $pre->fetchAll(PDO::FETCH_OBJ);
    }

C'est effectivement ici qu'on traite les requêtes sql, ça doit donc bien être ici qu'il y a des choses à modifier, mais je suis un peu paumée dans la construction...

Bonjour,

Si tu analyse la construction de la condition, tu remarque une chose, ta variable $req[conditions] si ce n'est pas un tableau tu peux construire ta requête comme tu veux.

function getMenu(){
    $this->loadModel('Post');
    return $this->Post->find(array(
        'conditions' => array('online' => 1,'type'=>'page','id_posts' => null)
    ));
}

Devient

function getMenu(){
    $this->loadModel('Post');
    return $this->Post->find(array(
        'conditions' => 'online = 1 AND type = "page" AND id_posts IS NULL'
    ));
}

Cordialement

caema
Auteur

Super, ça fonctionne nickel comme ça.
Reste plus qu'à construire une requête pour afficher le sous menu, et ça sera bon!

merci ;-)

Bonjour,

Pour les sous menus, c'est la même requête tu as juste à modifier ta condition comme ça :

function geSubtMenu(){
    $this->loadModel('Post');
    return $this->Post->find(array(
        'conditions' => 'online = 1 AND type = "page" AND id_posts IS NOT NULL'
    ));
}

Cordialement

caema
Auteur

J'ai réalisé exactement la même condition, j'essaye d'intégrer tout ça dans mon default.php maintenant:

<div class="navbar-collapse collapse">
                    <ul class="nav navbar-nav">
                        <?php $pagesMenu = $this->request('Pages','getMenu'); ?>
                        <?php foreach($pagesMenu as $p): ?>
                            <li>
                                <a href="<?php echo Router::url('pages/view/id:'.$p->id.'/slug:'.$p->slug); ?>" title="<?php echo $p->name; ?>"><?php echo $p->name; ?></a>
                            </li> 
                        <?php endforeach; ?>
                    </ul>
                </div><!--/.nav-collapse -->

je suppose qu'il faut que je mette en place un if et un else pour définir les différents cas?

caema
Auteur

Bon, après avoir fouillé le web, je n'y arrive toujours pas...
Quelqu'un pour m'aider à construire ma boucle foreach afin de bien afficher le sous menu dans l'élément qui lui correspond?

Bonjour,

Fais moi un sqlfiddle de l'etat de ta table post.

Quel affichage tu veux un dropdown par sous menu ?

Cordialement

caema
Auteur

Bonsoir,

Je n'ai jamais utilisé sqlfiddle, une petite explication rapide peut-être?
Désolée... je viens de regarder sur Google, et rien trouvé de concluant...

Merci de votre aide

Bonjour,

Pour utiliser sqlfiddle, il te suffit de faire un export de ta table posts via phpmyadmin par exemple (en demandant à phpmyadmin de ne montrer que le resultat et non de le sortir dans un fichier), tu colle le résultat dans le panneau de gauche de sqlfiddle et tu clique sur build schéma ;) et après tu me donne l'url.

Exemple Test

Cordialement

caema
Auteur

Bonjour,

Bon, et bien voici le sqlfiddle de ma table posts: ma table posts...
Ensuite, pour le menu déroulant, je souhaite quelques chose de similaire: exemple de menu déroulant puisque j'utilise en effet la nouvelle version du bootstrap de Twitter.

Enfin, grand merci à vous de m'aider! C'est super de partager votre savoir ;)

Bonjour,

Bon pour l'instant je t'ai fait ça rien quand sql après je connais pas ton niveau en php mais je pense que tu peux comprendre ce que je veux faire. Malheuresement cette méthode a une importante contrainte, elle ne gère pas les sous sous pages en gros les deuxiemes niveaux de pages du dropdown.

Cordialement

caema
Auteur

Bonjour,

J'ai une grosse journée aujourd’hui, mais je regarde ça dès que j'ai 5 minutes.
En gros, je vais devoir construire une requête similaire à ce que vous me proposez, dans mon pagescontroller, c'est bien cela?
En ce qui concerne les deuxièmes niveaux de pages, je n'en aurai pas besoin donc ça ne pose pas vraiment de soucis...

Bon, sinon, j'ai trouvé ceci aussi: Site de A à Z implémenter un menu arborescent dynamique, sur le forum de Graph.
Ca m'obligerais à créer une nouvelle table, mais apparemment c'est fonctionnel également.
Désolée, j'ai trouvé ça "à retardement", tard hier soir, j'étais passée à côté pourtant j'avais fait une recherche dans le forum mais bon...

caema
Auteur

Bon, et bien après quelques jours, j'en suis toujours au même point.

Sur base de ce qui a déjà été fait dans la fonction find de Model.php, j'ai réalisé une fonction qui s'occuperait uniquement du menu:

/**
** Permet la sélection pour le menu
**/
public function menu($req = array()){
    $sqlMenu = 'SELECT ';
    if(isset($req'fields'])){
       if(is_array($req'fields'])){
      $sqlMenu .= implode(', ',$req'fields']);
       }else{
       $sqlMenu .= $req'fields'];
       }
    }else{
    $sqlMenu .= '*';
    }
    $sqlMenu .= ' FROM '.$this->table.' as '.get_class($this).' ';
        //Concat:
    if(isset($req'concat'])){
        $sqlMenu .= ' GROUP_CONCAT '.$req'concat'];
    }
        //Liaison:
    if(isset($req'join'])){
            foreach($req'join'] as $k->$v){
        $sqlMenu .= 'LEFT JOIN '.$k.' ON '.$v.' ';
        }
    }
    // Construction de la condition:
        if(isset($req'conditions'])){
             $sqlMenu .= 'WHERE ';
         if(!is_array($req'conditions'])){
                 $sqlMenu .= $req'conditions']; 
         }else{
         $cond = array(); 
         foreach($req'conditions'] as $k=>$v){
                     if(!is_numeric($v)){
            $v = '"'.mysql_real_escape_string($v).'"'; 
             }
             $cond] = "$k=$v";
         }
         $sqlMenu .= implode(' AND ',$cond);
            }
     }
     //Group:
     if(isset($req'group'])){
         $sqlMenu .= ' GROUP BY '.$req'group'];
     }
     $pre = $this->db->prepare($sqlMenu);
     $pre->execute();
     return $pre->fetchAll(PDO::FETCH_OBJ);
}

Déjà ici, je pense qu'il y a des erreurs... Je n'ai jamais utilisé le concat (j'en connaissais même pas l'existence pour tout dire) et c'est chaud pour moi de préparer cette requête.
Si quelqu'un a donc des sources afin que je capte le truc, je suis preneuse: je suis tellement perdue que je ne sais pas si je dois rechercher des infos sur les requêtes préparées ou autre chose...

Ensuite, dans mon PagesController, j'ai donc fait ceci:

function getMenu(){
    $this->loadModel('Post');
    return $this->Post->menu(array(
        'conditions'    => 'online = 1 AND type = "page" AND post_id IS NULL',
        'concat' => 'post_id.id, post_id.name, post_id.slug',
        'join' => array('posts as post_id' => 'post.id=Post.post_id'),
        'group' => 'Post.id'
     ));
}

Malheureusement, j'ai 3 erreurs, toutes liées à ce bout de code, et plus précisément la ligne du foreach:

if(isset($req'join'])){
   foreach($req'join'] as $k->$v){
       $sqlMenu .= 'LEFT JOIN '.$k.' ON '.$v.' ';
   }
}

Les erreurs:

  • Undefined variable: v

  • Creating default object from empty value

  • Cannot access empty property

Je comprends qu'il y a un soucis avec la variable $v qui semble vide, mais je ne sais pas pourquoi ni comment, et pour ne rien arranger je suis de plus en plus paumée dans ce problème qui ne dois pas être insoluble, mais qui me prends la tête depuis... plus d'une semaine.

D'avance merci aux lecteurs qui pourront m'expliquer mon erreur et/ou partager des lectures ou tuto pour que je comprenne le truc

Bonjour,

Hum déjà il y a un problème, un group concat se fait comme ce que j'ai marqué dans le sqlfiddle, après les fields et avant le FROM, après je pense qu'il faut que tu réfléchisse à comment fonctionne le foreach de ta variable join, indice la construction d'un foreach est pas bonne.

Cordialement

caema
Auteur

Bonjour,

J'ai revu la construction de me requête. J'ai toujours une erreur de syntaxe dans cette requête (PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064) mais ça avance puisque je n'ai pas d'autre erreur...

Si je mets un

die($sqlMenu);

, la requête qui est rendue est la suivante:

SELECT *, GROUP_CONCAT (post_id.id, post_id.name, post_id.slug SEPARATOR |)as Subpage FROM posts as Post LEFT JOIN posts as post_id ON post.id=post_id.post_id WHERE online = 1 AND type = "page" AND post_id IS NULL GROUP BY Post.id

Je vous avoue ne pas savoir exactement où se situe l'erreur dans ma requête...
Voici ma fonction menu revisitée:

public function menu($req = array()){
        $sqlMenu = 'SELECT ';
        if(isset($req'fields'])){
            if(is_array($req'fields'])){
                $sqlMenu .= implode(', ',$req'fields']);
            }else{
                $sqlMenu .= $req'fields'];
            }
        }else{
            $sqlMenu .= '*';
        }
        //Concat:
        if(isset($req'concat'])){
            $sqlMenu .= ', GROUP_CONCAT ('.$req'concat'].' SEPARATOR |)'.'as Subpage';
        }
        //FROM (depuis la table ...):
        $sqlMenu .= ' FROM '.$this->table.' as '.get_class($this).' ';

        //Liaison:
        if(isset($req'join'])){
            foreach($req'join'] as $k=>$v){
                $sqlMenu .= 'LEFT JOIN '.$k.' ON '.$v.' ';
            }
        }
        // Construction de la condition:
        if(isset($req'conditions'])){
            $sqlMenu .= 'WHERE ';
            if(!is_array($req'conditions'])){
                $sqlMenu .= $req'conditions']; 
            }else{
                $cond = array(); 
                foreach($req'conditions'] as $k=>$v){
                    if(!is_numeric($v)){
                        $v = '"'.mysql_real_escape_string($v).'"'; 
                    }

                    $cond] = "$k=$v";
                }
                $sqlMenu .= implode(' AND ',$cond);
            }
        }
        //Group:
        if(isset($req'group'])){
            $sqlMenu .= ' GROUP BY '.$req'group'];
        }
        die($sqlMenu);
        $pre = $this->db->prepare($sqlMenu);
        $pre->execute();
        return $pre->fetchAll(PDO::FETCH_OBJ);
    }

Au niveau de ma fonction getMenu, j'ai maintenant ceci:

function getMenu(){
        $this->loadModel('Post');
        return $this->Post->menu(array(
            'concat' => 'post_id.id, post_id.name, post_id.slug',
            'join' => array('posts as post_id' => 'post.id=post_id.post_id'),
            'conditions'    => 'online = 1 AND type = "page" AND post_id IS NULL',
            'group' => 'Post.id'
        ));
    }

(notez que j'ai révisé ma table, et le champ autrefois appelé ID_POSTS a été renommé en post_id pour plus de logique par rapport aux autres champs)

Voilà, peut-on me dire si je suis dans le bon?

Merci ;)

PS: désolée de répondre "en décalé", mais j'ai de gros soucis pour poster sur le forum

Bonjour,

Ton probleme est à ce niveau la :

'join' => array('posts as post_id' => 'post.id=post_id.post_id'),

Je pense qu'il faut vraiment que tu regarde la fonction as de mysql, as sert à donner un alias à une table ou un champ, mais si tu met un alias qui correspond à un champ automatiquement mysql ne sait plus ou il en est.

Je vois que tu avance et c'est positif ... Mais quand on se lance dans un projet comme celui ci pense toujours à faire des functions qui s'adaptent à ton besoin mais surtout au fait qu'il est préférable de donner un maximum d'option à sa fonction pour pouvoir la réutiliser dans un autre cas.

Cordialement

caema
Auteur

Bonsoir,

Après vous avoir lu, je me suis renseignée sur les requêtes JOIN, et j'ai lu que pour réaliser une jointure d’une table avec elle-même il faut passer par les alias.
Histoire de ne pas m'embrouiller j'ai donc repris ma fonction, en essayant de respecter au plus près celle que vous m'avez fournies dans SQL Fiddle:

Voici donc la fonction:

public function menu($req = array()){
        $sqlMenu = 'SELECT ';
        if(isset($req'fields'])){
            if(is_array($req'fields'])){
                $sqlMenu .= implode(', ',$req'fields']);
            }else{
                $sqlMenu .= $req'fields'];
            }
        }else{
            $sqlMenu .= '*';
        }
        //Concat:
        if(isset($req'concat'])){
            $sqlMenu .= ', GROUP_CONCAT ('.$req'concat'].' SEPARATOR \'|\')'.' as Subpage ';
        }
        //FROM (depuis la table ...):
        $sqlMenu .= ' FROM '.$this->table.' as a ';

        //Liaison:
        if(isset($req'join'])){
            foreach($req'join'] as $k=>$v){
                $sqlMenu .= 'LEFT JOIN '.$k.' ON '.$v.' ';
            }
        }
        // Construction de la condition:
        if(isset($req'conditions'])){
            $sqlMenu .= 'WHERE ';
            if(!is_array($req'conditions'])){
                $sqlMenu .= $req'conditions']; 
            }else{
                $cond = array(); 
                foreach($req'conditions'] as $k=>$v){
                    if(!is_numeric($v)){
                        $v = '"'.mysql_real_escape_string($v).'"'; 
                    }

                    $cond] = "$k=$v";
                }
                $sqlMenu .= implode(' AND ',$cond);
            }
        }
        //Group:
        if(isset($req'group'])){
            $sqlMenu .= ' GROUP BY '.$req'group'];
        }
        $pre = $this->db->prepare($sqlMenu);
        $pre->execute();
        return $pre->fetchAll(PDO::FETCH_OBJ);
    }

J'ai toujours la même erreur:
PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax
mais elle semble commencer au niveau de mon separator, puisque le code repris dans mon erreur est le suivant :
right syntax to use near 'SEPARATOR '|') as Subpage FROM posts as a LEFT JOIN posts as b ON a.id=b.post_i' at line 1

Qui plus est, j'ai un array vide donc, on est toujours en face d'une erreur SQL.

Dans mon PagesController, ma fonction:

function getMenu(){
        $this->loadModel('Post');
        return $this->Post->menu(array(
            'concat' => 'b.id, b.name, b.slug',
            'join' => array('posts as b' => 'a.id=b.post_id'),
            'conditions' => 'online = 1 AND type = "page" AND post_id IS NULL',
            'group' => 'a.id'
        ));
    }

Pourtant, la requête sql rendue est la suivante et me semble bonne, non?:

SELECT *, GROUP_CONCAT (b.id, b.name, b.slug SEPARATOR '|') as Subpage 
FROM posts as a LEFT JOIN posts as b ON a.id=b.post_id 
WHERE online = 1 AND type = "page" AND post_id IS NULL 
GROUP BY a.id

Bien à vous!

Bonjour,

Non le rendu est pas le meme que dans sqlfiddle :

SELECT *, GROUP_CONCAT (b.id, b.name, b.slug SEPARATOR '|') as Subpage 
FROM posts as a LEFT JOIN posts as b ON a.id=b.post_id 
WHERE online = 1 AND type = "page" AND post_id IS NULL 
GROUP BY a.id

SELECT a.*, GROUP_CONCAT(b.id,',',b.name,',', b.slug SEPARATOR '|') as Subpage
FROM posts as a
LEFT JOIN posts as b ON a.id = b.id_posts
WHERE a.TYPE = 'page' AND a.online = 1 AND a.ID_POSTS is NULL
GROUP BY a.id;

Cordialement

caema
Auteur

Ok, j'ai revérifié et j'dois être myope pour le moment, c'est juste pas possible autrement...
Bon, soit maintenant j'ai ma requête bien formée:
je n'ai plus d'erreur, et par ailleurs, si je fais un

die($sqlMenu);

et que je copie colle la requête qui m'est renvoyée dans phpMyAdmin, j'ai exactement le même résultat que dans le SQL Fiddle.

Maintenant se pose la question de comment afficher menu et sous-menu dans mon layout par défaut.
Actuellement, j'ai ceci:

<ul class="nav navbar-nav">
    <?php $pagesMenu = $this->request('Pages','getMenu'); ?>
    <?php foreach($pagesMenu as $p): ?>
         <li>
             <a href="<?php echo Router::url('pages/view/id:'.$p->id.'/slug:'.$p->slug); ?>" title="<?php echo $p->name; ?>"><?php echo $p->name; ?></a>
         </li> 
    <?php endforeach; ?>
</ul>

Le résultat: les éléments de mon menu s'affichent, mais pas encore ceux du sous-menu.

Dois-je utiliser cette fameuse concaténation "Subpage", et si oui comment? C'st quelque chose que je n'ai jamais fait.

Merci ;-)

caema
Auteur

J'ai toujours besoin d'aide à ce sujet donc...
Merci à vous!

Bonjour,

Bon le principe de la concaténation est d’éviter de faire plein de sous requête et donc d'avoir une utilisation abusive du moteur mysql.
Pour parcourir les éléments concaténés, on utilise un séparateur et donc avec un explode tu peux parcourir tes groupes de chaines d'abord la séparation avec le pipe | et ensuite un sous explode pour la séparation de virgule. Avec le résultat de ces deux explodes tu peux construire ton sous menus.

Je viens de te donner la théorie afin que tu puisse améliorer ton niveau de php, je te laisse avec cette énoncé pour que tu me donne ta logique de compréhension.

Cordialement

caema
Auteur

Bonjour,

Pour être certaine d'avoir bien tout capté, j'ai revu la doc de PHP.
Explode est utilisé pour retourner un tableau d'une chaîne de caractères.

Donc, pour commencer, j'ai tenté de récupérer la chaîne de caractères qui correspond à Subpage.
Pour cela, dans mon layout par défaut, j'ai fait ceci:

<?php 
    $pagesMenu = $this->request('Pages','getMenu');
    $subpage = debug($pagesMenu[2]->Subpage);
?>

ce qui me retourne bien ma chaîne de caractères, à savoir:
9,Consultations spécialisées oiseaux,consultations-specialisees-oiseaux|10,Ostéopathie,osteopathie|11,Aromathérapie,aromatherapie

En principe, jusque là je suis dans le bon je pense (arrêtez moi si je me trompe lol).

Ensuite, j'ai réalisé un premier explode de ma variable $subpage, via le pipe.
En toute logique, cela devrait donc me rendre un tableau.
J'ai donc fait:

print_r(explode('|',$subpage,0));

Saut que cela me retourne array([0]=>)

Bref, un array vide...

Donc voilà, j'essaye de capter, mais je ne vois pas trop mon erreur là.

Merci pour votre aide

Bonjour,

Difficile de faire un suivi correct, en s'aidant à partir d'un forum ...

Pourquoi dans ton explode utilise tu le troisième paramètre ?

Pour moi tu n'avais pas à faire comme ça mais directement dans ton foreach :

<ul class="nav navbar-nav">
    <?php $pagesMenu = $this->request('Pages','getMenu'); ?>
    <?php foreach($pagesMenu as $p): ?>
        <?php if (!empty($p->Subpage)): ?> //on vérifie si subpage est différent de vide
            <?php
                $subpage = explode('|',$p->Subpage); // on explode sur le pipe pour récuperer les ensembles de chaines
                debug($subpage); .// on debug pour voir si on recupère bien un tableau.
            ?>
        <?php else: ?> // si subpage est vide, on construit le menu normalement
             <li>
                 <a href="<?php echo Router::url('pages/view/id:'.$p->id.'/slug:'.$p->slug); ?>" title="<?php echo $p->name; ?>"><?php echo $p->name; ?></a>
             </li> 
        <?php endif ?>
    <?php endforeach; ?>
</ul>

Donne moi le résultat de ça pour voir.

Cordialement

caema
Auteur

Effectivement, pas toujours facile d'aider via forum, mais je te remercie de tenter tout de même de le faire ;)

Bon, alors j'ai fait le test avec le code que tu m'as expliqué, et le résultat, c'est que j'ai bien les éléments de mon menus, hormis celui qui contient les éléments du sous-menu.
Donc en gros, je n'ai pas l'item "nos services" ni ceux du sous-menu.

Il faut également penser que pour mon item "nos services", je vais avoir besoin de quelques éléments spécifiques (cfr bootstrap twitter):

<li class="dropdown">
    <a href="#" class="dropdown-toggle" data-toggle="dropdown">Nos services <b class="caret"></b></a>
    <ul class="dropdown-menu">
        <li><a href="#">Consultations spécialisées oiseaux</a></li>
    <li><a href="#">Ostéopathie</a></li>
    <li><a href="#">Aromathérapie</a></li>
    </ul>
</li>

Etant donné que mon debug est toujours à 1 pour le besoin de mes tests, en ce qui concerne le

debug($subpage)

, j'ai un array qui est rendu, comme ceci:
Array
(
[0] => 9,Consultations spécialisées oiseaux,consultations-specialisees-oiseaux
[1] => 10,Ostéopathie,osteopathie
[2] => 11,Aromathérapie,aromatherapie
)

Voilà où ça en est. Mais franchement, je suis étonnée de la difficulté concernant quelque chose d'aussi courant qu'un sous-menu lol

caema
Auteur

Super, ça fonctionne nickel!
Merci à toi d'avoir effectué un si bon suivi pour mon problème, c'est très aimable à toi!

Bonjour,

Content que ça fonctionne.

N'oublie pas de valider la réponse qui corrige ton probleme ;)

Cordialement