Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 10-10-2011 17:09:24

Absot
Membre
Date d'inscription: 28-12-2009
Messages: 170
Site web

[Résolu] Impossible d'utiliser une méthode de mon objetRow

Bonjour, j'ai une classe Batiment où dedans, j'ai une méthode qui me renvoi tout mes bâtiments sous forme d'un tableau d'objet.

Dans ma vue, j'effectue un foreach pou pouvoir interagir sur chacun de mes objets.

Sur chacun de mes objets, j'appelle la méthode getSecteur() qui se situe dans la class row de cette objet mais j'ai une erreur comme quoi je fais appel à une méthode qui n'est pas définie alors qu'elle l'est belle et bien..

Voici  mon controlleur:

Code:

$batiments = $batiment->getBatimentsByIdSecteur($idSecteur);
           
$this->view->batiments = $batiments;

Ma vue:

Code:

foreach($this->batiments as $unBatiment)
{
    echo "<tr>
              <td>" . $unBatiment->nom . "</td>
              <td>" . $unBatiment->getSecteur() . "</td>
              <td>" . $unBatiment->nbrInscrits . "</td>
          </tr>";
}

Ma classe row (BatimentRow):

Code:

<?php
class BatimentRow extends Zend_Db_Table_Row_Abstract 
{

    public function getSecteur()
    {
        return $this->getTable()->getAdapter()->fetchOne("SELECT s.nom
                                                  FROM Secteur s, Batiment b, Couvrir c
                                                  WHERE s.id = c.idSecteur
                                                  AND b.id = c.idBatiment
                                                  AND b.id = " . $this->id);
    }
}

Pourquoi j'ai cette erreur svp?

Dernière modification par Absot (12-10-2011 13:58:13)

Hors ligne

 

#2 10-10-2011 17:31:09

tdutrion
Administrateur
Lieu: Dijon, Paris, Edinburgh
Date d'inscription: 23-12-2009
Messages: 614
Site web

Re: [Résolu] Impossible d'utiliser une méthode de mon objetRow

Bonjour,

Pourrais-tu nous donner le code complet du controlleur (en fait surtout l'instanciation de $batiment), ainsi que le code de la classe de $batiment ?

Hors ligne

 

#3 10-10-2011 17:52:54

Absot
Membre
Date d'inscription: 28-12-2009
Messages: 170
Site web

Re: [Résolu] Impossible d'utiliser une méthode de mon objetRow

Voici le code de mon controller:

Code:

<?php

require_once "Batiment.php";

class IndexController extends Zend_Controller_Action
{

    public function init()
    {

    }

    public function indexAction()
    {
        $idSecteur = $this->_getParam("idSecteur", 0);
      
        $batiment = new Batiment();
        $batiments = $batiment->getBatimentsByIdSecteur($idSecteur);
             
        $this->view->batiments = $batiments;
        
    }
}

Si jamais $idSecteur == 0, alors je prends tout les bâtiments dans ma méthode getBatimentByIdSecteur();

La classe Batiment:

Code:

class Batiment extends Zend_Db_Table_Abstract 
{    
    // Nom de la table
    protected $_name = 'Batiment';
    // Clé primaire
    protected $_primary = 'id';
    protected $_rowClass = 'BatimentRow'; 
        
    public function getBatimentsByIdSecteur($idSecteur)
    {
        $db = $this->getAdapter();
        $db->setFetchMode(Zend_Db::FETCH_OBJ);
        
        if($idSecteur == 0)
        {
            return $db->fetchAll("SELECT * 
                                    FROM Batiment");
        }else 
        {
            return $db->fetchAll("SELECT * 
                              FROM Batiment b, Secteur s, Couvrir c 
                              WHERE b.id = c.idBatiment
                              AND c.idSecteur = s.id 
                              AND s.id = " . $idSecteur);
        }
    }

Hors ligne

 

#4 10-10-2011 17:57:23

tdutrion
Administrateur
Lieu: Dijon, Paris, Edinburgh
Date d'inscription: 23-12-2009
Messages: 614
Site web

Re: [Résolu] Impossible d'utiliser une méthode de mon objetRow

Si tu fais un Zend_Debug::dump($this->batiments); dans ta vue, tu verras que tes objets ne sont pas des batimentrow...

Hors ligne

 

#5 10-10-2011 18:10:32

Absot
Membre
Date d'inscription: 28-12-2009
Messages: 170
Site web

Re: [Résolu] Impossible d'utiliser une méthode de mon objetRow

En faisant ça, j'obtiens un objet stdClass, il faut que je fasse quoi pour obtenir des batimentsrow (j'ai regardé la documentation mais je ne trouve pas que c'est clair)?

Dernière modification par Absot (10-10-2011 18:13:21)

Hors ligne

 

#6 11-10-2011 10:44:16

Absot
Membre
Date d'inscription: 28-12-2009
Messages: 170
Site web

Re: [Résolu] Impossible d'utiliser une méthode de mon objetRow

J'ai réussi à me retourner mon tableau avec la méthode fetchAll() et des options mais si je veux exécuter une requête particulière avec des jointures, comment je dois l'écrire avec la méthode fetchAll()?

En SQL, elle resemblerait à ça:

Code:

"SELECT * 
FROM Batiment b, Secteur s, Couvrir c 
WHERE b.id = c.idBatiment
AND c.idSecteur = s.id 
AND s.id = " . $idSecteur;

J'ai essayé de cette façon avec fetchAll():

Code:

fetchAll('Batiment.id = Couvrir.idBatiment 
          AND Couvrir.idSecteur = Secteur.id
          AND Secteur.id = ' . $idSecteur);

J'obtiens une erreur comme quoi Couvrir.idBatiment n'existe pas.. hmm

Hors ligne

 

#7 11-10-2011 11:03:45

f.garoby
Membre
Date d'inscription: 02-03-2011
Messages: 105

Re: [Résolu] Impossible d'utiliser une méthode de mon objetRow

Bonjour,
Tu devrais peut-être construire ta requête en utilisant les méthodes de la classe Zend_Db_Table (select(), from(), where(), ...).

Hors ligne

 

#8 11-10-2011 12:17:38

Absot
Membre
Date d'inscription: 28-12-2009
Messages: 170
Site web

Re: [Résolu] Impossible d'utiliser une méthode de mon objetRow

Pour l'instant j'en suis à ça:

Code:

$row = $this->fetchAll($this->select()
                        ->from(array(
                                "Batiment", array('id'),
                            "Couvrir", array('idSecteur', 'idBatiment'),
                                "Secteur", array('id')
                            ))
                                            ->where()                         
                                            ->order('nbrInscrits DESC')
);

Je suis bloqué à mon where() parce que j'ai plusieurs champs id donc peut-être qu'ils vont être confondu et je ne sais pas comment faire et si j'essaie par exemple avec where('Batiment.id = Couvrir.idBatiment'), j'ai l'erreur comme quoi la colonne Couvrir.idBatiment n'existe pas.

Hors ligne

 

#9 11-10-2011 14:05:26

f.garoby
Membre
Date d'inscription: 02-03-2011
Messages: 105

Re: [Résolu] Impossible d'utiliser une méthode de mon objetRow

Je pense que ton WHERE est "erroné" dans la mesure où tu devrais plutôt utiliser des jointures entre tes tables "Batiments" et "Couvrir" d'une part, puis entre "Couvrir" et "Secteur" d'autre part !

Ce qui donnerait quelque chose comme suit :

Code:

[lang=php]
$row = $this->fetchAll( $this->select()
                             ->setIntegrityCheck(false)
                             ->from( array( 'b' => 'Batiment' ) )
                             ->join( array( 'c' => 'Couvrir' ),
                                     'b.id = c.idBatiment' )
                             ->join( array( 's' => 'Secteur' ),
                                     'c.idSecteur = s.id' )
                             ->where()
                             ->order( 'nbrInscrits DESC' ) );

Dernière modification par f.garoby (11-10-2011 14:06:01)

Hors ligne

 

#10 11-10-2011 15:02:35

Absot
Membre
Date d'inscription: 28-12-2009
Messages: 170
Site web

Re: [Résolu] Impossible d'utiliser une méthode de mon objetRow

La requête fonctionne mais ce n'est pas le résultat que je souhaiterais avoir.

Voici les tables en questions:
. Batiment
- id
- nom
- nbrInscrits

. Couvrir
- id
- idBatiment
- idSecteur

. Secteur
- id
- nom

Je souhaiterais que ça me renvoi toutes les informations de ma table Batiment (Rowset) pour qu'ensuite je puisse faire des traitements dessus.

La requête que tu as proposés renvoi l'id du batiment ["id"], le nom du secteur ["nom"], et le nombre d'inscrits du bâtiment ["nbrInscrits"].

En regardant la documentation, elle montre qu'apparemment il n'y a pas d'option dans la méthode select()..

Hors ligne

 

#11 11-10-2011 15:22:23

f.garoby
Membre
Date d'inscription: 02-03-2011
Messages: 105

Re: [Résolu] Impossible d'utiliser une méthode de mon objetRow

Comme l'indique la documentation que tu cites, il faut renseigner le 2° argument de la méthode 'from()', soit en y mettant '*', soit en citant les champs désirés, soit en mettant null pour indiquer qu'on n'en veut aucun.

Hors ligne

 

#12 11-10-2011 15:52:37

Absot
Membre
Date d'inscription: 28-12-2009
Messages: 170
Site web

Re: [Résolu] Impossible d'utiliser une méthode de mon objetRow

J'ai réussi ma requête! big_smile

Voilà ma requête final:

Code:

$row = $this->fetchAll($this->select()
                             ->setIntegrityCheck(false)
                             ->from(array( 'b' => 'Batiment' ), '*')
                             ->join(array( 'c' => 'Couvrir'),
                                     'b.id = c.idBatiment', null)
                             ->join( array('s' => 'Secteur'),
                                     'c.idSecteur = s.id', null)
                             ->where('s.id = ?', $idSecteur)
                             ->order('nbrInscrits DESC') 
            );

Merci de l'aide de tout le monde. smile

Hors ligne

 

#13 12-10-2011 12:56:07

Absot
Membre
Date d'inscription: 28-12-2009
Messages: 170
Site web

Re: [Résolu] Impossible d'utiliser une méthode de mon objetRow

Finalement, elle n'est pas résolu. big_smile

J'ai utilisé du jQuery pour faire de l'Ajax et quand je raffraichi ma page avec Ajax, j'obtiens bien mes Rowset avec leur propriété mais je n'ai plus accès à ma méthode row, ca ne me renvoi rien, j'ai essayé en faisant appel une méthode qui renvoi "1" et ça fonctionne, j'ai pensé à tricher et à appeler une méthode dans ma classe dans mon controlleur en donnant en paramètre tout mes objets mais bon, ce n'est peut-être pas la meilleure méthode je pense.. hmm

Pourquoi ma méthode ne fonctionne plus?

Edit: lorsque j'appelle la page pour la première fois, j'appelle la méthode row qui me retourne un objet stdclass et quand je rappelle cette méthode avec l'Ajax, ca me retourne un tableau associatif, comment ça se fait puisque la méthode est strictement la même..?

Dernière modification par Absot (12-10-2011 13:55:18)

Hors ligne

 

#14 12-10-2011 13:57:54

Absot
Membre
Date d'inscription: 28-12-2009
Messages: 170
Site web

Re: [Résolu] Impossible d'utiliser une méthode de mon objetRow

J'ai résolu mon problème, je lui ai spécifié de me retourner objet stdclass et c'est bon.

Résolu! big_smile

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