Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'ai un formulaire avec plusieurs champ pour compléter son profil et je voudrais que l'utilisateur puisse, par exemple, juste modifier son pseudo et enregistrer uniquement cette modification.
Pour résumé je voudrais savoir s'il est possible de ne valider qu'un seul champ du form et de le mettre à jour dans la base.
ex:
$form = new EditProfilForm(); $form->setHydrator(new DoctrineHydrator($entityManager,'User\Entity\User')); $form->bind($user); $request = $this->getRequest(); if ($request->isPost()) { $form->setData($request->getPost()); $input_filter = $form->getInputFilter(); $input = $input_filter->get('pseudo'); $input->setValue($request->getPost('pseudo')); if ($input->isValid()) { $user->setPseudo($this->getRequest()->getPost('pseudo')); $entityManager->persist($user); $entityManager->flush(); } }
Malheureusement dans ce cas la fonction isValid retourne constamment "true" et ne prend pas mon filter en compte...
(Mon form EditProfilForm contient plusieurs fields)
Quelqu'un à la solution à ce problème ?
Hors ligne
Bonjour Lolipop,
As tu essayé de regardé du coté de la méthode setValidationGroup (vers le bas de la page)
Dernière modification par shishi (22-11-2013 12:05:54)
Hors ligne
Bonjour Shishi,
Merci beaucoup pour cette suggestion,
$form->setValidationGroup('pseudo');
semble fonctionner mais il ne prend pas mon filter en compte:
EditProfilForm.php
[lang=php] // Pseudo Field $this->add(array( 'name' => 'pseudo', 'attributes' => array( 'type' => 'text', 'required' => 'required', ), 'options' => array( 'label' => 'Pseudo', ), ));
EditProfilFilter.php
[lang=php] // Pseudo Filter $this->add(array( 'name' => 'pseudo', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 3, 'max' => 100, ), ), array( 'name' => 'DoctrineModule\Validator\NoObjectExists', 'options' => array( 'object_repository' => $sm->get('doctrine.entitymanager.orm_default')->getRepository('User\Entity\User'), 'fields' => 'pseudo' ), ), ), ));
Mon champ est bien require mais je peux toujours entrer un nombre de caractères inférieur à 3 et valider mon formulaire.
Dernière modification par Lolipop (22-11-2013 15:02:33)
Hors ligne
Utilise tu un fieldset pour créer ton formulaire?
Si oui je pense qu'il faudrait que tu utilise la fonction comme ceci :
[lang=php] $form->setValidationGroup(array('nomdufieldset' => array( 'pseudo' )));
Edit : j'avais oublié le "array(" devant le nom du fieldset
Dernière modification par shishi (22-11-2013 14:50:20)
Hors ligne
Merci Shishi,
Voici la solution pour ceux qui se retrouvent dans la même problématique:
[lang=php] // Use a form class $form = new EditProfilForm(); $form->setHydrator(new DoctrineHydrator($entityManager,'User\Entity\User')); $form->bind($user); $request = $this->getRequest(); // Save user datas if ($request->isPost()) { $form->setInputFilter(new EditProfilFilter($this->getServiceLocator())); $form->setData($request->getPost()); $form->setValidationGroup('pseudo'); if ($form->isValid()) { $user->setPseudo($this->getRequest()->getPost('pseudo')); $entityManager->persist($user); $entityManager->flush(); } }
Hors ligne
Salut Lolipop, c'es teffectivement setValidationGroup pour faire ce que tu souhaites. Merci de ton retour ! Par contre ton code est vraiment pas propre !
Je m'explique :
- Tu peux utiliser une fabrique pour créer ton formulaire, ça t'évites d'avoir à écrire toutes ces lignes de code pour valider ton formulaire puisque là tu le créé, tu lui ajoutes l'inputfilter et tu fais ton validation group. Alors qu'en utilisant un fieldset et en créant un formulaire qui inclut ton fieldset ça serait bien plus propre.
- Tu fais l'accès à l'entitymanager depuis ton contrôleur alors qu'il faudrait mieux utiliser une couche service pour le faire (encore une fois c'est plus propre).
Voici ce que ça donnerait avec un exemple plus structuré (ça peut surement être amélioré hein ) :
Le fieldset
[lang=php] <?php namespace Application\Form\Fieldset; use DoctrineModule\Persistence\ProvidesObjectManager; use Application\Entity\Photo; use Zend\InputFilter\InputFilterProviderInterface; use DoctrineModule\Persistence\ObjectManagerAwareInterface; use Zend\Form\Fieldset; use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; class PhotoFieldset extends Fieldset implements ObjectManagerAwareInterface, InputFilterProviderInterface { use ProvidesObjectManager; public function init() { $this->setHydrator(new DoctrineHydrator($this->getObjectManager(), 'Application\Entity\Photo')) ->setObject(new Photo()); // Title $this->add( array( 'name' => 'title', 'type' => 'Zend\Form\Element\Text', 'options' => array( 'label' => 'Titre', ), 'attributes' => array( 'class' => 'form-control', 'required' => 'required', 'id' => 'title', ) ) ); // animalName $this->add( array( 'name' => 'animalName', 'type' => 'Zend\Form\Element\Text', 'options' => array( 'label' => 'Nom français' ), 'attributes' => array( 'required' => 'required', 'class' => 'form-control', 'id' => 'animalName' ) ) ); // Category $this->add( array( 'name' => 'category', 'type' => 'DoctrineModule\Form\Element\ObjectSelect', 'options' => array( 'object_manager' => $this->getObjectManager(), 'target_class' => 'Application\Entity\Category', 'label' => 'Catégorie', 'property' => 'name', 'empty_option' => '', 'find_method' => array( 'name' => 'findBy', 'params' => array( 'criteria' => array(), 'orderBy' => array('name' => 'ASC'), ), ), ), 'attributes' => array( 'required' => 'required', 'class' => 'form-control', 'id' => 'category', ), ) ); // Description $this->add( array( 'name' => 'description', 'type' => 'Zend\Form\Element\Textarea', 'options' => array( 'label' => 'Description de la photo', ), 'attributes' => array( 'class' => 'form-control', 'rows' => '3', 'id' => 'description', ), ) ); // Valid $this->add( array( 'name' => 'valid', 'type' => 'Zend\Form\Element\Checkbox', 'options' => array( 'label' => 'Valider la photo', ), 'attributes' => array( 'id' => 'valider', ), ) ); } /** * * @return array */ public function getInputFilterSpecification() { return array( 'title' => array( 'required' => true, 'filters' => array( array( 'name' => 'StringTrim' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'min' => 2, 'max' => 100, ), ), ), ), 'animalName' => array( 'required' => true, 'filters' => array( array( 'name' => 'StringTrim' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'min' => 2, 'max' => 100, ), ), ), ), 'category' => array( 'required' => true, ), 'description' => array( 'required' => false, ), 'valider' => array( 'required' => false, ), ); } }
Le formulaire :
[lang=php] <?php namespace Application\Form; use Zend\Form\Form; use Zend\Form\Element; use Zend\EventManager\ProvidesEvents; use Zend\InputFilter\InputFilterProviderInterface; /** * Class UpdatePhoto * @package Application\Form */ class UpdatePhotoForm extends Form implements InputFilterProviderInterface { public function init() { $this->add( array( 'name' => 'photo', 'type' => 'Application\Form\Fieldset\PhotoFieldset', 'options' => array( 'use_as_base_fieldset' => true, ), ) ); $this->setValidationGroup( array( 'photo' => array( 'title', 'animalName', 'category', 'description', ), ) ); // csrf element $this->add( array( 'type' => 'Zend\Form\Element\Csrf', 'name' => 'csrf_update_photo', ) ); $this->add( array( 'name' => 'submit', 'attributes' => array( 'type' => 'submit', 'value' => 'Modifier', 'class' => 'btn btn-primary', ), ) ); } /** * Should return an array specification compatible with * {@link Zend\InputFilter\Factory::createInputFilter()}. * * @return array */ public function getInputFilterSpecification() { return array( ); } }
La validation dans le contrôleur
[lang=php] /* @var Request $request */ $request = $this->getRequest(); $updateForm = $this->getUpdatePhotoForm(); $updateForm->bind($photo); if ($request->isPost()) { $updateForm->setData($request->getPost()); if ($updateForm->isValid()) { /** @var Photo $photo */ $photo = $updateForm->getData(); $this->getPhotoService()->update($photo); } }
Le service :
[lang=php] /** * @param Photo $photo */ public function update(Photo $photo) { $photo->setUpdateDate(new DateTime('now'); $this->getEm()->flush($photo); }
Hors ligne