Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'ai une classe qui hérite de Zend_Db_Table_Row_Abstract et lorsque je j'essaye de l'associer à une table avec le code suivante :
$this->setTable(new ClasseQuiHeriteDeZend_Db_Table_Abstract());
J'ai l'erreur suivante :
Fatal error: Class name must be a valid object or a string in /opt/lampp/htdocs/DavjackCMS/site/library/Zend/Db/Table/Row/Abstract.php on line 324
La ligne sus-mentionnée est la suivante (ligne 2 : if...) :
$tableClass = get_class($table); if (! $table instanceof $this->_tableClass) { require_once 'Zend/Db/Table/Row/Exception.php'; throw new Zend_Db_Table_Row_Exception("The specified Table is of class $tableClass, expecting class to be instance of $this->_tableClass"); }
Je cherche depuis un moment sans succès
Une idée?
Dernière modification par Davjack (19-02-2009 16:52:36)
Hors ligne
Je vais peut-être vous donner plus de détails (comme je débute avec Z-F) sur ma méthode de développement (qui n'est peut-être pas adaptée à Z-F).
Je développe en MVC avec des modules. Actuellement j'en suis au module de base (default).
Les modules sont organisés de la manière suivante (répertoires et fichiers non exhaustifs) :
module/
config/
controllers/
models/
Site.php
Site/
CSite.php
TSite.php
views/
Le fichier CSite.php contient toute la logique métier de la classe Site. Le fichier TSite.php contient les liaisons vers la table sites de la base de donnée (MySql).
Site.php est une classe qui devrait me permet de m'abstraire totalement du fait que j'ai deux classes (CSite et TSite). Le but est de n'utiliser que la classe Site dans les contrôleurs pour manipuler des enregistrement déjà existants et en créer de nouveaux.
Dans mon bootstrap, j'ai ajouter le chemin vers le répertoire des models/ pour pouvoir charger automatiquement les classes de ce répertoire.
CSite.php (le contenu des fichiers est incomplet, mais c'est pour l'exemple )
<?php class CSite extends Zend_Db_Table_Row_Abstract { /** * ACCESSEURS */ public function getId() { return $this->id; } public function getName() { return $this->name; } public function setName($name) { $this->name = $name; } public function getBaseUrl() { return $this->base_url; } public function setBaseUrl($base_url) { $this->base_url = $base_url; } public function getActived() { return $this->actived; } /** * METHODES */ /** Met le site en maintenance */ public function setActived() { $this->actived = TRUE; } /** Active le site */ public function setUnactived() { $this->actived = FALSE; } }
TSite.php
<?php class TSite extends Zend_Db_Table_Abstract { protected $_name = 'sites'; protected $_primary = 'id'; protected $_rowClass = 'CSite'; /** * METHODES STATICS */ /** * Cherche un site selon un identifiant * * @return Site */ public static function findById($id) { $site = new TSite(); return $site->find($id)->current(); } /** * ETC... */ }
Site.php
<?php require_once 'Site/TSite.php'; require_once 'Site/CSite.php'; class Site extends CSite { public function init() { $this->setTable(new TSite()); } public static function findById($id) { return TSite::findById($id); } }
La ligne qui provoque ma "Fatal error" est $this->setTable(new TSite());
Voilà, j'espère que j'ai été compréhensible.
Si ce n'est pas le cas, redites-moi
Merci d'avance pour votre aide
Hors ligne
Si tu instancie ta table dans une variable avant ?
$tSite = new TSite(); $this->setTable($tSite);
Mais bon ça me semble "bizarre" comme utilisation.....
Hors ligne
J'avais déjà essayé mais j'ai la même erreur avec la table préalablement instanciée.
Hors ligne
Après avoir approfondi mes recherches, j'ai remarqué que j'ai mal compris la fonction setTable(). Cette fonction permet de reconnecter un tuple (row) déjà existant à une table de base de données mais pas à définir un la table d'un nouveau tuple.
Pour ceux qui choisiraient que ça intéresse, j'ai finalement opté pour une solution d'implémentation légèrement différente au niveau de la classe Site (méthode static create() ).
La voici :
<?php require_once 'Site/TSite.php'; require_once 'Site/CSite.php'; class Site extends CSite { public function __construct() { } public static function create() { $tsite = new TSite(); return $tsite->createRow(); } public static function findById($id) { return TSite::findById($id); } /** * ETC... */ }
De cette manière, je manipule uniquement la classe Site, donc des objets Site, depuis les contrôleurs --> pas de notion de table ou row.
De plus (et c'est le but principal de cet implémentation), ma classe métier est très facile à adapter à un autre environnement de développement (ou framework). Il suffit de supprimer extends Zend_Db_Table_Row_Abstract.
Hors ligne