Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-05-2013 14:45:17

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

[résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

Bonjour bonjour,

alors voila depuis quelques temps je cherche une méthode pour utiliser mes propres messages d'erreurs de formulaires. J'en ai vu plusieurs mais je n'arrive pas bien à les appliquer ou alors ne marche plus sur zf2.

je créé mon formulaire de type :

Code:

    public function __construct()
    {
        parent::__construct('contact');
        $this->setAttribute('method', 'post');
       
        $this->add(array(
            'name' => 'nom',
            'attributes' => array(
                'type'  => 'text',
                'id' => 'nom',
            ),
            'options' => array(
                'label' => 'Nom : '
            ),
        ));

    ...

je l'affiche de la manière suivante :

Code:

         $contactform = $this->contactform;
         $contactform->setAttribute('action', $this->url('contact'));
         $contactform->prepare();

        $this->formLabel($contactform->get('nom'));
        $this->formInput($contactform->get('nom'));

         ...

Mais le message d'erreur est en anglais, voir même un peu trop générique. Alors me demandais si vous sauriez m'indiquer comment remplacer ces messages par des textes que je lui donnerai.

Dernière modification par flobrflo (22-05-2013 10:14:08)

Hors ligne

 

#2 21-05-2013 15:28:23

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

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

Salut, en fait le message ne se trouve pas dans l'objet formulaire en lui même mais dans le validateur que tu vas lui affecter.

Donc en gros tu as deux choses à lui passer :
- le template du message
- les variables du template

Je vais prendre l'exemple du validateur StringLength :

Code:

[lang=php]
/**
     * @var array
     */
    protected $messageTemplates = array(
        self::INVALID   => "Invalid type given. String expected",
        self::TOO_SHORT => "The input is less than %min% characters long",
        self::TOO_LONG  => "The input is more than %max% characters long",
    );

    /**
     * @var array
     */
    protected $messageVariables = array(
        'min' => array('options' => 'min'),
        'max' => array('options' => 'max'),
    );

Celui-ci dispose donc de template déjà prédéfini avec comme variable min et max. Ces variables sont liées aux paramètres que tu vas passer au validateur lorsque tu vas le configurer afin de rendre le message cohérent.
A partir de là tu as deux choix, soit tu traduit le message pour qu'il soit dans la langue que tu souhaites soit tu veux écrire tes propres messages. On est dans le deuxième cas pour toi.

Pour se faire il te suffit lors de la création dans le tableau sous la clé options rajouter l'une des clés suivante :

Code:

[lang=php]protected $abstractOptions = array(
        'messages'             => array(), // Array of validation failure messages
        'messageTemplates'     => array(), // Array of validation failure message templates
        'messageVariables'     => array(), // Array of additional variables available for validation failure messages
        'translator'           => null,    // Translation object to used -> Zend\I18n\Translator\Translator
        'translatorTextDomain' => null,    // Translation text domain
        'translatorEnabled'    => true,    // Is translation enabled?
        'valueObscured'        => false,   // Flag indicating whether or not value should be obfuscated
                                           // in error messages
    );

Sachant que pour toi c'est messageTemplates et messageVariables qui t'intéressent. Je dirais que messages correspond à l'ensemble des messages d'erreur retournés par le validateur. Par exemple tu as demandé à l'utilisateur de saisir un champ d'au minimum 5 caractères et d'au maximum 3 (dans les faits ça sera jamais validé et je sais pas si le validateur accepte un max inférieur au min mais pas bien grave pour l'exemple) dans ce cas le validateur te renverra deux messages : un pour le champ trop court et l'autre pour le champ trop long. Donc ces deux clés là attendent un array et si tu souhaites remplacer le message too_short tu dois donc écrire le template sous la clé stringLengthTooShort qui est la valeur de la constante TOO_SHOORT de la classe StringLength

Hors ligne

 

#3 21-05-2013 15:51:19

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

Ok donc j'ai a peu prés compris l'idée ^^

Si je met mon messageTemplate comme ceci:

Code:

         $this->add(array(
            'name' => 'nom',
            'attributes' => array(
                'type'  => 'text',
                'id' => 'nom',
            ),
            'options' => array(
                'label' => 'Nom : '
            ),
            'messageTemplates' => array(
                self::INVALID   => "Le nom est invalide",
                self::TOO_SHORT => "Le nom est trop court",
                self::TOO_LONG  => "Le nom est trop long",
            ),
        ));

Il m'indique l'erreur : Undefined class constant 'INVALID'
Mais je me doute qu'il manque l petit quelque chose permettant de déclarer le template..

et ensuite me viens une question: est ce qu'une chaine trop courte n'est pas considérée comme TOO_SHORT mais aussi INVALID? (ce qui je trouve serait logique..)
Mais si c'est le cas, il faut faire carrément attention lorsque l'on écrit ses messages d'erreurs pour ne pas trop alourdir le formulaire.

EDIT : pour l'exemple j'ai mis les 3 variables self: mais je suppose que seule la INVALID est nécessaire dans ce cas particulier

Dernière modification par flobrflo (21-05-2013 15:52:28)

Hors ligne

 

#4 21-05-2013 16:08:38

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

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

Eu là le problème c'est que tu demandes des constantes que tu n'as pas déclarées donc forcément il ne les trouve pas. L'idée c'est d'appeler la classe StringLength comme static et de faire StringLength::INVALID, StringLength::TOO_SHORT etc ... En faisant les bons imports de classe wink.

Hors ligne

 

#5 21-05-2013 16:26:54

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

Bon en fait je suis entrain de voir que je te dis un peu n'importe quoi..

J'ai oublié une info sympa: j'utilise les inputFilters tels que:

Code:

           $inputFilter->add($factory->createInput(array(
                'name'     => 'nom',
                'required' => true,
                'filters'  => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name'    => 'StringLength',
                        'options' => array(
                            'encoding' => 'UTF-8',
                            'min'      => 1,
                            'max'      => 15,
                        ),
                    ),
                ),
            )));

du coup je me suis dit que les messages d'erreurs se traduirait certainement ici, du genre:

Code:

use Zend\Validator\StringLength;

...

$inputFilter->add($factory->createInput(array(
                'name'     => 'nom',
                'required' => true,
                'filters'  => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name'    => 'StringLength',
                        'options' => array(
                            'encoding' => 'UTF-8',
                            'min'      => 1,
                            'max'      => 15,
                        ),
                        'messageTemplates' => array(
                                StringLength::INVALID   => "Le nom est invalide",
                                StringLength::TOO_SHORT => "Le nom est trop court",
                                StringLength::TOO_LONG  => "Le nom est trop long",
                        ),
                    ),
                ),
            )));

bon j'ai pas d'erreur, mais le message se traduit pas vraiment.. ^^' hors tout le problème et la.
(dsl j'ai revu après quelques manip' que j'avais le inputFilter qui trainait comme ça...)

Hors ligne

 

#6 21-05-2013 16:44:28

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

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

Je pense que messageTemplates doit être dans le tableau options.

Hors ligne

 

#7 21-05-2013 16:48:39

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

je l'ai essayé un peu partout ^^'
pas de réel changement à l'affichage.

Je l'ai essayé dans le tableau d'option, dessous, et encore dessous (mais la j'ai eu une erreur ^^)

Hors ligne

 

#8 21-05-2013 16:57:38

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

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

Hmm bizarre ou alors c'est moi qui comprend mal mais voici le code du ZF qui fait ça :

Code:

[lang=php]
public function __construct($options = null)
    {
        // The abstract constructor allows no scalar values
        if ($options instanceof Traversable) {
            $options = ArrayUtils::iteratorToArray($options);
        }

        if (isset($this->messageTemplates)) {
            $this->abstractOptions['messageTemplates'] = $this->messageTemplates;
        }

        if (isset($this->messageVariables)) {
            $this->abstractOptions['messageVariables'] = $this->messageVariables;
        }

        if (is_array($options)) {
            $this->setOptions($options);
        }
    }

/**
     * Sets one or multiple options
     *
     * @param  array|Traversable $options Options to set
     * @throws Exception\InvalidArgumentException If $options is not an array or Traversable
     * @return AbstractValidator Provides fluid interface
     */
    public function setOptions($options = array())
    {
        if (!is_array($options) && !$options instanceof Traversable) {
            throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable');
        }

        foreach ($options as $name => $option) {
            $fname = 'set' . ucfirst($name);
            $fname2 = 'is' . ucfirst($name);
            if (($name != 'setOptions') && method_exists($this, $name)) {
                $this->{$name}($option);
            } elseif (($fname != 'setOptions') && method_exists($this, $fname)) {
                $this->{$fname}($option);
            } elseif (method_exists($this, $fname2)) {
                $this->{$fname2}($option);
            } elseif (isset($this->options)) {
                $this->options[$name] = $option;
            } else {
                $this->abstractOptions[$name] = $options;
            }
        }

        return $this;
    }

Hors ligne

 

#9 21-05-2013 17:04:47

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

Mmmhh... Cela va me demander un peu de réflexion ^^

Je vais voir un peu ça et je te tiens au courant ^^
Merci pour le temps passé smile

Hors ligne

 

#10 22-05-2013 10:13:28

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

Bon alors au final je suis passé par messages.

Code:

$inputFilter->add($factory->createInput(array(
                'name'     => 'nom',
                'required' => true,
                'filters'  => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name'    => 'StringLength',
                        'options' => array(
                            'messages' => array(
                                'stringLengthTooShort' => 'le nom est trop court', 
                                'stringLengthTooLong' => 'le nom est trop long' 
                            ),
                            'encoding' => 'UTF-8',
                            'min'      => 1,
                            'max'      => 20,
                        ),
                    ),
                    array(
            'name' => 'NotEmpty',
                        'options' => array(
                            'messages' => array(
                                'isEmpty' => 'Veuillez remplir le nom' 
                            ),
                        ),
                    ),
                ),
            )));

J'ai rajouté le cas ou le champ serait vide avec isEmpty, mais il se trouve que finalement quand le champ est vide, les deux exceptions sont récupérés: isEmpty et stringLengthTooShort. Du coup personnellement je vais enlever NotEmpty et faire un message général sur le TOO_SHORT.

voilou voilou merci pour l'aide smile

EDIT: Alors attention, il ne faut surtout pas enlever le tableau 'NotEmpty' pour que ce bout code fonctionne, afin de gérer le message lorsque le champ est vide, mais plutot mettre :

Code:

'isEmpty' => ''

Dernière modification par flobrflo (22-05-2013 10:20:28)

Hors ligne

 

#11 22-05-2013 10:23:54

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

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

Salut, là c'est normal que tu ais les deux messages puisque tu as un validateur qui fait la même chose que l'autre. Le validateur StringLength va "forcément" jouer de le rôle de NotEmpty si tu as le champ en obligatoire donc c'est effectivement inutile d'avoir les 2. Tu peux éventuellement ajouter un attribut required sur ton élément html pour limiter la validation côté client en cas de champ requis non rempli (bien que seul ça ne suffise pas pour contrôler les données).

Tu n'es pas obligé d'utiliser une factory comme tu le fais normalement en lui passant l'array il fait lui même l'appel wink.

Par contre c'est étonnant de devoir écrire directement sous messages, il doit y avoir un truc qu'on a zappé parce que du coup tu perds la notion de message dynamique qu'il y a via le template.

Hors ligne

 

#12 22-05-2013 10:43:31

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

Curieusement sans la vérification NotEmpty, le TOO_SHORT minimum à 1 ne s'active pas.
Un input vide n'est pas censé renvoyer un string donc dans la logique ça me conviens.
Mais je ne comprend pas pourquoi 'isEmpty' n'a pas la priorité par rapport à un comparatif de chaine vide qui au final n'est plus utile lorsque le champ est vide.

Pour les traductions, j'imagine qu'il est possible d'utiliser un Zend_Translate par dessus.
On se retrouverai sans doute avec quelque chose comme:

Code:

            'messages' => array(
                    'stringLengthTooShort' => $translate->_("le nom est trop court"), 
                    'stringLengthTooLong'  => $translate->_("le nom est trop long") 
            ),

Hors ligne

 

#13 22-05-2013 11:26:28

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

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

C'est vraiment bizarre parce que je n'utilise pas NotEmpty lorsque j'utilise StringLength et si je ne saisi rien ça me dit bien que la chaine est pas saisie "Value is required and can't be empty" parce que justement le faire de mettre required à true oblige la valeur à être saisie. Et je n'ai pas les deux messages.

Lorsque je saisi un seul caractère j'ai bien ce message : "The input is less than 3 characters long".

Donc tu as pas un comportement normal. Refais les tests sans mettre tes messages personnalisés pour voir. Parce que en fait lorsque required est à true ça met automatiquement le validateur NotEmpty.

Hors ligne

 

#14 22-05-2013 11:48:46

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

En enlevant la traduction du Empty cela fonctionne comme tu l'a dit.
Mais j'ai aussi besoin de traduire cette erreur...
C'est pourquoi je rajoute la validator 'NotEmpty'. Il y a peut être une autre solution pour le traduire? ^^

Hors ligne

 

#15 22-05-2013 11:56:20

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

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

Hmm là j'avoue qu'à par le translator je vois pas trop. Tu peux éventuellement essayer d'étendre la classe pour y ajouter ta traduction et remplacer l'entrée dans le service manager.

Bakura saurait plus te répondre sur ce sujet je pense smile.

Hors ligne

 

#16 22-05-2013 12:00:59

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

ok ^^

Bah en l'attendant je vais garder ce que j'ai actuellement, ça me permet d'avoir mes erreurs, ça m'ira ^^

Hors ligne

 

#17 22-05-2013 15:22:20

DontShootMe
Nouveau membre
Date d'inscription: 17-12-2010
Messages: 6

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

As tu essayer de déclarer NotEmpty avant StringLength ?

Hors ligne

 

#18 22-05-2013 15:28:56

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

Oui, malheureusement le résultat est le même.

Hors ligne

 

#19 23-05-2013 09:49:57

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

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

L'ordre de déclaration des validateurs n'a pas d'importance smile.

Hors ligne

 

#20 23-05-2013 10:07:15

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [résolu][zf2.1.5] Traduction des messages d'erreurs de formulaires

J'aurais trouvé ça étrange si ça avait une incidence sur le comportement des erreurs.. ^^

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