Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 22-11-2013 11:34:34

Lolipop
Nouveau membre
Date d'inscription: 22-11-2013
Messages: 3

Validation d'un seul champ dans un formulaire

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:

Code:

$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

 

#2 22-11-2013 12:05:17

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: Validation d'un seul champ dans un formulaire

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

 

#3 22-11-2013 14:27:43

Lolipop
Nouveau membre
Date d'inscription: 22-11-2013
Messages: 3

Re: Validation d'un seul champ dans un formulaire

Bonjour Shishi,

Merci beaucoup pour cette suggestion,

Code:

$form->setValidationGroup('pseudo');

semble fonctionner mais il ne prend pas mon filter en compte:

EditProfilForm.php

Code:

 [lang=php]        
        // Pseudo Field
        $this->add(array(
            'name' => 'pseudo',
            'attributes' => array(
                'type'  => 'text',
                'required' => 'required',
            ),
            'options' => array(
                'label' => 'Pseudo',
            ),
        ));

EditProfilFilter.php

Code:

  [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

 

#4 22-11-2013 14:44:11

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: Validation d'un seul champ dans un formulaire

Utilise tu un fieldset pour créer ton formulaire?
Si oui je pense qu'il faudrait que tu utilise la fonction comme ceci :

Code:

[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

 

#5 22-11-2013 15:12:51

Lolipop
Nouveau membre
Date d'inscription: 22-11-2013
Messages: 3

Re: Validation d'un seul champ dans un formulaire

Merci Shishi,

Voici la solution pour ceux qui se retrouvent dans la même problématique:

Code:

 [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

 

#6 25-11-2013 12:26:45

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Validation d'un seul champ dans un formulaire

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 wink) :

Le fieldset

Code:

[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 :

Code:

[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

Code:

[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 :

Code:

[lang=php]

    /**
     * @param Photo $photo
     */
    public function update(Photo $photo)
    {
        $photo->setUpdateDate(new DateTime('now');
        $this->getEm()->flush($photo);
    }

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages