So, I got the ZF2 application, got the form and input filter in InputFilter, I have:
$this->add( array( 'name' => 'email', 'required' => true, 'validators' => array( array( 'name' => 'EmailAddress' ), array( 'name' => 'DoctrineModule\Validator\NoObjectExists', 'options' => array( 'object_repository' => $sm->get('doctrine.entitymanager.orm_default')->getRepository('YrmUser\Entity\User'), 'fields' => 'email' ), ), ), ) );
works fine, however, when I edit an existing object and save it, the NoObjectExists validator says that the corresponding object is found, so it does not check. Is there a solution to this problem? Or should I just remove the validator on the edit form and catch the exception when inserting a duplicate?
UPDATE: How to use DoctrineModule \ Validator \ NoObjectExists in edit forms - Zend Framework 2 and Doctrine 2
- the same problem, but the answer is simply to remove the validator when editing, this non-course is not a solution. Since you still have to catch the exception thrown when inserting the duplicate. I could do it without problems, but what I ask is a solution to make it work WITH NoObjectExists (otherwise use this validator if I have to catch an exception for duplicates anyway)
UPDATE, other appropriate code has been added (my form and entity have more fields than this, but I deleted them so that they are readable here)
FORM:
namespace YrmUser\Form; use Zend\Form\Form; use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; use DoctrineORMModule\Stdlib\Hydrator\DoctrineEntity; use YrmUser\Entity\User; class UserForm extends Form { protected $objectManager; public function __construct($name = null) { parent::__construct('new-user'); } public function init() { $this->setHydrator( new DoctrineHydrator($this->objectManager, 'YrmUser\Entity\User') )->setObject(new User()); $this->setAttribute('method', 'post'); $this->add( array( 'name' => 'email', 'attributes' => array( 'type' => 'email', 'placeholder' =>'Email', ), 'options' => array( 'label' => 'Email', ), ) ); } }
FILTER:
class UserFilter extends InputFilter { public function __construct($sm) { $this->add( array( 'name' => 'email', 'required' => true, 'validators' => array( array( 'name' => 'EmailAddress' ), array( 'name' => 'DoctrineModule\Validator\NoObjectExists', 'options' => array( 'object_repository' => $sm->get('doctrine.entitymanager.orm_default')->getRepository('YrmUser\Entity\User'), 'fields' => 'email' ), ), ), ) ); } }
CONTROLLER ACTION:
public function editAction() { $id = (int) $this->params('id', null); if (null === $id) { return $this->redirect()->toRoute('manage-users'); } $em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); $formManager = $this->getServiceLocator()->get('FormElementManager'); $form = $formManager->get('UserForm'); $user = $em->find('YrmUser\Entity\User', $id); $form->setInputFilter(new UserFilter($this->getServiceLocator())); $form->bind($user); $request = $this->getRequest(); if ($request->isPost()) { $form->setData($request->getPost()); if ($form->isValid()) { $em->persist($user); $em->flush(); return $this->redirect()->toRoute('manage-users'); } } return array( 'form' => $form, 'id' => $id ); }
FACE:
class User { protected $id; protected $email; public function getId() { return $this->id; } public function setId($id) { $this->id = (int) $id; } public function getEmail() { return $this->email; } public function setEmail($email) { $this->email = $email; } }
thanks in advance,
Yrm