Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework
Zend Framework Forum d'entraide sur la programmation PHP avec Zend Framework. Avant de poster -> FAQ ZF, Cours ZF
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/08/2011, 15h50   #1
Invité de passage
 
Homme
Étudiant
Inscription : août 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2011
Messages : 10
Points : 0
Points : 0
Par défaut Problème avec find()

Salut

je bosse actuellement sur un back-office d'un site : j'affiche les enregistrements et je dois pouvoir les modifier ou supprimer ou en ajouter grâce aux liens Modifier, supprimer, ajouter :

donc voila le code du controleur qui me pose problème lors de l'enregistrement :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
public function saveAction()
{
	require_once 'modules/disponibilite/models/formulairedisponibilite.php';
	$this->view->titleedit = "Sauvegarder Article";
        $form = new FormulaireDisponibilite();
        $form->submit->setLabel('Enregistrer !!');
        $this->view->form = $form;
 
        if ($this->_request->isPost()) {
                 $formData = $this->_request->getPost();
                 if ($form->isValid($formData)) {
                         $disponibilite = new Disponibilite();
                         $id = (int)$form->getValue('id');
                         $row = $disponibilite->find($id);
                         $row->num_villa = $form->getValue('numvilla');
                         $row->type_villa = $form->getValue('typevilla');
	                 $row->surface_rdc = $form->getValue('surfacerdc');
                         $row->surface_etage = $form->getValue('surfaceetage');
			 $row->surface_habitable = $form->getValue('surfacehabitable');
                         $row->surface_plancher = $form->getValue('surfaceplancher');
			 $row->surface_jardin = $form->getValue('surfacejardin');
                         $row->surface_totale = $form->getValue('surfacetotale');
                         $row->save(); // La ligne qui pose Problème :@
 
                         $this->_redirect('/disponibilite/admin');
                 }
		 else {
                         $form->populate($formData);
                 }
         }
	 else {
                 $id = (int)$this->_getParam('id', 0);
                 if ($id > 0) {
                        $disponibilite = new Disponibilite();
                        $dispo = $disponibilite->find($id) ;
			$form->numvilla->setValue($dispo->num_villa) ;
			$form->typevilla->setValue($dispo->type_villa) ;
			$form->surfacerdc->setValue($dispo->surface_rdc) ;
			$form->surfaceetage->setValue($dispo->surface_etage) ;
			$form->surfacehabitable->setValue($dispo->surface_habitable) ;
			$form->surfaceplancher->setValue($dispo->surface_plancher) ;
			$form->surfacejardin->setValue($dispo->surface_jardin) ;
			$form->surfacetotale->setValue($dispo->surface_totale) ;
                        //$form->populate($dispo->toArray());
                 }
         }
}
(j'ai utilisé setValue car populate ne voulait pas fonctionner )

et quand je clique sur "Enregistrer !!" j'ai une jolie erreur qui sort :

Fatal error: Call to undefined method Zend_Db_Table_Rowset::save() in /opt/lampp/htdocs/jardinDeLaColline/zr/modules/disponibilite/controllers/AdminController.php on line 41

Des idées sur ce problème ??

Merci d'avance
Mehdi Fal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 17h20   #2
Membre chevronné
 
Homme Taoufiq Ben
Développeur Web
Inscription : mai 2009
Messages : 465
Détails du profil
Informations personnelles :
Nom : Homme Taoufiq Ben
Âge : 25
Localisation : Maroc

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2009
Messages : 465
Points : 651
Points : 651
Essai avec à la place de find()
Code :
1
2
$disponibilite->fetchRow($disponibilite->select()
                            ->where('id = ?', 1));
find() retournent un objet de type Zend_Db_Table_Rowset par contre
fetchRow() retourne un objet de type Zend_Db_Table_Row ou il y a la method save.
m4riachi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 17h25   #3
Membre chevronné
 
Homme Taoufiq Ben
Développeur Web
Inscription : mai 2009
Messages : 465
Détails du profil
Informations personnelles :
Nom : Homme Taoufiq Ben
Âge : 25
Localisation : Maroc

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2009
Messages : 465
Points : 651
Points : 651
Pour respecter le Pattern MVC les requêtes vers la base doivent être séparer du C (Controller), c'est le travail des M (Models).
m4riachi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 17h55   #4
Invité de passage
 
Homme
Étudiant
Inscription : août 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2011
Messages : 10
Points : 0
Points : 0
Merci

Apparemment j'ai toujours un problème avec save() :

Fatal error: Call to a member function save() on a non-object in /opt/lampp/htdocs/jardinDeLaColline/zr/modules/disponibilite/controllers/AdminController.php on line 66
Mehdi Fal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 18h02   #5
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Il te faut faire le save sur l objet row
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 18h05   #6
Invité de passage
 
Homme
Étudiant
Inscription : août 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2011
Messages : 10
Points : 0
Points : 0
Même en utilisant le fetchRow ca marche pas
Mehdi Fal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 20h09   #7
Membre régulier
 
Avatar de Alcide_
 
Homme
Étudiant
Inscription : juin 2008
Messages : 70
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 70
Points : 78
Points : 78
La méthode "find()" retourne un rowset donc il te faut récupérer ton row avec la méthode "current()".
exemple :
Code :
1
2
 
$myRow = $table->find($id)->current();
Alcide_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 15h57   #8
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Citation:
Envoyé par Alcide_ Voir le message
La méthode "find()" retourne un rowset donc il te faut récupérer ton row avec la méthode "current()".
exemple :
Code :
1
2
 
$myRow = $table->find($id)->current();
Tu devrais lire tout le topic avant de répondre car cela a été évoqué par m4riachi
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 16h51   #9
Membre régulier
 
Avatar de Alcide_
 
Homme
Étudiant
Inscription : juin 2008
Messages : 70
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 70
Points : 78
Points : 78
Pardon, il est vrai que mon message était incomplet... Rectifions :
Comme le dit précédemment m4riachi,
Citation:
La méthode "find()" retourne un rowset donc
si tu veux récupérer un row (et vue que personne n'a parler de "current()" dans ce topic )
Citation:
il te faut récupérer ton row avec la méthode "current()".
Cela me semble plus approprié pour faire des recherches sur les clés primaires et accessoirement plus simple.
Voici un petit
Citation:
exemple :
Code :
$myRow = $table->find($id)->current();
Après, pour être sûr d'avoir un enregistrement, tu peux vérifier avec un "count()" :
Code :
1
2
3
4
5
 
$rowset = $table->find($id);
if(count($rowset)>0){
    $myRow = $rowset->current();
}
tu éviteras les erreurs "Call to a member function ... on a non-object".
Si tu veux plutôt utiliser "fetchRow()" tu peux tester l'existence de ton row comme cela :
Code :
1
2
3
4
5
 
/*en condensé */
if(($myRow = $table->fetchRow('id = '.$id)) != null){
    /*du code...*/
}
Citation:
Envoyé par 5h4rk Voir le message
Tu devrais lire tout le topic avant de répondre car cela a été évoqué par m4riachi
Tu devrais plutôt aider les personnes de ce forum avec des posts constructifs au lieu de jouer au redresseur de torts.
Alcide_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 18h34   #10
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Justement c'est ce que je fais et j'attends ses réponses avant de poster de nouveau mais quand il faut rectifier j'en prend la peine car ce forum est trés peu modérer en ce moment donc il faut au moins que ceux qui répondent y mettent du leur.

Et si tu regarde bien sont problème ma réponse en fait partie car il tente soit de faire un save quelque chose qui n'est pas un row et cette méthode fonctionne sur un row.

Pour rappel un row est une ligne d'un rowset donc en gros quand :
ou
Le retour est un rowset donc un ensemble de résultat, pour récupérer le premier il est possible d'y appliquer current() ou encore de le parcourir à travers d'un foreach ou chaque passage correspondra à un row

il est également possible comme cela a déjà été précisé, d'utiliser
Qui lui retourne un seul résultat correspond à un row

Par contre ce genre de message est plus que bizarre de ta part :
Citation:
$rowset = $table->find($id);
if(count($rowset)>0){
$myRow = $rowset->current();
}
Si le find ne retourne pas de résultat c'est un NULL qui est stocké dans rowset donc fair eun count dessus est inutile même si ça fonctionne, car cela peut poser des problèmes de conception à certains moment.

pourquoi ne pas avoir fait :
Code :
1
2
3
4
5
 
$rowset = $table->find($id);
if(!empty($rowset)){
    $myRow = $rowset->current();
}
Si j'insiste et corrige par moment c'est que les personnes qui demandent de l'aide ne savent pas exactement procéder et je ne tiens pas à leur faire prendre de mauvaises manières.

Cela dit il m'est également possible de dire des âneries et dans ce cas là me corriger.
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 11h28   #11
Membre régulier
 
Avatar de Alcide_
 
Homme
Étudiant
Inscription : juin 2008
Messages : 70
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 70
Points : 78
Points : 78
La méthode "find()" ne renvoi pas un NULL si il n'y a pas d'enregistrement...
la doc sur "find()"
Et je cite :
Citation:
Quoiqu'il en soit, l'objet de retour est bien un Zend_Db_Table_Rowset_Abstract.
La methode fetchAll() non plus d'ailleurs...
la doc sur les "Rowset"
Je cite :
Citation:
Un requête légitime peut retourner zéro enregistrement, donc zéro Rows. De ce fait, un objet Rowset peut contenir zéro objet Row. Comme Zend_Db_Table_Rowset_Abstract implémente l'interface Countable, vous pouvez utiliser la fonction PHP count() dessus, pour compter les Rows qu'il contient.
et il y a même un magnifique exemple dans la doc:
Citation:
Exemple #2 Compter les Rows dans un Rowset
Code :
1
2
3
4
5
6
7
8
9
10
 
    $rowset   = $bugs->fetchAll("bug_status = 'FIXED'");
 
    $rowCount = count($rowset);
 
    if ($rowCount > 0) {
        echo "$rowCount rows trouvés";
    } else {
        echo 'Pas de rows pour cette requête';
    }
et comme les sources ne mentent jamais (ZF 1.11.5) :
méthode "find()" :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
    /* 
     * @param  mixed $key The value(s) of the primary keys.
     * @return Zend_Db_Table_Rowset_Abstract Row(s) matching the criteria.
     * @throws Zend_Db_Table_Exception
     */
    public function find()
    {
          /***/
          return $this->fetchAll($whereClause);
     }
méthode "fetchAll()" :
Code :
1
2
3
4
5
6
7
8
9
 
   /*
    * @return Zend_Db_Table_Rowset_Abstract The row results per the Zend_Db_Adapter fetch mode.
    */
    public function fetchAll($where = null, $order = null, $count = null, $offset = null)
    {
         /***/
         return new $rowsetClass($data);
    }
Quand je me trompe, que je suis en tort ou que mes propos manquent de clarté, je m'en excuse publiquement et je rectifie mes dire pour ne pas induire en erreur les personnes qui lisent ce forum et qui y trouvent une aide parfois très précieuse.
Dans le cas présent, il serait donc bon que tu te corriges et peut-être devrions-nous avoir une discussion en MP pour éviter ce genre d'altercation dans de prochains topics.

Je commence à trouver lassant de devoir me justifier et citer la doc pour toi, 5h4rk...
Alcide_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h54.


 
 
 
 
Partenaires

Hébergement Web