Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 08-03-2009 21:24:56

pduvanel
Nouveau membre
Date d'inscription: 08-03-2009
Messages: 6

Classe héritée avec une seule table

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

 

#2 09-03-2009 10:45:46

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Classe héritée avec une seule table

il y a confusion il s'agit de classe représentant des collections et non des données

Code:

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

 

#3 09-03-2009 22:35:18

pduvanel
Nouveau membre
Date d'inscription: 08-03-2009
Messages: 6

Re: Classe héritée avec une seule table

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

 

#4 10-03-2009 07:44:37

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Classe héritée avec une seule table

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 smile

(RTFM !!! :p)


A+ benjamin.

Dernière modification par Delprog (10-03-2009 07:44:53)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#5 10-03-2009 09:30:54

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Classe héritée avec une seule table

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

 

#6 10-03-2009 23:15:20

pduvanel
Nouveau membre
Date d'inscription: 08-03-2009
Messages: 6

Re: Classe héritée avec une seule table

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

 

#7 10-03-2009 23:49:58

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Classe héritée avec une seule table

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 :

Code:

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.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#8 12-03-2009 20:58:06

pduvanel
Nouveau membre
Date d'inscription: 08-03-2009
Messages: 6

Re: Classe héritée avec une seule table

Merci !

Grâce à votre aide, mon problème est résolu !

Bien à vous.

Patrick

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages