Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework
Zend Framework Forum d'entraide sur la programmation PHP avec Zend Framework. Avant de poster -> FAQ ZF, Cours ZF
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Actualité déjà publiée
 
Outils de la discussion
Publicité
'
Vieux 22/11/2010, 18h54   #1
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
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 !
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/12/2010, 17h54   #2
Invité régulier
 
Inscription : novembre 2008
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 9
Points : 8
Points : 8
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 :
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.
samaxnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2010, 19h41   #3
Invité régulier
 
Inscription : novembre 2008
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 9
Points : 8
Points : 8
résolu merci.
samaxnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 09h06   #4
Invité de passage
 
Inscription : décembre 2004
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 4
Points : 1
Points : 1
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.
dblbass est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 15h12   #5
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 11h23   #6
Nouveau Membre du Club
 
Avatar de eaglesnipe
 
Homme Yoann Rousseau
Ingénieur Etudes et Développement
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Nom : Homme Yoann Rousseau
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 : 46
Points : 35
Points : 35
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 :
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 !
eaglesnipe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 10h56   #7
Invité de passage
 
Femme
Inscription : janvier 2012
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Femme

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:

Citation:
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 =)
Didine1307 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 11h15   #8
Nouveau Membre du Club
 
Avatar de eaglesnipe
 
Homme Yoann Rousseau
Ingénieur Etudes et Développement
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Nom : Homme Yoann Rousseau
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 : 46
Points : 35
Points : 35
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.


Citation:
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 :
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://www.apprendre-php.com/tutoriels/tutoriel-28-mysql-5-0-les-vues.html

http://dev.mysql.com/doc/refman/5.0/fr/create-view.html
eaglesnipe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 12h16   #9
Invité de passage
 
Femme
Inscription : janvier 2012
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : janvier 2012
Messages : 2
Points : 2
Points : 2
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)...???


=/
Didine1307 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 12h28   #10
Nouveau Membre du Club
 
Avatar de eaglesnipe
 
Homme Yoann Rousseau
Ingénieur Etudes et Développement
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Nom : Homme Yoann Rousseau
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 : 46
Points : 35
Points : 35
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
eaglesnipe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 11h58   #11
Invité de passage
 
Inscription : décembre 2006
Messages : 3
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 3
Points : 3
Points : 3
Par défaut à propos du contrôleur : IndexController

l'instruction :
Code :
$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 :
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 :
$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 ?
ralbrand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 15h22   #12
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 15h31   #13
Invité de passage
 
Inscription : décembre 2006
Messages : 3
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 3
Points : 3
Points : 3
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 :
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 ?
ralbrand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 10h20   #14
Invité de passage
 
Inscription : décembre 2006
Messages : 3
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 3
Points : 3
Points : 3
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 :
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 :
1
2
 
$this->getModel()->updateAlbum($id, $artiste, $titre);
ralbrand est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Actualité déjà publiée
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h00.


 
 
 
 
Partenaires

Hébergement Web