Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous !
Utilisant le modèle M.V.C. pour développer une application, j'ai commencé par une première version "simple" d'un script qui fait une lecture dans une base de données (il s'agit en fait d'une recherche sur une table Client). Mon contrôleur se chargeait de cette recherche en instanciant une classe Client, dont voici le code :
<?php class Client extends Zend_Db_Table { protected $_name = 'client'; }
La connexion à la base de données est effectuée depuis le fichier index.php à la racine de l'application, de la manière suivante ($config est un index du registre qui a été défini plus haut dans le fichier) :
$db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray()); Zend_Db_Table::setDefaultAdapter($db);
Le contrôleur, quant à lui, avait juste à faire :
$client = new Client(); $db = $client->getAdapter();
Il peut ainsi exécuter la requête et récupérer les résultats dans une variable visible depuis la vue :
$this->view->clients = $client->fetchAll($where);
Jusque là tout va bien ...
Seconde étape : plutôt que de tout faire dans le contrôleur, j'aimerais instancier une classe qui va s'occuper de la recherche et me renvoyer les résultats.
Cette classe, je l'appelle RechercheClient :
class RechercheClient { // Attributs prives protected $raisonsociale; protected $siret; function __construct($rs, $nums) { Zend_Loader::loadClass('Client'); $this->raisonsociale = $rs; $this->siret = $nums; } public function rechercherClient() { $client = new Client($this->raisonsociale, $this->siret); // Recuperation d'un lien vers la base de donnees $db = $client->getAdapter(); //$db = Zend_Registry::get('adapter'); // Recherche simple (sans jointures) if ($this->raisonsociale != '') { $this->raisonsociale = '%' . $this->raisonsociale . '%'; $where = "raisonsociale LIKE \'$this->raisonsociale\'"; //$where = $db->quoteInto("raisonsociale LIKE ?", $this->raisonsociale); } if ($this->siret != '') { $this->siret = '%' . $this->siret . '%'; //$where2 = "siret LIKE \'$this->siret\'"; $where2 = $db->quoteInto("siret LIKE ?", $this->siret); if ($this->raisonsociale != '') { $where = $where . ' AND ' . $where2; } else { $where = $where2; } } // Execution de la requete return $client->fetchAll($where); } }
Et depuis le contrôleur, je fais :
// Instanciation du service $rc = new RechercheClient($raisonsociale, $siret); // Lancement de la Recherche $this->view->clients = $rc->rechercherClient();
Il a bien entendu fallu modifier la classe Client de la manière suivante :
<?php class Client extends Zend_Db_Table { protected $_name = 'client'; private $raisonsociale; private $siret; function __construct($rs, $nums) { $this->raisonsociale = $rs; $this->siret = $nums; } /** * Getters de $raisonsociale et $siret. */ public function getRs() { return $this->raisonsociale; } public function getNums() { return $this->siret; } }
Mon problème : j'obtiens ce message d'erreur lorsque je n'utilise pas quoteInto() (ligne de code impactée =
"return $client->fetchAll($where);"
) :
Fatal error: Call to a member function select() on a non-object in C:\wamp\phenix\www\maquette_mvc_0-4\library\Zend\Db\Table\Abstract.php on line 1074
Et celui-ci lorsque je l'utilise (ligne impactée =
"$where2 = $db->quoteInto("siret LIKE ?", $this->siret);"
) :
Fatal error: Call to a member function quoteInto() on a non-object in C:\wamp\phenix\www\maquette_mvc_0-4\application\models\services\RechercheClient.php on line 65
Le problème vient apparemment de $db qui "n'est pas un objet", lui-même déduit de $client qui "n'est pas un objet" non plus !
Pourtant, Zend Studio reconnaît les fonctions par auto-complétion après "$db->" et "$client->" ...
Quelqu'un peut-il m'aider svp ?
Merci d'avance,
JZender.
Hors ligne
Le problème a été identifié !!
Il s'agit de la classe Client (extension de Zend_Db_Table). En gardant celle d'origine et en déportant les attributs et fonctions qui y avaient été rajoutés dans RechercheClient, cela fonctionne.
Hors ligne
Finalement, si quelqu'un sait m'expliquer pourquoi on ne peut pas implémenter la classe Client comme une classe classique (même si elle hérite d'une autre), je suis preneur
Merci,
JZender.
Hors ligne