Bonjour j'aimerai savoir pour ceux qui ont suivi les tutoriels sur la création d'un site web avec le framework cakephp , ya une petite partie que grafikart n'a pas traitée à savoir les pages qui ont des sous pages , le fameux système de menu déroulant donc comment faire pour si une page renvoi sur d'autres pages !

15 réponses


C'est vrais que j'y ai pensé et ai espéré qu'il passe sur celà dans une prochaine vidéo. Je suis intéressé de savoir comment on fait pour ces menu déroulant. Peut être créé une variable en base de donné qui serait "parent" qui pointerai sur l'id de la page parent et grace à ça on formerais le menu déroulant avec un système de foreach imbriqué suivant le nombre de hiérarchie on veut.. A voir ;)

Avec un champ "parent_id".
Dans ton listing dans le menu tu affiches les pages qui ont pour parent_id "null" ou "0", qui seront des pages principales ou juste des menus, à vous de voir ça. Et les sous pages vous affichez selon l'id de la page notée dans le parent_id.

Exemple vous avez 4 pages

Présentation, Personnel, Qui sommes-nous ?, Blog

pour la table pages vous avez par exemple :

pages:
id, name, content, parent_id

Et le contenu de la table donnerait :

1, "Présentation", "", 0
2, "Le personnel de la société", "ici on va afficher tout le personnel", 1
3, "Qui sommes-nous ?", "Présenation de la société", 1
4, "Blog", "Le contenu du blog", 0

Ici tu vois que les pages de personnel et de présentation sont des sous pages de Présentation, et que Présentation et Blog sont 2 pages principales. Donc dans ton menu tu affiches juste les pages avec le parent_id "0", soit Présentation et Blog, et dans le sous-menu de Présentation, tu affiches les 2 autres pages.

Je sais pas si je suis clair, c'est pas facile à expliquer rapidement :p

ndiayejp
Auteur

Donc dans le cas précis on aurait dans la table post(id,name,content,post_id)
post_id pour dire à quel id ce post se référé par défaut il vaut 0 ! par contre je sais pas trop si cakephp va automatiquement lors de création d'une nouvelle page afficher un sélect pour ce champ ! Dans le modèle page faudrait peut etre un hasMany
public $hasMany = array(
'post'=>array(
'dependent'=>true
));
Pas aussi simple ! Grafikart une idée

Pas post_id, mais bel et bien "parent_id", il ne faut pas mélanger les 2, et je crois que Cake lors de la création des models est tout à fait capable de détecter les parents/enfants.

ndiayejp
Auteur

ah si on déclare le champ parent_id de type int comment au niveau de la vue le client va pouvoir select la page mère !?? Faudrait il pluto pas dans un select afficher ts les pages qui ont un parent_id = 0

Si tu veux une arborescence simple avec 1 page peut être soit un enfant, soit un parent, c'est le plus simple en effet. Cependant, tu peux tout à faire lister l'intégralité des pages dans un select, et comme ça une page peut être un enfant d'un enfant d'un enfant d'un enfant, d'une page mère. Tout dépend de ton arborescence souhaitée.

Mais je répondais surtout au début de ton post :

"Donc dans le cas précis on aurait dans la table post(id,name,content,post_id)
post_id pour dire à quel id ce post se référé par défaut il vaut 0 !"

Ta table serait bel et bien post(id,name,content,parent_id). Pour que Cake comprenne mieux et pour respecter une convention établie pour s'y retrouver plus facilement, le champ qui lie une mère à sa fille et vice-versa doit s'appeler "parent_id" et non pas "post_id".
Cake lors de la génération va te détecter "HasMany children" (faudrait que je retrouver la formulation exacte) en mettant "parent_id", alors que si tu mets "post_id" il cherchera à te lier entre 2 tables différentes. Le résultat est plus ou moins le même mais c'est question de clarté. Dans ce cas là ça ne dérange pas forcément vu que l'exemple est simple et que le site ne possède pas beaucoup de table, mais tu peux vite t'y perdre avec beaucoup plus. Alors que si tu mets vraiment un "parent_id", tu sais que la liaison est interne à la table.

ndiayejp
Auteur

Ok je vais essayer de coder ça pour voir ce que ça donne je reviens vers toi si je coince !

ndiayejp
Auteur

J'ai essaye dans le Modele Post de mettre
var $belongsTo = array(
'ParentPost' =>
array('className' => 'Post',
'foreignKey' => 'parent_id'
),
);

var $hasMany = array(
'ChildPost' =>
array('className' => 'Post',
'foreignKey' => 'parent_id'
),
);

J'ai fais vite fais une génération de model par cake, je trouve le code suivant dans le model pour une table Page avec un champ parent_id :

/**
 * belongsTo associations
 *
 * @var array
 */
    public $belongsTo = array(
        'ParentPage' => array(
            'className' => 'Page',
            'foreignKey' => 'parent_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );
/**
 * hasMany associations
 *
 * @var array
 */
    public $hasMany = array(
        'ChildPage' => array(
            'className' => 'Page',
            'foreignKey' => 'parent_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );

Avec quelques données insérées et une requête simple d’effectuée, il me retourne bien mes pages comme ça.

Je sais pas si ça résoudra ton problème vu que les 2 modèles semblent identiques à part le nom du Model, mais bon ^^; Je vois vraiment pas d'ou vient ton problème du coup :/

Faire des boucles et insérer du java script de menu déroulant... Tu lui donne des id et du css et le tour est joué non?

ndiayejp
Auteur

<?php
class Post extends AppModel {
var $name = 'Post';
var $belongsTo = array(
'Parent' => array(
'className' => 'Post',
'foreignKey' => 'parent_id'
) );
var $hasMany = array(
'Children' => array(
'className' => 'Post',
'foreignKey' => 'parent_id'
) );}
?>
Au niveau de ma vue kan je mets <?php echo $this->Form->input('parent_id');?> aucune information s'affiche dans le select ! Help please

ndiayejp
Auteur

J'ai utilisé le TreeBehaviour pour résoudre le problème sauf que maintenant un autre probleme l'afichage sous forme de menu déroulant là j'ai du mal quelqu'un aurait il une idée !

pour l'affichage, une bonne dose de css et du js pour gérer les animations ^^

ndiayejp
Auteur

Finalement j'ai trouvé la solution pour gérer les sous pages des pages en utilisant les intervalles de cakephp pour ce qui sont intéressé je posterai une solution prochainement !

Pourquoi pas ^^ bien joué en tous cas ;)