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