13 juil
Par Clément dans Tutoriels
Mots-clefs :htaccess, Models, MVC, SEO, Symfony, Watchmydesk, Zend, Zend Framework, Zend_Db_Table

Dans cet épisode, nous allons essayer ensemble de comprendre le MVC et son intéret dans une application internet et nous allons créer les modèles qui vont nous permettre d’effectuer des actions sur la base de donnée de notre application WatchMyDesk.
Selon Wikipédia, le MVC représente :
Le Modèle-Vue-Contrôleur (en abrégé MVC, de l’anglais Model-View-Controller) est une architecture et une méthode de conception qui organise l’interface homme-machine (IHM) d’une application logicielle.
Bon c’est pas super explicatif comme description, donc on va faire plus simple !
Le MVC est une base de conception vraiment pratique tant au niveau de la programmation, mais aussi car ce code est testable facilement et on peut revenir dans le code plus facilement que si cela était uniquement fait en procédural.
Le framework de la société Zend vous permet d’utiliser directement le MVC simplement et efficacement ! Comme nous l’avons vu dans l’épisode 1 et dans la structure des dossiers, nous avons le dossier avec les contrôleurs, le dossier avec les modèles et le dossier avec les vues.
Avec le Zend Framework, il y a quelques conventions à suivre pour que tout cela soit opérationnel.
Pour les Controleurs :
Pour les vues :
Exemple Concret :
class IndexController extends Zend_Controller_Action{
public function listAction(){
// ici je fait une requête pour récupérer ce que je veux
}
}
Cette action sera donc appelable à partir de cette adresse : http://localhost/watchmydesk/index/list .
Avec le MVC, plus besoin de réécrire les urls avec un htaccess, c’est aussi simple que ça pour avoir des adresses propre et SEO friendly dans votre application.
Les modèles de base de données, comme dis précédemment vont être utilisés pour accéder à une table de notre base de donnée watchmydesk que nous avons créée dans l’épisode #2.
Comme les controleurs, les modèles sont des classes PHP qui étendent de Zend_Db_Table, ce qui leur permet d’avoir accès à des méthodes de mise à jour, suppression, sélection et d’insertion dans la base de donnée !
De plus, ce composant nous permet de gérer les associations dans la base de données.
Nous allons faire un rappel rapide sur les relations que nous avons dans notre base de données:
Avec ce rappel fait, nous allons pouvoir commencer!
Le modèle Membres.php
class Model_DbTable_Membres extends Zend_Db_Table
{
protected $_name = 'membres';
protected $_primary = 'id';
protected $_referenceMap = array(
'Votes' => array(
'columns' => 'id',
'refTableClass' => 'Model_DbTable_Votes',
),
'Bureaux' => array(
'columns' => 'id',
'refTableClass' => 'Model_DbTable_Bureaux',
),
'Commentaires' => array(
'columns' => 'id',
'refTableClass' => 'Model_DbTable_Commentaires',
)
);
}
Oula, on se calme, ca veut dire quoi ce code là ! On va prendre sa respiration et regarder de plus près.
Comme dis précédemment, le modèle doit étendre de Zend_Db_Table. Nous lui indiquons aussi le nom de la table sur laquelle nous travaillons grâce à la variable protégée $_name, ici : membres. Ensuite nous lui indiquons la clef primaire de notre table grâce à la variable protégée $_primary, ici : id.
Le gros morceau de code qui suit, c’est la déclaration des relations dans la base de données. C’est grâce à cela que nous retrouverons les bureaux d’un membre ou les commentaires écrit par ce membre. Comme dis précédemment, un membre peut avoir plusieurs bureaux, plusieurs commentaires et plusieurs votes, on a donc bien ces trois éléments. C’est grâce à cette variable protégée $_referenceMap que nous pouvons indiquer les relations. Ils nous suffit de mettre la clef étrangère (ici nommé columns) ainsi que la classe qui va servir de référence pour exécuter les requêtes SQL dans la table dépendante.
Grâce à cette méthode, nous faisons abstraction de toutes les requêtes SQL à faire pour trouver les commentaires écrits par un des membres.
Continuons l’écriture de nos modèles .
Le modèle Bureaux.php
class Model_DbTable_Bureaux extends Zend_Db_Table
{
protected $_name = 'bureaux';
protected $_primary = 'id';
protected $_referenceMap = array(
'Membre' => array(
'columns' => 'membres_id',
'refTableClass' => 'Model_DbTable_Membres'
),
'Commentaires' => array(
'columns' => 'id',
'refTableClass' => 'Model_DbTable_Commentaires'
)
);
}
Le modèle Commentaires.php
class Model_DbTable_Commentaires extends Zend_Db_Table
{
protected $_name = 'commentaires';
protected $_primary = 'id';
protected $_referenceMap = array(
'Membres' => array(
'columns' => 'membres_id',
'refTableClass' => 'Model_DbTable_Membres',
),
'Bureaux' => array(
'columns' => 'bureaux_id',
'refTableClass' => 'Model_DbTable_Bureaux',
)
);
}
Le modèle Votes.php
class Model_DbTable_Votes extends Zend_Db_Table
{
protected $_name = 'votes';
protected $_primary = 'id';
protected $_referenceMap = array(
'Membres' => array(
'columns' => 'membres_id',
'refTableClass' => 'Model_DbTable_Membres',
),
'Bureaux' => array(
'columns' => 'bureaux_id',
'refTableClass' => 'Model_DbTable_Bureaux',
)
);
}
Le modèle Photos.php
class Model_DbTable_Photos extends Zend_Db_Table
{
protected $_name = 'photos';
protected $_primary = 'id';
protected $_referenceMap = array(
'Bureaux' => array(
'columns' => 'id',
'refTableClass' => 'Model_DbTable_Bureaux',
)
);
}
Le modèle BureauxPhotos.php
class Model_DbTable_BureauxPhotos extends Zend_Db_Table
{
protected $_name = 'bureaux_photos';
protected $_primary = 'id';
protected $_referenceMap = array(
'Bureaux' => array(
'columns' => 'bureaux_id',
'refTableClass' => 'Model_DbTable_Bureaux',
),
'Photos' => array(
'columns' => 'photos_id',
'refTableClass' => 'Model_DbTable_Photos',
)
);
}
Vous devez vous retrouver avec cette structure :

