Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Contexte :
Soit la classe Toto1 et Toto2, Toto2 hérite de la classe Toto1. Toto2 ne fait que définir deux méthodes supplémentaires, tous les attributs sont gérés par la classe Toto1. Une seule table pour mémoriser la persistance : Toto1.
Problème :
Mes deux modèles :
- Toto1 extends Zend_Db_Table
protected $_name = 'Toto1';
protected $_id = 'idtoto1';
- Toto2
protected $_name = 'Toto1';
protected $_id = 'idtoto1';
Malheureusement, je n’arrive pas à faire comprendre au système que même si la classe modèle Toto2 se base la table Toto1, l’objet retourné doit être de type Toto2. Actuellement, c’est un objet Toto1 qui m’est retourné.
Une idée ?
Merci de votre aide, bonnes salutations.
Patrick
Dernière modification par pduvanel (08-03-2009 21:27:12)
Hors ligne
il y a confusion il s'agit de classe représentant des collections et non des données
class Toto1_Table extends Zend_Db_Table { protected $_name = 'Toto1'; protected $_id = 'idtoto1'; protect rowClassName = 'Toto1_Row' ... } class Toto1_Row extends Zend_Db_Table_Row { ... } class Toto2_Table extends Toto1_Table { protect rowClassName = 'Toto2_Row' ... } class Toto2_Row extends Toto1_Row { ... } $tbl1 = new Toto1_Table(); $tbl2 = new Toto2_Table(); $toto1Element = $tbl1->fetch(); // return an Toto1_Row $toto2Element = $tbl2->fetch(); // return an Toto2_Row
A+JYT
Hors ligne
Merci pour l'aide, malheureusement je n'arrive pas à faire fonctionner l'exemple. Je pense que le problème vient de l'attribut protect rowClassName. J'ai essayé protected $rowClassName.
L'appel de la méthode fetch me renvoie l'erreur suivante : Call to undefined method $tbl2::fetch()
Une idée ?
Merci...
Hors ligne
Bonjour,
La méthode fetch() n'existe pas.
fetchAll() pour récupérer un rowset.
fetchRow() pour récupérer un row.
L'exemple était fait pour te donner une idée à mon avis
(RTFM !!! :p)
A+ benjamin.
Dernière modification par Delprog (10-03-2009 07:44:53)
Hors ligne
je donnais l'idée générale qui est derrière il faut lire la doc
Une table est un table et un enregistrement un enregistrement
tu ne peux pas demander à une table de te retourner une table
c'est une aberration
A+JYT
Hors ligne
Merci, l'apprentissage du framework Zend en autoditacte n'est pas aisé.
Je ne saisis pas bien le rôle de l'attribut : protect rowClassName = 'Toto1_Row'. Cet attribut me semble important dans la solution à mon problème.
Question plus fondamentale : il n'y a rien de plus simple pour lire un row dans une table nommée Toto1 et le retourner en tant qu'objet d'une classe Toto2 ?
Désolé pour mon ignorance. Merci à tous.
Patrick
Hors ligne
Dans ce cas là, Toto2 doit étendre Zend_Db_Table_Row(_Abstract) et non Toto1.
Zend_Db_Table représente une collection de données (une table) et Zend_Db_Table_Row un élément de cette collection (un enregistrement actif ou un nouvel enregistrement).
Il est possible de redéfinir les classes à utiliser pour les Row et les Rowset dans Zend_Db_Table.
Dans ton cas et pour reprendre avec tes noms de classes on aurait :
class Toto1 extends Zend_Db_Table_Abstract { // protected $_name = 'Toto1'; protected $_rowClass = 'Toto2'; protected $_rowsetClass = 'Toto3'; // vraiment si tu as des méthodes particulières aux rowset, très rare } class Toto2 extends Zend_Db_Table_Row_Abstract { ... } class Toto3 extends Zend_Db_Table_Rowset_Abstract { ... }
Les méthodes de manipulation particulières à un enregistrement doivent exister dans la classe Toto2.
Sauf que ce n'est pas conventionnel dans la façon de nommer les classes.
Et comme dit sekaijin tu devrais avoir une classe Toto1_Table pour représenter la collection, Toto1_Row (dans ta question il s'agit de Toto2) pour représenter un élement de cette collection et Toto1_Rowset (franchement pas obligatoire) pour un ensemble d'éléments de la collection.
Tout est dans la doc et très bien expliqué :
http://framework.zend.com/manual/fr/zend.db.html >>> 13.5. Zend_Db_Table
La doc manque d'exemples complets mais est tout de même très bien foutue, il faut la lire dans l'ordre comme un bouquin et tout prend son sens au fur et à mesure de la lecture.
A+ benjamin.
Hors ligne
Merci !
Grâce à votre aide, mon problème est résolu !
Bien à vous.
Patrick
Hors ligne