Mettre en évidence les champs de formulaire obligatoires

24 Sep 2013 ,

En général, la façon la plus classique de mettre en évidence des champs de formulaires obligatoires est d'ajouter une étoile à la fin des labels. Zend framework ne propose pas cette possibilité par défaut. Pour réaliser cette tâche, plusieurs possibilités s'offent à nous. Contrairement à ZF1, les éléments ne possèdent pas directement de propriété required, il va donc falloir récupérer les input filter associés.

Via le template

<?php
/** @var \Application\Form\MyForm $form */
$form = $this->form;
$form->prepare();

/** @var $input \Zend\InputFilter\Input */
foreach ($form->getInputFilter()->getInputs() as $input) {
    if ($input->isRequired()) {
        $el = $form->get($input->getName());
        $el->setLabel($el->getLabel() . ' *');
    }
}

echo $this->form($form);

on peut aussi définir une classe pour le label:

<?php
/** @var \Application\Form\MyForm $form */
$form = $this->form;
$form->prepare();

/** @var $input \Zend\InputFilter\Input */
foreach ($form->getInputFilter()->getInputs() as $input) {
    if ($input->isRequired()) {
        $el = $form->get($input->getName());

        $labelAttributes = $el->getLabelAttributes();
        $class = ((isset($labelAttributes['class'])) ? $labelAttributes['class'] . ' ' : '') . 'required';
        $el->setLabelAttributes(array('class' => $class));
    }
}

echo $this->form($form);

Ensuite le css, notez le ">" qui est très important pour ne pas ajouter d'étoiles sur les multioptions radio par exemple.

form > label.required:after {
    color: @red;
    content: ' *';
}

Via l'objet de formulaire

Nous allons étendre Zend\Form\Form avec notre custom Form. Ensuite il suffit d'étendre notre custom form par nos formulaires pour qu'il aient tous la modification.

<?php
namespace Application\Form;

use Zend\Form\Form as ZendForm;

class Form extends ZendForm
{
    public function prepare()
    {
        parent::prepare();

        /** @var $input \Zend\InputFilter\Input */
        foreach ($this->getInputFilter()->getInputs() as $input) {
            if ($input->isRequired()) {
                $el = $this->get($input->getName());

                $labelAttributes = $el->getLabelAttributes();
                $class = ((empty($labelAttributes['class'])) ? '' : $labelAttributes['class'] . ' ') . 'required';
                $el->setLabelAttributes(array('class' => $class));
            }
        }
    }
}
comments powered by Disqus