Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Je me suis fabriqué un exemple simple de mise à jour d'une entité Doctrine avec Zend Form et l'hydrator de DoctrineModule.
Tout fonctionne, mais j'ai une interrogation concernant l'update des données (action edit) : lorsque je récupère les données provenant du POST, je les injectes dans la form.
=> si je fais persist($entity) => erreur
=> si je fais directement un flush => mes données modifiées sont sauvegardées.
Et là, je ne comprends plus... Pourquoi mon entity a tout son contenu NULL au niveau du persist (qui logiquement génère une erreur) et le flush (tout seul) fonctionne ???? Le doctrine module hydrator intervient-il à cette étape ?
Là, je sèche... Merci de me transmettre votre avis.
L'extrait de code de l'action "edit" :
public function editAction() { // create the form and inject the Service Manager $form = new VerysimpleForm($this->getObjectManager()); // Inject a new Doctrine Module Hydrator in form $form->setHydrator(new DoctrineHydrator($this->getObjectManager())); if (!$this->request->isPost()) { // NOT POST // Data aren't post, so seach data, hydrate the object and display form // Get the id $id = (int) $this->params()->fromRoute('id', 0); // TODO vérifier que le "find" trouve un enregistrement // Search the Entity for this id $verysimple = $this->getObjectManager()->find('\Test\Entity\Verysimple', $id); // bind entity to the form $form->bind($verysimple); // on affiche alors la form } else { // POST // Create an empty entity $verysimple = new Verysimple(); // bind entity to the form $form->bind($verysimple); // if the request is POST, Hydrate the Verysimple entity $form->setData($this->request->getPost()); if ($form->isValid()) { //die(var_dump($verysimple)); => $verysimple is empty !!! //$this->getObjectManager()->persist($verysimple); ==> error if I persist the entity !!!! $this->getObjectManager()->flush(); // save the modified data // back to the index action of this controller return $this->redirect()->toRoute('Test/default', array('controller' => 'verysimple', 'action' => 'index')); } } return new ViewModel(array('form' => $form)); }
et code complet du controlleur :
<?php /* * Very simple controller on Verysimple Entity * * Use Zend Form and the DoctrineModule Hydrator for hydrating the entity */ namespace Test\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; use Doctrine\ORM\EntityManager; //use Doctrine\ORM\EntityRepository; // nécessaire pour editAction // DoctrineModule Hydrator use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; // use the Verysimple entity ! use Test\Entity\Verysimple; use Test\Form\VerysimpleForm; class VerysimpleController extends AbstractActionController { protected $_objectManager; protected function getObjectManager() { if (!$this->_objectManager) { $this->_objectManager = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default'); } return $this->_objectManager; } public function indexAction() { // Show list // see the **getObjectManager** function in this controller $verysimple = $this->getObjectManager()->getRepository('\Test\Entity\Verysimple')->findAll(); // die(var_dump($verysimple)); // ATTENTION le "s" en fin de verysimple est passé à la vue !!!(à corriger...) return new ViewModel(array('verysimples' => $verysimple)); } public function addAction() { // create the form and inject the Service Manager $form = new VerysimpleForm($this->getObjectManager()); // Hydrator $form->setHydrator(new DoctrineHydrator($this->getObjectManager())); // create a new, empty entity and bind it to the form $verysimple = new Verysimple(); $form->bind($verysimple); //$request = $this->getRequest(); if ($this->request->isPost()) { //die(var_dump($this->request->getPost())); $form->setData($this->request->getPost()); if ($form->isValid()) { //die(var_dump($verysimple)); $this->getObjectManager()->persist($verysimple); $this->getObjectManager()->flush(); // back to the index action of this controller return $this->redirect()->toRoute('Test/default', array('controller' => 'verysimple', 'action' => 'index')); } } return new ViewModel(array('form' => $form)); } public function editAction() { // create the form and inject the Service Manager $form = new VerysimpleForm($this->getObjectManager()); // Inject a new Doctrine Module Hydrator in form $form->setHydrator(new DoctrineHydrator($this->getObjectManager())); if (!$this->request->isPost()) { // NOT POST // Data aren't post, so seach data, hydrate the object and display form // Get the id $id = (int) $this->params()->fromRoute('id', 0); // TODO vérifier que le "find" trouve un enregistrement // Search the Entity for this id $verysimple = $this->getObjectManager()->find('\Test\Entity\Verysimple', $id); // bind entity to the form $form->bind($verysimple); // on affiche alors la form } else { // POST // Create an empty entity $verysimple = new Verysimple(); // bind entity to the form $form->bind($verysimple); // if the request is POST, Hydrate the Verysimple entity $form->setData($this->request->getPost()); if ($form->isValid()) { //die(var_dump($verysimple)); => $verysimple is empty !!! //$this->getObjectManager()->persist($verysimple); ==> error if I persist the entity !!!! $this->getObjectManager()->flush(); // save the modified data // back to the index action of this controller return $this->redirect()->toRoute('Test/default', array('controller' => 'verysimple', 'action' => 'index')); } } return new ViewModel(array('form' => $form)); } public function deleteAction() { $id = (int) $this->params()->fromRoute('id', 0); $verysimple = $this->getObjectManager()->find('\Test\Entity\Verysimple', $id); if ($this->request->isPost()) { $this->getObjectManager()->remove($verysimple); $this->getObjectManager()->flush(); return $this->redirect()->toRoute('Test/default', array('controller' => 'verysimple', 'action' => 'index')); } return new ViewModel(array('verysimple' => $verysimple)); } public function InitdataAction() { // Insert some data for test : all with Doctrine ! for ($i = 1; $i < 10; $i++) { $firstname = 'Firstname' . $i; $lastname = 'Lastname' . $i; $verysimple1 = new \Test\Entity\verysimple(); $verysimple1->setFirstname($firstname); $verysimple1->setLastname($lastname); $objectManager = $this->getObjectManager()->persist($verysimple1); $objectManager = $this->getObjectManager()->flush(); } // go to the index action return $this->redirect()->toRoute('Test/default', array('controller' => 'verysimple', 'action' => 'index')); } }
Merci de votre retour.
Jean
Dernière modification par jean (11-07-2014 13:31:51)
Hors ligne
Pages: 1