tout d'abords merci à Grafikart pour ses travaux.
apres m'être penché sur le principe de fonctionnement même d'un systeme MVC,il apparait que :

  • le model interagit(requette) avec la bdd et retourne un resultat.
  • le controller recupere les données renvoyées par le model et les passe à la vue;
  • la vue affiche les données reçues du controller à l'ecran.
    or dans le cadre de ce tuto le controller construit les requettes(ce qui devrait etre fait par le model) et les lance($this->find) via une classe model; resulat les classes model de chacune des applications sont vides.

est-ce qu'il ne faudrait pas au vu de ce qui précède, pour une application qui gère les menus du site par exemple procéder comme suit:

-----dans la classe modele (Menu.php)

/**
*recupere la liste des menus actifs
* exemple: mainmenu,footermenu,topmenu.......
**/
private function getList()
{
    $condition =array('online'=>1);
    if(!$this->findCount($condition)) return false;
    $params=array( 'fields'=>'id,name,active',
                    'conditions'=>$condition,
                    'orderby'=>array('field'=> 'id', 'direction'=>'asc'),                                           
                );
    $list = $this->find($params);
    if(!$list) return false;
    return $list;
}
/**
* charge pour chaque menu actif, la liste de toutes les pages actives
* exemple:
* pour mainmenu: (accueil,about, contact........)
* pour footermenu: (mention, cgv,confidentialité......)
**/
public function fetchAll()
    {
        $d = array();
        if(!$menus = $this->getList()) return false;
        $this->table='pages';
        foreach($menus as $menu)
        {   
        /*
        * premiere jointure
        */ 
        $i=0; //initialisation   
        $join$i]'table'] = 'menus';//nom de la table à joindre
    //  $join$i]'fields'] = 'id as menu'; //si vous souhaitez recuperer les données de certains champs de cette table, specifiez les ici
        $join$i]'type'] = 'l';//inner|left|right|outer|full|cross|leouter|riouter, : type de jointure dites moi si j'oublie qq chose
        $j=0; //initialisation
        $join$i]'rules']$j]'index'] = 'id';//champs de la table jointe sur la quelle sera basée la comparaison(filtre de jointure)
        $join$i]'rules']$j]'fktable'] = 'pages';//table contenant la clé étrangère et en fonction de laquelle se fera la jointure;
        $join$i]'rules']$j]'fkindex'] = 'menuid';//champ (la clé etrangere) nécessaire pour le tri      
        $join$i]'rules']$j]'rel'] = '=';/* =,<>,<,>,<=,>= //operateur de comparaison des champs:(Ex: column >= fktable)*/
        $j++; //initialisation
        $join$i]'rules']$j]'index'] = 'id';//champs de la table jointe sur la quelle sera basée la comparaison(filtre de jointure)    
        $join$i]'rules']$j]'rel'] = '=';/* =,<>,<,>,<=,>= //operateur de comparaison des champs:(Ex: column >= fktable)*/
        $join$i]'rules']$j]'value'] = $menu->id;//champ (la clé etrangere) nécessaire pour le tri           
        $j++; //initialisation
        $join$i]'rules']$j]'index'] = 'online';//champs de la table jointe sur la quelle sera basée la comparaison(filtre de jointure)    
        $join$i]'rules']$j]'rel'] = '=';/* =,<>,<,>,<=,>= //operateur de comparaison des champs:(Ex: column >= fktable)*/
        $join$i]'rules']$j]'value'] = 1;//champ (la clé etrangere) nécessaire pour le tri   
        $params=array( 'fields'=>'id,name,slug,parentid,url',
                        'join'=>$join,
                        'conditions'=>array('online'=>1),
                        'orderby'=>array('field'=> 'id', 'direction'=>'asc'),                                           
                    );
        if(!$current = $this->find($params)) continue;
        if($menu->active = '1') $d'menus']'activemenu'] = $current;
        else $d'menus']$menu->name] =$current;  
        }
        $this->initTablename();
    return $d;
    }

-----dans le controller (MenusController.php)

//charge les differents menus actifs
    public function loadAllmenus()
    {
        $d = array();
        $this->loadModel('Menu');
        if(!$d = $this->Menu->fetchAll()) return false;
        $this->set($d);
    }

je tiens à signaler qu'en procédant ainsi çà fonctionne. mais la question c'est:
est-ce c'est cette methode qui est en adequation avec le principes du MVC ou celle de Grafikart?
merci de ne repondre que si vous êtes sur de vous.

3 réponses


iriven
Auteur
Réponse acceptée

vu qu'à ce jour personne ne donne son avis sur la question ici posée.
je trancherai en faveur de la méthode exposée ici car pour moi les rôles attribués à chaque fichier respectent mieux à ce qui doit se faire dans un système MVC. de plus qu'elle intérêt de déclarer à chaque fois des classes model vides? une simple inclusion de la classe model principale pourrait alors être suffisant.

Il me semble que tu te complique bien là ...
(erreur dans ton code au passage je pense avec le $i, et $j++ en double )

iriven
Auteur

slt si tu as bien lu la question telle que je l'ai posée, pour moi le tout n'est pas d'avoir un code qui marche, mais d’être en conformité avec ce qui doit se faire dans un système MVC.
au passage,non il n'ya aucune erreur le $j++ c'est normal car plusieurs jointures. je te recommande ce topic pour plus d'infos:
http://www.grafikart.fr/forum/topic/5960
si tu as testé chez toi le code que j'ai placé ici et as eu un retour d'erreurs, c'est normal car j'ai complètement revu la structure de la Bdd et les tables n'ont plus les mêmes noms https://twitter.com/IrivenFrance/status/436516406554013696/photo/1