IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Form PHP Discussion :

Zend_form et id dans l'url pour insertion en base [ZF 1.7]


Sujet :

Zend_Form PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Par défaut Zend_form et id dans l'url pour insertion en base
    Bonjour,

    J'ai créé un formulaire (qui est un commentaire qu'on insère pour un article) très simple : nom + email + une description à saisir.

    Hors, ce formulaire est destiné à un article spécifique. Je connais son "id" car je le possède dans mon url, et cette id doit etre inséré dans ma table, car c'est une clef étrangère.

    url
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    http://localhost/tutoriel-zf/public/index/voirarticle/id/1
    Pour être plus clair, voici le code:

    shéma de la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE `commentaire` (
    	`id` INT NOT NULL AUTO_INCREMENT ,
    	`nom` VARCHAR( 255 ) NOT NULL ,
    	`email` VARCHAR( 255 ) NOT NULL ,
    	`contenu` VARCHAR( 255 ) NOT NULL ,
    	`idArticle` INT NOT NULL, 	
    	PRIMARY KEY ( `id` ),
    	KEY `com_art_fk_constraint` (`idArticle`),
    	CONSTRAINT `com_art_fk_constraint` FOREIGN KEY (`idArticle`)
    	REFERENCES `articles` (`id`)
    ) 	ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8_unicode;
    indexController
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    	//ajouter un nouveau commentaire
    	function addcomAction(){
    		$this->view->title="ajouter com";
    		$formCom = new CommentaireForm();
    		if($this->_request->isPost()){
    			$formData = $this->_request->getPost();
    			$formCom->populate($formData);
    			$formData=$formCom->getValues();
    			if($formCom->isValid($formData)){
    				$com = new Commentaire();
    				$commentaire = $com->createRow($formData);
    				if($commentaire){
    					$id=$commentaire->save();
    					$this->_redirect('/index/voirarticle');
    				}
    			}
    		}
    		$this->view->formCom=$formCom;
    	}
    CommentaireForm.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    class CommentaireForm extends Zend_Form{
    	public function __construct($options=null){
    		parent::__construct($options);
     
    		$this->setName('ajouterCommentaire');
    		$nom = new Zend_Form_Element_Text('Nom');
    		$nom->setLabel('nom')
    				->setRequired(true);		
    		$email=new Zend_Form_Element_Text('Email');
    		$email->setLabel('email')	
    					->setRequired(True);
    		$contenu= new Zend_Form_Element_Textarea('Contenu');
    		$contenu->setLabel('commentaire')
    					->setRequired(True);
    		$submit = new Zend_Form_Element_Submit('envoyer');
    		$submit->setLabel('envoyer');
    		$this->addElements(array($nom,$email,$contenu,$submit));
    	}
    }
    J'insère bien les différents champs sauf l'idArticle, ce qui provoque une erreur.

    Merci pour votre aide

  2. #2
    Membre expérimenté Avatar de Alshten
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 157
    Par défaut
    C'est normal, ton id article est dans ton URL et quand tu fais getValues(), cela ne récupère que les données de ton formulaire et pas les données contenues dans ton URL.
    Si tu veux faire ça proprement, tu peux insérer un champ Hidden dans ton formulaire avec comme id IdArticle et comme valeur l'id article de l'URL, dans ce cas il faudrait aussi utiliser getParams() au lieu de getPost() lors de ton populate pour récupérer les paramètres d'URL.
    Ou alors lors de ton createRow tu peux juste mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $commentaire = $com->createRow($this->_request->getParams());
    Ce qui devrait marcher aussi.

  3. #3
    Membre éclairé Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Par défaut
    Voila, moi j'avais dans l'idée que dans commentaireForm, lors de la construction du formulaire je récupère l'id qui est dans l'url et que je le transmette à travers la méthode addElements

    Ce qui donnerait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class CommentaireForm extends Zend_Form{
    	public function __construct($options=null){
                    ....
                    $id = new Zend_Form_Element_Hidden('id');
    		$id = $this->_request->getParams();	
                    ....
                    $this->addElements(array($nom,$email,$contenu,$id,$submit));
    mais ca ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Call to a member function getParams() on a non-object in C:\wamp\www\tutoriel-zf\application\models\CommentaireForm.php on line 7

  4. #4
    Membre expérimenté Avatar de Alshten
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 157
    Par défaut
    En fait on ne peut pas récupérer l'objet _request comme ça dans un Zend_Form, il faudrait passer par Zend_Controller_Front pour le récupérer dans un Zend_Form et ce serait compliqué.
    Par contre si tu enlève la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $id = $this->_request->getParams();
    Et que tu fais ton action comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    function addcomAction(){
    		$this->view->title="ajouter com";
    		$formCom = new CommentaireForm();
    		$formCom->populate($this->_request->getParams());
    		if($this->_request->isPost()){
    			$formData=$formCom->getValues();
    			if($formCom->isValid($formData)){
    				$com = new Commentaire();
    				$commentaire = $com->createRow($formData);
    				if($commentaire){
    					$id=$commentaire->save();
    					$this->_redirect('/index/voirarticle');
    				}
    			}
    		}
    		$this->view->formCom=$formCom;
    	}
    Ca devrait mettre le Hidden à la bonne valeur.

  5. #5
    Membre éclairé Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Par défaut
    Merci Alshten pour ta réponse.

    A vrai dire je ne comprend pas ce que tu as fais, dans un premier j'ai recopier (bêtement) ce que tu as mis, ce qui me provoque la meme erreur qu'a mon tout début


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Uncaught exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[HY000]: General error: 1452 Cannot add or update a child row: a foreign key constraint fails (`zend/commentaire`, CONSTRAINT `com_art_fk_constraint` FOREIGN KEY (`idArticle`) REFERENCES `articles` (`Id`))' in C:\wamp\www\tutoriel-zf\library\Zend\Db\Statement\Pdo.php:238 Stack trace: #0 C:\wamp\www\tutoriel-zf\library\Zend\Db\Statement.php(283): Zend_Db_Statement_Pdo->_execute(Array) #1 C:\wamp\www\tutoriel-zf\library\Zend\Db\Adapter\Abstract.php(430): Zend_Db_Statement->execute(Array) #2 C:\wamp\www\tutoriel-zf\library\Zend\Db\Adapter\Pdo\Abstract.php(220): Zend_Db_Adapter_Abstract->query('INSERT INTO `co...', Array) #3 C:\wamp\www\tutoriel-zf\library\Zend\Db\Adapter\Abstract.php(508): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `co...', Array) #4 C:\wamp\www\tutoriel-zf\library\Zend\Db\Table\Abstract.php(924): Zend_Db_Adapter_Abstract->insert('commentaire', Array) #5 C:\wamp\www\tutoriel-zf\library\Zend\Db\Table\Row\Abstract.php(447 in C:\wamp\www\tutoriel-zf\library\Zend\Db\Statement\Pdo.php on line 238
    En trainant sur ce site :
    http://fr.wikibooks.org/wiki/Zend_Fr...i_blog/Actions

    j'ai l'impression qu'il récupère l'id de l'url :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    $id = new Zend_Form_Element_Hidden ( 'id' );
    		$this->addElement ( $id );
                       ....
    	        // le bouton envoi
    		$submit = new Zend_Form_Element_Submit ( 'submit' );
    		$submit->setAttrib ( 'id', 'submitbutton' );
    ???

  6. #6
    Membre expérimenté Avatar de Alshten
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 157
    Par défaut
    Citation Envoyé par miya Voir le message
    j'ai l'impression qu'il récupère l'id de l'url :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    $id = new Zend_Form_Element_Hidden ( 'id' );
    		$this->addElement ( $id );
                       ....
    	        // le bouton envoi
    		$submit = new Zend_Form_Element_Submit ( 'submit' );
    		$submit->setAttrib ( 'id', 'submitbutton' );
    ???
    Pas du tout en fait. En premier il crée juste un Hidden nommé id et ensuite il crée juste un bouton submit auquel il met comme id la valeur 'submitbutton'.

    En fait je viens de regarder plus précisément ton code et il y a plusieurs choses qui ne vont pas.

    Quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $nom = new Zend_Form_Element_Text('Email');
    $nom->setLabel('email')
    	->setRequired(true);
    Cela met comme identifiant à l'élément la valeur passée en paramètre au constructeur donc ici 'Email' et ce qui sera affiché sera ce que tu lui passe dans le setLabel donc 'email'. Vu que les noms de tes colonnes dans ta table MySQL sont en minuscule, ce serait plutôt l'inverse qu'il faudrait mettre.

    Concernant ma modif, en fait quand on écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $formCom->populate($this->_request->getParams());
    Cela met les valeurs contenus dans l'array passé en paramètre comme valeur par défaut aux éléments du formulaire.
    Par exemple dans ton cas si je fais passer en paramètre ce tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    array(
    'id' => 1,
    'nom' => 'nom du commentaire',
    'email' => 'monmail@gmail.com'
    );
    Cela mettrais au formulaire la valeur 'nom du commentaire' pour l'élément du formulaire portant l'identifiant 'nom', la valeur 'monmail@gmail.com' pour l'élement portant l'identifiant 'email' et la valeur 1 pour l'élément ayant l'identifiant 'id'.

    Ici la méthode $this->_request->getParams() renvoie un tableau du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    array(
    'action' => 'addcom',
    'controller' => 'nomducontroller',
    'id' => 1 //Paramètre id qu'il y a dans ton URL
    );
    Donc en gros avec le populate que j'ai fait, il mettrait juste la valeur 1 au Hidden. Dans le cas où il y a des valeurs en Post (les valeurs que tu aurais posté dans ton formulaire) ces valeurs sont aussi dans le getParams et cela les mettrais donc aussi dans ton Form.

    Donc voilà ce que j'ai fait. Ensuite ce qui ne va pas concerne les noms des champs.
    Dans ta table ta colonne s'appelle 'idArticle' alors que dans le formulaire le champ s'appelle 'id' ce qui ne va pas puisqu'ils doivent porter le même nom pour que cela fonctionne dans ton createRow.

    Bon, je pense que je peux pas être plus clair, pour que cela fonctionne tu dois renommer ton champ hidden :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $id = new Zend_Form_Element_Hidden('idArticle');
    Et aussi ton paramètre d'URL, cela doit devenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://localhost/tutoriel-zf/public/index/voirarticle/idArticle/1
    Pour que lorsque l'on fait le populate cela mette bien le bon champ à jour.

    Après cela, ça devrait marcher, j'espère que tu as bien tout compris.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 12/08/2010, 15h03
  2. [SQL] Du code dans une variable chaine pour insertion en base
    Par tl_marly dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/03/2008, 14h38
  3. Réponses: 1
    Dernier message: 09/10/2007, 21h53
  4. Réponses: 3
    Dernier message: 07/03/2007, 14h46
  5. [JpGraph] Passage d'un tableau en paramètre dans une URL pour JPgraph
    Par crazydiver_e2 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 16/01/2006, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo