Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 25-07-2007 10:45:55

jzender
Membre
Date d'inscription: 12-07-2007
Messages: 25

$db utilisé dans une autre classe

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 :

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) :

Code:

$db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
Zend_Db_Table::setDefaultAdapter($db);

Le contrôleur, quant à lui, avait juste à faire :

   

Code:

$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 :

   

Code:

$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 :

Code:

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 :

Code:

// 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 :

Code:

<?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);"
) :

Code:

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);"
) :

Code:

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

 

#2 25-07-2007 11:57:03

jzender
Membre
Date d'inscription: 12-07-2007
Messages: 25

Re: $db utilisé dans une autre classe

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

 

#3 26-07-2007 09:12:49

jzender
Membre
Date d'inscription: 12-07-2007
Messages: 25

Re: $db utilisé dans une autre classe

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 smile

Merci,
JZender.

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