Voila ! Nous avons fait le gros du travail .
Nous allons voir maintenant si nos associations marche par des tests très rapides.
Il vous suffit d’ajouter plusieurs enregistrements dans votre base de données (plusieurs membres, plusieurs photos, plusieurs commentaires …).
Nous allons allez dans le répertoire /application/modules/frontend/controllers/, ouvrir de fichier IndexController.php et écrire cela :
class IndexController extends Zend_Controller_Action {
public function indexAction(){
$membres = new Model_DbTable_Membres(); // On instancie un modèle Membres.
$user = $membres->find(1)->current(); // On récupère le premier utilisateur.
Zend_Debug::dump($user->findModel_DbTable_Votes()); // On cherche les votes associés à l'utilisateur
Zend_Debug::dump($user->findModel_DbTable_Commentaires()); // On cherche les commentaires associés à l'utilisateur
$votes = new Model_DbTable_Votes(); // On instancie un modèle Votes.
$vote = $votes->find(1)->current(); // On récupère le premier vote.
Zend_Debug::dump($vote->findParentModel_DbTable_Membres()); // On cherche l'utilisateur qui à posté le commentaire
$bureaux = new Model_DbTable_Bureaux(); // On instancie un modèle Bureaux.
$bureau = $bureaux->find(2)->current(); // On récupère le second bureau.
Zend_Debug::dump($bureau->findModel_DbTable_Commentaires()); // On cherche les commentaires associés au bureau.
Zend_Debug::dump($bureau->findModel_DbTable_PhotosViaModel_DbTable_BureauxPhotos()); // On cherche les photos associées au bureau.
}
}
Si tout fonctionne comme vous le souhaitez, vous avez réussis !
Dans cet épisode, vous avez vu comment fonctionne le MVC avec le Zend Framework et comment mettre en place et utiliser les modèles de base de données, ainsi que leur relations dans la base de donnée.
C’était un épisode assez intense au niveau apprentissage, et je pense qu’une bonne semaine pour se remettre ne fera pas de mal !
Je vous rappel que depuis peu, vous pouvez me suggérer des articles ou des vidéos sur la page de suggestion.
Bonne vacances à ceux qui en ont et à Lundi prochain !
« Une nouveauté sur Dator.fr, la page de suggestion de tutoriels ! | Gritter, un plugin jQuery pour créer des notifications growl »
Un trackback
45 commentaires
David
13 juillet 2009 à 11:11
1Salut,
Je pense qu’il est inutile de mettre les $_referenceMap dans les modeles Membres.php et Photos.php. Quant à Bureaux.php seul la référence ‘Membres’ suffit.
Me semble-t-il !!
Rabbits
13 juillet 2009 à 12:23
2Très bon ensemble d’articles, vivement la suite !!!!
Pierre
13 juillet 2009 à 19:51
3@David: Pourquoi enlever le reference_map sur Membre.php ? Il peut servir à lister tous les commentaires du membre par exemple non ?
Je précise que je débute avec Zend, et je me pose pas mal de questions
En tout cas, vivement lundi prochain !
Vraiment très bon cette série de tuto!
David
13 juillet 2009 à 21:47
4@Pierre: Non
Dans ce cas ta référence est déjà faite dans Commentaires.php
Mais j’avoue j’ai pas testé.
Pierre
13 juillet 2009 à 22:06
5Effectivement, je n’avais pas étudié le code du contrôleur en détail :$
Jad
13 juillet 2009 à 22:35
6Merci déjà pour les tutos…
sauf que j’ai un seul problème :
Fatal error: Call to a member function findModel_DbTable_Albums() on a non-object in E:\WebServers\wamp\www\ForTest\application\controllers\IndexController.php on line 16
voila mon code :
public function indexAction() {
$artistes = new Model_DbTable_Artistes();
$albums = $artistes->find(1)->current();
Zend_Debug::dump($albums->findModel_DbTable_Albums());
}
N.B: j’ai deux modéle (Artistes et Albums)…
David
13 juillet 2009 à 23:03
7Bon je viens de tester.
Je confirme ce que j’affirme.
Inutile de mettre $_referenceMap dans le modeles Membres.php.
Pour Photos.php, il faut évidemment laisser la référence au bureau, mais il faut remplacer id par bureaux_id.
Quant à Bureaux.php seul la référence ‘Membres’ suffit.
Pour que ça marche il faut aussi remplacer membre_id par membres_id, bureau_id par bureaux_id et photo_id par photos_id.
Voilà là je crois que c’est bon.
David
13 juillet 2009 à 23:04
8@Jad: Tu ne dois pas avoir d’enregistrement avec id=1 dans ta table « artistes»
Clément
14 juillet 2009 à 10:40
9@David: Pourquoi par bureaux_id sachant que dans la base de données on a juste bureau_id comme primary key .
En effet, le referenceMap de User n’ai pas obligatoire, néanmoins, je préfère le laisser pour montrer que même si on a des liaisons « en trop» , l’application continue de fonctionner.
@Jad: Tu ne doit pas avoir d’enregistrement dans ta table.
@Rabbits: Merci beaucoup !
David
14 juillet 2009 à 11:30
10@Clément: car tu as renseigner bureaux_id comme champs dans ta table photos et pas bureau_id et idem pour les autres tables.
J’ai testé ton appli telle quelle et ça ne marchait pas, avec ces modifs ça marche.
Clément
14 juillet 2009 à 12:10
11@David: En effet, toutes mes excuses, article mis a jour !
David
14 juillet 2009 à 13:39
12@Clément: Je t’en prie c’est comme ça qu’on progresse tous
Clément
14 juillet 2009 à 16:19
13@David: De plus c’est une erreur bête, je n’était pas partie sur la bonne base de donnée (la même que celle donnée dans l’épisode 2) ^^
yveson33
15 juillet 2009 à 8:02
14effectivement j’aimerais juste une cofirmation de pro mais $_referenceMap n’est pas obligatoire dans le cas d’une base INNODB (gestion du cascading par le moteur bd) pareille pour le $_id du moment que dans la base les cles primaires soit « id»
Clément
15 juillet 2009 à 8:10
15@yveson33: Pour innodb je ne sais pas trop mais dans tout les cas je préfère vous montrer les propriété d’un objet qui étend de Zend_Db_Table pour ne pas être perdu si vous avez un projet avec des relations et une primary key autre que « id» .
A bientôt
phifeshaheed
16 juillet 2009 à 20:10
16je trouve assez périlleux de ne faire que des classés models et aucune classes métiers parce que cela voudra dire qu’une bonen partie d eta logique métier sera incluses dans les classes models ce qui n’est pas une tres bonne chance en MVC
phifeshaheed
16 juillet 2009 à 20:15
17à ta place j’aurai d’abord fait des classes models qui étendent zend_db_table_abstract que j’aurai placé dans un sous rep de models appelés DbTable et ensuite j’aurai des classes métiers et mappers dans le rep models
phifeshaheed
17 juillet 2009 à 9:22
18Explication plus détaillée!!!
Le fichier UneTable.php, contenant Default_Model_DbTable_UneTable extends Zend_Db_Table_Abstract, et se trouvant dans /models/DbTable, est celui qui fait le lien direct avec la base de données : tu y indiques par des attributs protected le nom de la table, la clé primaire, les dépendances, etc.
Le fichier UneTable.php contenant Default_Model_UneTable, se trouvant dans /models, est ce qui s’apparente à un Bean en Java, c’est à dire ton objet entité avec ses attributs, ses getters et ses setters. Tu peux également y définir d’autres méthodes, par exemple dans le tutoriel Quickstart ils définissent entre autres la méthode save(). Cette méthode contient un appel au Mapper de ta classe bean.
Ton Default_Model_UneTableMapper, dans le repertoire /models aussi, contient le corps des fonctions que tu définis dans ton bean : le bean, dans la méthode save(), fait un appel au Mapper, et c’est le mapper qui va se charger d’effectuer la requete, en définissant la méthode save() de manière précise
Victor Nicollet
17 juillet 2009 à 14:10
19@phifeshaheed: la question d’utiliser une couche M épaisse ou fine est une vraie décision à prendre, chacune des alternatives ayant ses propres avantages et désavantages.
Les avantages d’une couche M épaisse sont que les règles métier qu’on peut introduire dans le système sont beaucoup plus riches et étoffées car elles apparaissent directement dans le code PHP, et ne sont pas restreintes aux seules contraintes et relations SQL: droits, contraintes exotiques, mise en cache…
Les avantages d’une couche M fine sont d’un côté que la base est la seule référence (donc pas de risque qu’elle soit corrompue depuis l’extérieur : toutes les contraintes sont garanties par le SQL) et de l’autre que le développement de nouvelles opérations est plus facile car ne nécessite pas de code intermédiaire au niveau de la couche métier.
Suivant la taille du projet, la vitesse de développement (couche fine) ou la complexité des règles (couche épaisse) peuvent l’emporter. Pour un tutoriel, en particulier, je pense que la couche fine telle qu’utilisée est plus appropriée. Sans tomber dans le syndrome Digitalus
phifeshaheed
17 juillet 2009 à 16:19
20@Victor tout à fait d’accord, mais tu remarqueras que dans le tutoriel officiel de ZF, on utilise un bazouka pour tuer une mouche i.e. un mapper, couche métier plus une couche de persistance alors qu’on a une seule table… on se demande pourquoi?
La raison: Perso je crois que meme si ZF n’aime pas imposer mais proposer, ils aiment au moins proposer de bonnes pratiques et je pense que malgré toutes les considérations légitimes que tu introduit, séparer la business logic de la classe de persistance est une tres tres bonne pratique
phifeshaheed
17 juillet 2009 à 16:26
21etant par essence agnostic en matiere de techno, méthodo ou archi, je ne peux que souscrire à 100% avec ceci: « Suivant la taille du projet, la vitesse de développement (couche fine) ou la complexité des règles (couche épaisse) peuvent l’emporter.»
au passage comme dans tous les tutoriels, c’est en général sur l’archi du model que les gros débats en lieu dans les comments… ZF laisse tellement de liberté que ça devient tres difficile de choisir… au passage pour les transfuges comem moi de Symfony, il est assez aisé vu que ZF est souple de virer zenddb et de bouffer du Zf à la sauce doctrine… taper zf et doctrine chez googlme il vous donnera l’adresse d’un bon tuto à ce sujet… souvent ecrits pour 1.7 et précédents donc un peu d’adaptation ets nécessaire
phifeshaheed
26 juillet 2009 à 19:42
22Bonjour,
je dois réoudre un probleme sur une application que je dois coder sous zend framework, une application en apparence il s’agit essentiellement de faire de la saisie de données afin de générer des statistiques. Et donc pour cela on a différentes tables qui sont reliées en général à un formulaire qui va récolter les informations nécessaire pour les insérer dans cette table.
Le petit piège sur ce projet c’est que les utilisateurs finaux souhaitent pouvoir ajouter des champs dans les différents formulaires si ils ressentent le besoin de récolter nouveaux types d’informations. Exemple tout bete: on récolte les informations sur les employés de l’entreprise à travers un formulaire qui comporte un champ téléphone fixe et il s’avert qu’on veuille ajouter un champ téléphone mobile. Jusque là so far so good, cependant afin de sauvegarder cette nouvelle info en base de données, typiquement on va devoir ajouter une nouvelle colonne dans la table Employée de notre base…
L’application étant développée avec zend framework, c’ets donc là que se pose la tuile car on vient de modifier le modèle de données et donc il faut régénérer le modèle via doctrine ou propel ou la main sous zendDB. Il n’est évidemment pas question de livrer au client une appli sur laquelle il va devoir faire des lignes de commande pour générer des classes du modèle de données.
ma question: Comment structurer ma base de données pour que je puisse faire les modifications attendues par mon client sans passer passer par l’ajout d’une nouvelle colonne et donc une modification du modèle de données nécessitant une régénération des classes du model?
Exemple de tables: Produits (prix, description, nom), Magasins(adresse, type)
exemples formulaire: saisie info produits, saisie info magasin
Exemple modification: on veut pouvoir saisir et enregistrer en base le nom du fabriquant du produit, et l’on voudrai pouvoir saisir et enregistrer en base le nom du gérant du magasin. Comment pourrai t on structuré la base de donnée pour qu’elle puisse sous zend framework permettre ce type d’opération: ajout de champ formulaire et possibilité d’enregistrer les nouvelles saisies sans modifier la structure de la BDD?
Phabi1
1 août 2009 à 10:57
23Bonjour,
Je débute sous Zend 1.8.
Je souhaiterai faire un model dans un module particulier pour le récupérer pour d’autre application mais je trouve aucume documentation la dessus.
Mon architecture est celle ci : Application>modules>myModule>models>DbTable>myTable.php
Mais il me remontre comme erreur Class ‘Model_DbTable_myTable’ not found.
Si quelqu’un aurait une idée, je suis preneur.
Merci
leknoppix
10 août 2009 à 10:56
24Chez moi, malgré que je lai refaire 4 fois de A à Z, rien ne marche, malgré un enregistrement dans la base de donnée, rien ne s’affiche.
leknoppix
10 août 2009 à 13:21
25Désolé sa marche, problème de cache sur mon navigateur web.
Psykotik
21 août 2009 à 16:45
26Bonjour à tous,
J’ai fais les 2 premiers tuto avec beaucoup de difficulté (Je ne sais d’ailleur toujours pas si j’ai réussi).
Le premier :
J’ai du envoyer mon travail à Clément qui m’a indiqué qu’une balise PHP ne devait pas se trouver dans un fichier brute. J’ai donc réussi a avoir la phrase mais en allant sur le dossier public.
Premier tuto reussi
Le deuxième :
Une fois le tuto fini, une erreur est survenue en me disant qu’il ne trouvait pas « Zend_Controller_Action» j’ai donc cherché mon erreur et j’ai fini par la trouver, ce qui ma valu un affichage de ce type :
object(Zend_Db_Table_Rowset)#72 (10) { ["_data":protected]=> array(0) { } ["_table":protected]=> object(Model_DbTable_Bureaux)#48 (18) { ["_name":protected]=> string(7) « bureaux» ["_definition":protected]=> NULL ["_definitionConfigName":protected]=> NULL ["_db":protected]=> object(Zend_Db_Adapter_Mysqli)#20 (12) { ["_numericDataTypes":protected]=> array(16) { [0]=> int(0) [1]=> int(1) [2]=> int(2) ["INT"]=> int(0)
Pour moi ce code me parrait quand meme bisar sachant que dans le tuto Clément nous dis que nous devons trouver un grand tableau sans rien dedans. Je pensais avoir fini le tuto donc je suis passé au 3éme.
Le troisième :
Une fois le tuto fini, j’ouvre le projet et je click sur public: et la rien ne se passe, un page blanche. j’essaye de naviguer vers les autre fichier PHP mais les erreurs sont toujours présente :
Fatal error: Class ‘Zend_Controller_Action’ not found in C:\wamp\www\watchmydesk\application\modules\frontend\controllers\IndexController.php on line 2
Fatal error: Class ‘Zend_Db_Table’ not found in C:\wamp\www\watchmydesk\application\models\DbTable\BureauxPhotos.php on line 3
je suis persuadé que le chemin de la library n’est pas bon, aidez moi s’il vous plait
Tientoune
16 septembre 2009 à 9:45
27Bonjour jai un probleme sur ce tuto
jai une erreur qui affiche
An error occurred
Application error
Clément
16 septembre 2009 à 10:02
28@Psykotik: En effet, le chemin vers le dossier library ne doit pas être le bon. Peux-tu me montrer le code qui indique le chemin de library dans ton index.php ?
@Tientoune: tu es sur quelle page quand tu obtiens cette erreur ?
Tientoune
16 septembre 2009 à 10:51
29Bonjour ^^
sur la page localhost:8888/../public
Tientoune
16 septembre 2009 à 10:52
30Bonjour ^^
sur la page localhost:8888/../public
@Clément: @Clément: @Clément:
Tientoune
16 septembre 2009 à 10:54
31@Clément: desoler 1ere fois que je fais un reply Sorry du doublons !!
Tientoune
16 septembre 2009 à 10:56
32@Clément: puis aussi j’oublier
jai eu la meme erreur avec le tuto n°2, mais lorsque jai retirer le fetchall dans le var_dump, le tableau affiche bien!
voila x)
Bruno
6 décembre 2009 à 10:49
33Bravo pour ce tuto et bonnes discutions avec phifeshaheed.
J’ai 1 question :
- Existe-t-il avec zend studio un moyen de générer les classes models à partir d’une description sql ou yaml comme avec Symfony et propel.
Avez-vous des liens à ce sujet ?
Pour phifeshaheed, la solution de la « colonne dynamique» passe par un model (ou meta model) qui stockera ces nouvelles données en ligne. La view ira lire ce model pour connaitre le type d’information à restituer puis ira dans une autre table ou seront stockés les valeurs.
En gros, il y aura un table « model+» définissant les nouvelles informations (key) à prendre en compte pour les clients et une table « donnée+» qui stockera pour chaque clients les valeurs (value) autrement dit il y aura autant de lignes par client (idclient, key,value) qu’il y a de nouvelles informations .
el mahdi
25 décembre 2009 à 15:57
34Bonjour,
Pour mois j’ai une erreur:
Fatal error: Call to a member function findModel_DbTable_Votes() on a non-object in C:\wamp\www\watchmydesk\application\modules\frontend\controllers\IndexController.php on line 6
Peter
28 décembre 2009 à 17:48
35Bonjour,
Pour mois j’ai une erreur:
Fatal error: Call to a member function findModel_DbTable_Votes() on a non-object in C:\wamp\www\watchmydesk\application\modules\frontend\controllers\IndexController.php on line 6
hicham
6 janvier 2010 à 15:44
36Bonjour;
j’ai suivi bien le tuto, c’est magnifique. Alors moi j’ai utilisé la dernière version de ZF 1.9.6.
j’ai utilsé xampp pour cette application. j’ai mis le dossier frameworks dans le dossier xampplite et le dossier de l’application watchmydesk dans le dossier xampplite/htdocs . est ce que ca marche comme ça?
FredT
27 février 2010 à 18:11
37Salut,
C’est méchamment gourmand les méthodes findModel_DbTable_xxx!!!
J’ai mis en place le Zend_Db_Profiler_Firebug, et à chaque appel à ces méthodes y’a une nouvelle requete DESCRIBE tablexxx lancée !
crowmosta
18 avril 2010 à 1:13
38No comment. Excelent tuto avec de très bon exemples.
En fouillant la doc j’ai pu ajouter des filtre avec « $select»
Merci
Titice
4 mai 2010 à 3:07
39Au secours!!!
J’ai la même erreur que Psykotik (Msg 26).
Quelqu’un aurait-il trouvé la solution?
Merci par avance.
fscan
30 mai 2010 à 17:45
40Je suis nouveau sur zend.
Apres avoir appliqué ligne apres ligne ton tuto, je me retrouve avec une page :
Montre ton bureau de geek
Watch my desk est un site o� vous pouvez partager, explorer et noter des photos du bureaux et ordinateurs du monde entier
Inscrivez vous pour partager vos bureaux, poster des coms… en 2 clics !
Vous �tes sur mon site
object(Zend_Db_Table_Rowset)#78 (10) {
["_data":protected] => array(1) {
[0] => array(4) {
["id"] => int(2)
["membres_id"] => int(1)
["bureaux_id"] => int(2)
["note"] => int(5)
}
[....]
Nicolas
1 août 2011 à 9:32
41Bonjour à tous,
Même problème aussi que Psykotik, et je calle… avez-vous la sollution ?
Suite à l’étape 2, j’ai :
vous etes sur mon site
object(Zend_Db_Table_Rowset)[65]
protected ‘_data’ =>
array
empty
protected ‘_table’ =>
object(Model_DbTable_Bureaux)[51]
protected ‘_name’ => string ‘bureaux’ (length=7)
protected ‘_definition’ => null
protected ‘_definitionConfigName’ => null
protected ‘_db’ =>
object(Zend_Db_Adapter_Pdo_Mysql)[21]
protected ‘_pdoType’ => string ‘mysql’ (length=5)
protected ‘_numericDataTypes’ =>
array
…
didine
17 janvier 2012 à 12:06
42Bonjour,
vous ne mettez pas de code dans la page index.phtml???
En appliquant le tutoriel, je me retrouve aussi avec une page blanche. =(
Merci pour la réponse
gérot
22 mai 2012 à 15:27
43Bonjour,
J’ai aussi l’erreur suivante :
Fatal error : Call to a member function findParentApplication_Model_DbTable_Membres() on a non-object in /Applications/MAMP/htdocs/PhpProject2/application/controllers/IndexController.php on line 19
où line 19 correspond à :
Zend_Debug::dump($vote->findParentApplication_Model_DbTable_Membres());
public function indexAction()
{
$membres = new Application_Model_DbTable_Membres(); // On instancie un modèle Membres.
$user = $membres->find(1)->current(); // On récupère le premier utilisateur.
Zend_Debug::dump($user->findApplication_Model_DbTable_Votes()); // On cherche les votes associés à l’utilisateur
Zend_Debug::dump($user->findApplication_Model_DbTable_Commentaires()); // On cherche les commentaires associés à l’utilisateur
$votes = new Application_Model_DbTable_Votes(); // On instancie un modèle Votes.
$vote = $votes->find(1)->current(); // On récupère le premier vote.
Zend_Debug::dump($vote->findParentApplication_Model_DbTable_Membres()); // On cherche l’utilisateur qui à posté le commentaire
$bureaux = new Application_Model_DbTable_Bureaux(); // On instancie un modèle Bureaux.
$bureau = $bureaux->find(2)->current(); // On récupère le second bureau.
Zend_Debug::dump($bureau->findApplication_Model_DbTable_Commentaires()); // On cherche les commentaires associés au bureau.
Zend_Debug::dump($bureau->findApplication_Model_DbTable_PhotosViaModel_DbTable_BureauxPhotos()); // On cherche les photos associées au bureau.
}
je n’ai pas compris le problème, c’est pour cela que je viens à vous. Le problème est-il dans le remplissage des tables ou quoi ?
gérot
23 mai 2012 à 7:34
44quelqu’un pourrait me répondre svp
Cyrille
19 mars 2013 à 5:33
45Bonjour,
Gerot, il faut remplir la base de données avec des valeurs
Laisser un commentaire
Devenir Fan de Dator.fr
Nuage de tags
Sponsors
Warning: gzinflate() [function.gzinflate]: data error in /homez.27/dator/www/wp-includes/http.php on line 1787
Blogoliste
Blogs Amis
Derniers Posts
Derniers Commentaires
Les meilleurs sujets
Propulsé par WordPress