Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 11-07-2013 16:57:53

Vishnu
Nouveau membre
Date d'inscription: 11-07-2013
Messages: 4

[Formulaire] Fieldsets et InputFilters

Bonjour,

Actuellement dans la création et génération de formulaires. J'ai voulu me mettre aux fieldsets pour organiser un peu tous mes éléments et pouvoir réutiliser tout ça dans plusieurs Form.

J'ai suivi la doc zend form collections & fieldsets, je me suis créé plusieurs fieldsets

Code:

[lang=php]

namespace Application\Form;

use Application\Entity\Brand;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
use Zend\Stdlib\Hydrator\ClassMethods as ClassMethodsHydrator;

class BrandFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct()
    {
        parent::__construct('brand');
        $this->setHydrator(new ClassMethodsHydrator(false))
            ->setObject(new Brand());

        $this->add(array(
            'name' => 'name',
            'options' => array(
                'label' => 'Name of the brand'
            ),
            'attributes' => array(
                'required' => 'required'
            )
        ));

        $this->add(array(
            'name' => 'url',
            'type' => 'Zend\Form\Element\Url',
            'options' => array(
                'label' => 'Website of the brand'
            ),
            'attributes' => array(
                'required' => 'required'
            )
        ));
    }

    /**
     * @return array
     \*/
    public function getInputFilterSpecification()
    {
        return array(
            'name' => array(
                'required' => true,
            )
        );
    }
}

J'ai déclaré un getInputFilterSpecification() pour chacun de mes fieldsets avec mes filters et validators.
Le problème qui se pose, c'est que lors de la déclaration de mon formulaire si j'ajoute 2 fieldsets à ce dernier, j'ai une belle erreur :

Fatal error: Cannot redeclare MonModule\Form\MonFieldset::getInputFilterSpecification()

Ajout simple des fieldsets à ma classe Form :

Code:

[lang=php]
$this->add(array(
            'type' => 'MonModule\Form\Fieldset1',
            ));
$this->add(array(
            'type' => 'MonModule\Form\Fieldset2',
            ));

Ne passant aucun paramètre, peut être que mon erreur vient de là... sad

Je pensais que cette méthode ne s'appliquait uniquement qu'au fieldset dans lequel il était déclaré.
J'ai certainement mal compris la doc.

Existe-t-'il une solution pour pouvoir utiliser plusieurs InputFilters de fieldsets dans un formulaire ?

Merci d'avance.

Dernière modification par Vishnu (11-07-2013 17:03:40)

Hors ligne

 

#2 11-07-2013 17:10:51

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

Re: [Formulaire] Fieldsets et InputFilters

Salut, je ne me souviens plus très bien mais j'avais eu ce problème là. J'ai pas la possibilité de regarder exactement comment faire mais voici un bout de code qui fonctionne sur ZF 2.1.4. Je te laisse regarder :

Code:

[lang=php]
class UserFieldset extends Fieldset implements InputFilterProviderInterface, ObjectManagerAwareInterface
{

    private $objectManager;

    public function init()
    {

        $this->setHydrator(new DoctrineHydrator($this->getObjectManager(), 'Application\Entity\Membre'))
            ->setObject(new Membre());

        $this->add(
            array(
                'name' => 'nom',
                'type' => 'Zend\Form\Element\Text',
                'options' => array(
                    'label' => 'Nom :',
                ),
                'attributes' => array(
                    'required' => 'required',
                    'class' => 'input-medium',
                )
            )
        );
        $this->add(
            array(
                'name' => 'prenom',
                'type' => 'Zend\Form\Element\Text',
                'options' => array(
                    'label' => 'Prénom :',
                ),
                'attributes' => array(
                    'required' => 'required',
                    'class' => 'input-medium',
                )
            )
        );
        $this->add(
            array(
                'name' => 'naissance',
                'type' => 'Zend\Form\Element\DateSelect',
                'options' => array(
                    'label' => 'Date de naissance :',
                    'create_empty_option' => true,
                    'min_year' => date('Y') - 70,
                    'max_year' => date('Y') - 13,
                    'day_attributes' => array(
                        'class' => 'input-small',
                        'style' => 'width: 22%',
                    ),
                    'month_attributes' => array(
                        'class' => 'input-medium',
                        'style' => 'width: 35%',
                    ),
                    'year_attributes' => array(
                        'class' => 'input-small',
                        'style' => 'width: 25%',
                    )
                ),
            )
        );
        $this->add(
            array(
                'name' => 'bibliographie',
                'type' => 'Zend\Form\Element\Textarea',
                'options' => array(
                    'label' => 'Message : ',
                ),
                'attributes' => array(
                    'rows' => '4',
                ),
            )
        );
    }

    /**
     * Should return an array specification compatible with
     * {@link Zend\InputFilter\Factory::createInputFilter()}.
     *
     * @return array
     */
    public function getInputFilterSpecification()
    {
        return array(
            'nom' => array(
                'filters' => array(
                    array(
                        'name' => 'StringTrim'
                    )
                ),
                'validators' => array(
                    array(
                        'name' => 'StringLength',
                        'options' => array(
                            'min' => 2,
                            'max' => 20,
                        ),
                    ),
                ),
            ),
            'prenom' => array(
                'filters' => array(
                    array(
                        'name' => 'StringTrim'
                    )
                ),
                'validators' => array(
                    array(
                        'name' => 'StringLength',
                        'options' => array(
                            'min' => 3,
                            'max' => 40,
                        ),
                    ),
                ),
            ),
            'naissance' => array(),
            'bibliographie' => array(
                'filters' => array(array('name' => 'StringTrim')),
                'validators' => array(
                    array(
                        'name' => 'StringLength',
                        'options' => array(
                            'min' => 3,
                        ),
                    ),
                ),
            ),
        );
    }

    /**
     * Set the object manager
     *
     * @param ObjectManager $objectManager
     */
    public function setObjectManager(ObjectManager $objectManager)
    {
        $this->objectManager = $objectManager;
    }

    /**
     * Get the object manager
     *
     * @return ObjectManager
     */
    public function getObjectManager()
    {
        return $this->objectManager;
    }


}

class UserForm extends Form
{

    public function init()
    {

        $this->add(
            array(
                'name' => 'user',
                'type' => 'Application\Form\Fieldset\UserFieldset',
                'options' => array(
                    'use_as_base_fieldset' => true,
                ),
            )
        );

        $this->add(
            array(
                'type' => 'Zend\Form\Element\Csrf',
                'name' => 'csrf_user'
            )
        );

        $this->add(
            array(
                'name' => 'submit',
                'attributes' => array(
                    'type' => 'submit',
                    'value' => 'Valider',
                    'class' => 'btn btn-primary',
                ),
            )
        );
    }

}

Penses aussi à ajouter un attribut name même dans le form wink

Hors ligne

 

#3 11-07-2013 20:55:57

Vishnu
Nouveau membre
Date d'inscription: 11-07-2013
Messages: 4

Re: [Formulaire] Fieldsets et InputFilters

Merci pour ton aide.
Ça m'a permis de recheck mon code et je me suis rendu compte que j'avais noobé.

Sinon pour les names de mes Fieldsets quand je sais que je n'aurai pas réutiliser 2 fois ce fieldset dans un même formulaire, je préfère utiliser :

Code:

[lang=php]

public function __construct()
{
   parent::__construct('le_name_du_fieldset');
}

J'évite comme ça de redéfinir un nom à chaque fois au fieldset.

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