+ Répondre à la discussion Actualité déjà publiée
  1. #1
    Membre expert
    Avatar de Eusebe
    Inscrit en
    mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : mars 2006
    Messages : 1 992
    Points : 3 457
    Points
    3 457

    Par défaut Débuter avec Zend Framework 1.10 (approche MVC)

    Bonjour,

    Alors que la version 1.11 du Zend Framework est sortie récemment et que la version 2 est en plein développement, je vous propose une nouvelle mise à jour de la traduction du tutoriel Débuter avec Zend Framework (approche MVC) par Rob Allen qui prend en compte les améliorations de la version 1.10.
    http://s-jdm.developpez.com/tutoriel...ramework-1-10/

    Vous pourrez notamment découvrir dans cette nouvelle version :
    - des fonctionnalités supplémentaires de Zend_Tool (création de classes du modèle, activation du layout, ...)
    - une nouvelle convention de nommage des classes par défaut mise en place automatiquement par Zend_Tool

    Merci de nous faire partager à la suite vos commentaires, questions ou corrections sur cet article.

    Bonne lecture !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    novembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : novembre 2008
    Messages : 9
    Points : 10
    Points
    10

    Par défaut

    Bonjour,
    le tuto est assez simple pour débuté avec zend. mais j'ai besoin d'aide une erreur se produit lors de la création des actions, en fait je peux crée autant d'actions dans IndexController mais pas dans MembreController, controller non reconnu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                              An Error Has Occurred                         
     Controller Membre was not found.                                       
     
    Zend Framework Command Line Console Tool v1.10.0
    Details for action "Create" and provider "Action"
      Action
        zf create action name controller-name[=index] view-included[=1] module
    Merci d'avance pour votre aide.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    novembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : novembre 2008
    Messages : 9
    Points : 10
    Points
    10

    Par défaut

    résolu merci.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : décembre 2004
    Messages : 4
    Points : 5
    Points
    5

    Par défaut Gestion de plusieurs tables

    Un grand merci pour ce tuto d'introduction à ZF.

    Mes questions sortent quelque peu du cadre de ce tuto, mais se situe tout de même dans son prolongement. Supposons qu'on étende le modèle de données avec une relation 1-n, selon le MLD suivant:
    • albums(id, artiste, titre, #idStyle)
    • styles(idStyle, nomStyle)


    J'ai déjà re-parcouru le tutoriel et créé un deuxième contrôleur pour gérer les styles.

    1. Afficher le nom du style dans la liste des albums.
    Quelle est la meilleure solution (et comment la finaliser) ?
    • Créer une vue dans la base de données qui fait la jointure entre les deux tables, créer dans l'application un modèle correspondant à cette vue, et ne l'utiliser que pour l'affichage de la liste (c'est ce que je fais pour l'instant);
    • Dans le contrôleur, dans la méthode indexAction, construire une requête SQL qui fait la jointure;
    • Dans le contrôleur, chargez les deux tables (2 fetchAll), et dans la vue, récupérer nomStyle en fonction d'idStyle dans la boucle d'affichage.


    2. Afficher les noms des artistes dans la liste des styles.
    Le but est d'avoir au niveau de la vue un champ multivalué et d'avoir comme résultat quelque chose comme ceci:

    Style / Artiste(s) / Actions
    Classique / André Rieu, Pavaroti / Editer Supprimer
    Rock'n Roll / Johny, Eddie, Les Forbans / Editer Supprimer
    Slows / Eddie / Editer Supprimer
    Techno / (vide) / Editer Supprimer

    J'avoue que je n'ai pas encore trop réfléchi, et votre point de vue serait le bienvenu.
    Ma première idée est au niveau du contrôleur de charger la table styles ligne par ligne et d'effectuer une requête imbriquée pour récupérer la liste des artistes qui correspondent à ce style. Si cette idée est la bonne, quelles sont les méthodes à utiliser pour construire le modèle objet correspondant ?

    D'avance merci pour votre éclairage.

  5. #5
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : mai 2004
    Messages : 4 587
    Points : 7 040
    Points
    7 040

    Par défaut

    Citation Envoyé par dblbass Voir le message
    Créer une vue dans la base de données qui fait la jointure entre les deux tables, créer dans l'application un modèle correspondant à cette vue, et ne l'utiliser que pour l'affichage de la liste (c'est ce que je fais pour l'instant);
    Personnellement c'est l'approche que j'utilise systématiquement dans mes développements. Le défauts des deux autres méthodes que tu mentionnes est d'insérer dans le contrôleur du code lié au modèle, ce qui n'est pas sa vocation. Il existe également une approche que tu n'as pas citée, et qui consiste à utiliser les mécanismes de relation entre entités proposés par Zend_Db_Table. C'est assez puissant, mais je trouve plus rentable et naturel d'utiliser les possibilités du SGBDR plutôt que de les « émuler » en PHP.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  6. #6
    Membre régulier Avatar de eaglesnipe
    Homme Profil pro
    Ingénieur Etudes et Développement
    Inscrit en
    janvier 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes et Développement
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : janvier 2008
    Messages : 75
    Points : 76
    Points
    76

    Par défaut

    Citation Envoyé par samaxnet Voir le message
    résolu merci.
    Je sais que ce thread date d'il y a près d'un an, mais il s'avère que je rencontre, à peu de chose près, le même problème que samaxnet, à savoir l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    zf create db-table OrderFamily orderFamily
     
    An Error Has Occurred
    A project profile was not found.
     
    Zend Framework Command Line Console Tool v1.11.11
    Details for action "Create" and provider "DbTable"
    ...
    Habitué au framework Symfony et novice sur le framework Zend, j'avoue ne pas savoir vers quoi m'orienter pour résoudre ce problème.

    Si vos lumières peuvent m'éclairer, autant en profiter !
    Merci !

    J'en profite également pour faire une petite remarque. Venir chercher de l'aide sur un forum c'est bien, trouver la solution par soi-même c'est très bien, mais la partager avec les autres serait encore mieux ! Quand on pose une question sur un forum, toujours se dire que d'autres codeurs peuvent rencontrer la même difficulté (c'est mon cas justement). Quand on arrive alors à trouver une solution, il serait intéressant de la partager avec les autres et ne pas se contenter de marquer le sujet comme résolu. Donc samaxnet si tu repasses par ici, je serai heureux de connaître la solution à ton problème !


    EDIT

    Solution trouvée dans la foulée !
    Afin de pouvoir utiliser l'outil zf en ligne de commande, il faut se trouver à la racine de son projet, là où se situe le fichier .zfproject.xml (fichier caché). Et le problème disparaît !

  7. #7
    Candidat au Club
    Femme Profil pro
    Inscrit en
    janvier 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : janvier 2012
    Messages : 2
    Points : 2
    Points
    2

    Par défaut Code

    Bonjour,
    je débute avec zend frameworks, et j'aurai aimé savoir ce que signifier:

    Créer une vue dans la base de données qui fait la jointure entre les deux tables, créer dans l'application un modèle correspondant à cette vue, et ne l'utiliser que pour l'affichage de la liste (c'est ce que je fais pour l'instant);
    Est ce que c'est créer une troisième table contenant les id des deux autres tables en relations? Si oui, pouvez-vous me donner un exemple de code pour lire ces 3 tables une fois qu'elles sont créés. Je n'arrive pas à les joindre avec zendframeworks...

    Merci =)

  8. #8
    Membre régulier Avatar de eaglesnipe
    Homme Profil pro
    Ingénieur Etudes et Développement
    Inscrit en
    janvier 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes et Développement
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : janvier 2008
    Messages : 75
    Points : 76
    Points
    76

    Par défaut

    Pour répondre à ta question, une vue est une table virtuelle qui permet d'accéder à des données issues de l'assemblage d'autres tables. Cet assemblage est effectué au travers d'une requête SQL.

    Ainsi, une vue ne contient aucune données mais simplement la requête permettant d'accéder à ces données.


    Créer une vue dans la base de données qui fait la jointure entre les deux tables, créer dans l'application un modèle correspondant à cette vue, et ne l'utiliser que pour l'affichage de la liste (c'est ce que je fais pour l'instant);
    Cela signifie donc de créer une vue liée à la requête permettant d'effectuer la jointure entre les 2 tables. Il suffira ensuite niveau dev de venir lire dans cette table virtuelle (une vue se manipulera exactement de la même manière qu'une table classique) pour récupérer les données de jointure, sans devoir faire la jointure à chaque fois dans le code : le serveur MySql s'en occupe.

    Un exemple de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE VIEW mavue 
    AS 
    SELECT attA1, attA2, attB1
    FROM tableA tA
    JOIN LEFT tableB tB ON tA.attA = t2.ref_attA
    Tu requêtes ensuite de manière habituelle sur mavue

    Pour creuser :

    http://dev.mysql.com/doc/refman/5.0/fr/create-view.html

  9. #9
    Candidat au Club
    Femme Profil pro
    Inscrit en
    janvier 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : janvier 2012
    Messages : 2
    Points : 2
    Points
    2

    Par défaut

    Merci pour la réponse.

    J'ai bien compris le principe...

    La où je bloque maintenant, c'est dans quel fichier doit on créer cette vue (cette table virtuelle)? Dans la page indexcontroller (avant les différentes fonctions qui existe : ajout..) avant la class IndexController), ou dans le fichier DbTable qui traite les infos (et du coup le protected $_name changera selon le nom de la vue crée)...???


    =/

  10. #10
    Membre régulier Avatar de eaglesnipe
    Homme Profil pro
    Ingénieur Etudes et Développement
    Inscrit en
    janvier 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes et Développement
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : janvier 2008
    Messages : 75
    Points : 76
    Points
    76

    Par défaut

    Citation Envoyé par Didine1307 Voir le message
    Dans la page indexcontroller ...
    Citation Envoyé par Didine1307 Voir le message
    dans le fichier DbTable qui traite les infos
    Ni l'un ni l'autre

    La vue se crée dans ton SGBD comme si tu créais une table (sauf que là c'est une vue ^^). Connectes toi donc à ton SGBD via ton outil (phpMyAdmin ?) ou en ligne de commande pour la créer

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 3
    Points : 4
    Points
    4

    Par défaut à propos du contrôleur : IndexController

    l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $albums = new Application_Model_DbTable_Albums();
    est répétée dans chaque action.
    Ne serait il pas préférable d'ajouter une donnée d'instance comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private $modelAlbums;
    public function init() {
          $this->modelAlbums = new Application_Model_DbTable_Albums(); 
        }
    puis ensuite dans les actions suivantes (par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->modelAlbums->ajouterAlbum($artiste, $titre);
    Bien que je préférerais initialiser la donnée dans le constructeur ou dans une méthode statique (de classe) appelée par ce constructeur.
    Qu'en pensez vous ?

  12. #12
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : mai 2004
    Messages : 4 587
    Points : 7 040
    Points
    7 040

    Par défaut

    C'est effectivement raisonnable, mais attention : si plusieurs actions du même contrôleur sont déclenchées successivement (avec _forward() pour passer de l'une à l'autre), la méthode init() de ce contrôleur s'exécutera plusieurs fois pour la même requête (à chaque passage dans la boucle de dispatch) ; il faut en tenir compte pour éviter des effets de bord indésirables.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 3
    Points : 4
    Points
    4

    Par défaut a propos du contrôleur

    Merci GrandFather pour cette précision. L'objectif était double : éviter la duplication du code et limiter l'usage intempestif du new. Compte tenu de la remarque seul le premier objectif est atteint. on peut évidemment modifier le code comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private $modelAlbums = NULL ;
    public function init() {
       if($this->modelAlbums == NULL) 
          $this->modelAlbums = new Application_Model_DbTable_Albums(); }
    Mais n'existe-t-il pas une solution plus élégante pour ajouter et initialiser une donnée d'instance dans le contrôleur ?

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 3
    Points : 4
    Points
    4

    Par défaut a propos du contrôleur

    Finalement compte tenu de la remarque éclairée de GrandFather une solution sans utiliser la méthode init()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private $model = NULL ;
    private function getModel(){
       if($this->model == NULL) 
          $this->setModel(new Application_Model_DbTable_Albums());
       return $this->model ; }
    private function setModel($model){$this->model = $model; }
    et puis ensuite dans les actions suivantes par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->getModel()->updateAlbum($id, $artiste, $titre);

  15. #15
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    juillet 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2012
    Messages : 1
    Points : 1
    Points
    1

    Par défaut Erreur

    pour améliorer le cours pour les débutants comme moi , :
    - activer l'affichage des erreur dans le fichier application.ini en mettant les valeurs à 1 comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1
    resources.frontController.params.displayExceptions = 1
    après avoir lu le cours et appliqué le code je me suis aperçu de l'erreur suivante ds la fonction obtenirAlbum du fichier DbTable/albums.php les modifs sont en commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function obtenirAlbum($id){
     
    $id = int($id); // $id=intval($id)
    $row = fetchRow('$id =' . $id); // $row=$this->fetchRow('id='.$id)
    if (!$row){
    	throw new Exception("Impossible de trouver l'element $id ");
     
    }
    return $row->toArray();
     
    }

  16. #16
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2009
    Messages : 122
    Points : 124
    Points
    124

    Par défaut

    Bonjour super tuto.

    Pour info lors de l'installation de zf tools le redémarrage n'est pas nécessaire, il suffit de relancer la console, si elle était déja ouverte.
    Quand on va de l'avant on avance !!!!

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/05/2013, 13h59
  2. Débuter avec Zend Framework 1.5 (approche MVC)
    Par Yogui dans le forum Zend Framework
    Réponses: 23
    Dernier message: 18/11/2010, 08h05
  3. Réponses: 3
    Dernier message: 17/12/2009, 10h31
  4. Réponses: 8
    Dernier message: 18/03/2009, 22h12
  5. Réponses: 6
    Dernier message: 16/09/2008, 20h35

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