Ajouter une étoile aux champs obligatoires de manière automatique

Plutôt que d’intégrer l’étoile d’un champ obligatoire dans son label, ça peut être sympa de l’ajouter dès que l’option « required » du validateur associé est à « true« .
Symfony vous permet facilement de le faire via les événements !

Dans le fichier frontendConfiguration.class.php, méthode configure, ajoutez les lignes :

$this->dispatcher->connect('form.post_configure', array(
            'BaseForm', 'doEventPostConfigureFrontend'));

Ensuite, dans la classe BaseForm, vous ajouterez la méthode « doEventPostConfigureFrontend » qui sera appelée à chaque fois qu’un formulaire est instancié (à la fin du configure, donc après avoir déjà défini les champs et validateurs) :

const FRONTEND = 1;

    public static function doEventPostConfigureFrontend(sfEvent $event)
    {
        // Gestion des champs obligatoires (ajout d'astérisques)
        $subject = $event->getSubject();

        if ($subject instanceof sfForm)
        {
            $subject->postConfigure(BaseForm::FRONTEND);
        }
    }

    /**
     * Méthode à appeler en bas des méthode configure des formulaires
     */
    public function postConfigure($app)
    {
        if ($app == BaseForm::FRONTEND)
        {
            // Gestion des champs obligatoires (ajout d'astérisques)
            $this->manageRequiredFields();
        }
    }

    /**
     * Modifie les WIDGETS obligatoires afin de les mettre en valeur.
     * => ajoute une astérisque à côté du label.
     * @author Etienne VOILLIOT
     */
    protected function manageRequiredFields()
    {
        // Modifie le widget s'il est obligatoire
        foreach ($this->widgetSchema->getFields() as $name => $widget)
        {
            if ($name != '_csrf_token' && isset($this->validatorSchema[$name]) && $this->validatorSchema[$name]->hasOption('required') && $this->validatorSchema[$name]->getOption('required') != false)
            {
                // Ici on ajoute une astérisque au label
                $label = ($widget->getLabel() != null) ? $widget->getLabel() : $name;
                if (substr($label, - 1) != '*')
                    $widget->setLabel($label . '*');

                // TODO (evo) on pourrait voir comment changer le style du label, mais c'est plus complexe
                //$widget->setAttribute('class', 'required');
            }
        }

        // on prend en charge les champs obligatoires des embedded forms
        foreach ($this->embeddedForms as $embeddedForm)
        {
            $embeddedForm->manageRequiredFields();
        }
    }

Le code ci-dessus est légèrement plus étoffé, puisqu’il laisse ouverte la porte pour ajouter le même genre de fonctionnement en backend, par exemple, il peut être utile d’agrandir tous les champs de type « libellé » car petits par défaut, ou encore d’ajouter un widget de type « jquery datepicker » sur tous les champs de type date aux écrans générés par l’admin generator.