IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC PHP Discussion :

Résultat de requête (fetchAll) et MVC [ZF 1.7]


Sujet :

MVC PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 333
    Points : 586
    Points
    586
    Par défaut Résultat de requête (fetchAll) et MVC
    Bonjour,

    De nouveau la même qui comprends pas… Zend, c'est nouveau, MVC, c'est nouveau…

    Débord le problème niveau MVC : dans le tutoriel du site "premiers pas avec Zend" supposé suivre le modèle MVC, quelque chose me laisse perplexe…
    Puisque le modèle MVC veut que l'on sépare clairement les trois parties, la requête devrait se faire dans le model qui renvoie le résultat au controller, non ?? Et ensuite la vue se charge d'une boucle, j'ai bon ?? BTW, dans le tuto la class du modèle ne contient qu'une ligne "$_name = 'table' " et le fetchAll est ensuite fait dans le controller.


    Bref, le problème principal n'est pas là. D'abord mon code :

    Vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	<ul><?php
    		foreach($this->articles as $article)
    			{
    			echo '<li>'.$this->article->titre.'</li>';
    			} ?>
    	</ul>
    Controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class IndexController extends Zend_Controller_Action 
    {
     
    	public function indexAction()
    	    {
    		$this->view->title = "Accueil";
     
    		$news		= new News();
    		$this->view->news		= $news->lastNews();
     
    		$articles	= new Articles();
    		$this->view->articles	= $articles->lastArticles();
    	    }
    }
    Modèle
    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
    class Articles extends Zend_Db_Table
    	{
    	protected $_name = 'articles';
    	protected $_primary	= 'id';
     
    	public function lastArticles()
    		{
    		$select		= $this->select('titre')
    							->from('articles')
    							->order('id DESC')
    							->limit(5);
     
    		return $this->fetchAll($select);
    		}
    	}

    La table contient les colonnes "id", "contenu", "titre", etc., mais dans mon cas seule la colonne titre m'interesse. Il me semble que je tout devrait être bon, mais il m'est annoncé "Notice: Trying to get property of non-object"…

    Je cherche uniquement à afficher la liste des 5 derniers articles ajoutés, où est-ce que je plante ?? En triffoullant pour cherche une solution il arrive parfois que je me retrouve face à une notice parlant de "Zend_Db_Rowset" (désolé je n'ai pas pensé à la c/c).


    Enfin, apprendre Zend est vraiment difficile, vu qu'à chaque fois les codes donnés sur internet sont tous différents (entrel es MVC/non-MVC, les bourrins/pas-bourrins, etc.)… Aussi, j'ai vu des modèles qui étendent des classes abstraites, donc Zend_Db_Table_Abstract…
    Quel but ?? :s


    Merci d'avance !

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Pour la première question, la génération de la requête SQL se fait bien dans la vue. le contrôleur n'a pas à savoir comment sont stockées le données (fichier texte, base de données, etc...). Il demande juste au modèle de renvoyer l'ensemble de ses données avec la méthode fetchAll(). Si la classe du modèle ne contient que ""$_name = 'table' ", ce n'est pas le cas de ses classes parentes, qui gèrent les méthodes d'accès aux données en fonction du type de stockage (et qui font aussi partie du modèle).

    Pour ton deuxième problème, c'est que $this->article n'existe pas. C'est $article qu'il faut utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach($this->articles as $article)
    {
        echo '<li>'.$article->titre.'</li>';
    } ?>

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 333
    Points : 586
    Points
    586
    Par défaut
    J'ai du mal à comprendre… JE ne comprends pas comment mettre la requête dans la vue avec par l'intermédiaire du contrôleur :s Je parle de ce bout là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $select		= $this->select('titre', 'contenu')
    					->from('news')
    					->order('id DESC');
    Où étant une simple lecture je passe directement de la vue à au model ? Dans un cas d'ajout/edit/etc. c'est bien ainsi :
    - le controller récupère les données, instancie un objet de la bdd concernée
    - la class bdd fait son boulot, renvoie le résultat
    - le controller vérifie que tout s'est bien passé, dit à la Vue que c'est ok
    - la vue dit à l'écran que tout a été effectué correctement

    ??


    Désolé, mais j'ai pas mal de soucis à comprendre en regardant sur le net, trop de manière toujours différentes, je m'y perds :s

    Promis, une fois que j'aurais compris je comprendrais un peu mieux et je poserais des questions moins bêtes, je me suis initié à tout en passant par PHP et JS en demandant rarement de l'aide, mais là je suis largué !! :p

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Le code que tu nous montres doit bien être placé dans ton modèle (comme c'est d'ailleurs fait dans ton premier message).

    Le modèle doit se charger de tout ce qui concerne la logique relative aux données (les règles "métier") et leur stockage (par exemple qu'un article doit avoir au moins un auteur, que la date de naissance de l'auteur doit être passée,...).

    La vue doit se charger de présenter les données, quelle que soit la destination (écran, imprimante, etc...).

    Le contrôleur a pour rôle de lier ces deux entités. Il analyse les requêtes qui lui sont faites, utilise la partie du modèle qui convient pour récupérer les données correspondant à cette requête, et les transmet à la vue qui va bien (toujours en fonction de la requête).

    Dans le cas d'une requête de modification de données, le contrôleur demande en effet au modèle de faire les modifs, récupère le résultat, et le transmet à la vue qui se charge de l'afficher...

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 333
    Points : 586
    Points
    586
    Par défaut
    ok, donc j'ai tout bon…


    Merci, comme on dit "un petit pas pour moin un gras pas pour la refonte de mon site"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Affichage de 2 lignes d'un résultat de requête
    Par JohanProg dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 04/10/2005, 15h42
  2. Réponses: 7
    Dernier message: 26/09/2005, 17h50
  3. table comme résultat de requête
    Par nafnaf625 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/05/2005, 11h51
  4. Comparaison de résultats de requêtes
    Par Nyx de Tours dans le forum Requêtes
    Réponses: 7
    Dernier message: 31/07/2004, 15h49
  5. Trier aléatoirement un résultat de requête
    Par ang36 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/01/2004, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo