2009-08-24 4 views
2

J'utilise Zend Framework 1.62 (car nous déployons le produit fini dans une instance de Red Hat, qui n'a pas assez de hgih pour supporter la version de PHP> ZF1.62).Accès aux messages d'erreur personnalisés pour le validateur InArray lors de l'utilisation de Zend_Form_Element_Select

Lors de la création d'un formulaire à l'aide du formulaire Zend, j'ajoute un élément de sélection, j'ajoute quelques options multiples. J'utilise le formulaire Zend comme couche de validation dans l'objet, en lui passant des valeurs d'objets et en utilisant la méthode isValid pour déterminer si toutes les valeurs tombent dans les paramètres normaux.

Zend_Form_Element_Select fonctionne exactement comme prévu, ne pouvant pas être validé si une autre valeur est entrée autre que l'une des options de sélection multiple que j'ai ajoutées.

Le problème vient lorsque je veux afficher le formulaire à un moment donné, je ne peux pas éditer le message d'erreur créé par le validateur pré-enregistré 'InArray' ajouté automatiquement par ZF. Je sais que je peux désactiver ce comportement, mais il fonctionne très bien en dehors des messages d'erreur. J'ai tryed les éléments suivants:

$this->getElement('country')->getValidator('InArray')->setMessage('The country is not in the approved lists of countries'); 

// Doesn't work at all. 

$this->getElement('country')->setErrorMessage('The country is not in the approved lists of countries'); 

// provoque un conflit elswhere dans l'application et doesnt permettent un contrôle granulaire des messages d'erreur.

Vous avez des idées?

Ben

Répondre

1

Je mets habituellement validateurs selon mon exemple ci-dessous:

$this->addElement('text', 'employee_email', array(
      'filters' => array('StringTrim'), 
      'validators' => array(    
       array('Db_NoRecordExists', false, array(
        'employees', 
        'employee_email', 
        'messages' => array(Zend_Validate_Db_Abstract::ERROR_RECORD_FOUND => 'A user with email address %value% already exists') 
       )) 
      ), 
      'label'  => 'Email address', 
      'required' => true, 
      )); 

Le tableau validateurs dans les options de l'élément peut prendre un nom de validateur (chaîne) ou un tableau.

Lorsqu'un tableau est passé, la première valeur est le nom et la troisième est un tableau d'options pour le validateur. Vous pouvez spécifier un message clé avec des messages personnalisés pour votre élément dans ce tableau d'options.

+0

Oui en effet .... Cependant, dans ce cas, le validateur est configuré en arrière-plan. À partir du manuel: Par défaut, cet élément enregistre un validateur InArray qui valide par rapport aux clés de tableau des options enregistrées. Vous pouvez désactiver ce comportement en appelant setRegisterInArrayValidator (false) ou en transmettant une valeur false à la clé de configuration registerInArrayValidator. Ma question concerne l'accès à ce message d'erreur particulier des validateurs. Merci pour votre réponse, un autre aperçu? Ben –

0
$el = $this->addElement($name, $label, $require, 'select'); 

$validator = new Zend_Validate_InArray(array_keys(AZend_Geo::getStatesList())); 
$validator->setMessage('Invalid US State.'); 

$el 
->setMultiOptions(AZend_Geo::getStatesList()) 
->setRegisterInArrayValidator(false) 

->addValidator($validator) 

->addFilter(new Zend_Filter_StringToUpper()) 
->addFilter(new T3LeadBody_Filter_SetNull()) 

->setDescription('US State. 2 char.'); 
1

Si votre utilisation de Zend_Form_Element_Select (ou l'une des sous-classes multiples), sur la validation du validateur InArray ne sera ajouté automatiquement s'il n'y a pas un présent.

Vous pouvez définir un validateur comme si:

$options = array(...); 
$this->addElement('select', 'agree', array(
    'validators' => array(
     array('InArray', true, array(
      'messages' => array(
       Zend_Validate_InArray::NOT_IN_ARRAY => 'Custom message here', 
      ), 
      'haystack' => array_keys($options), 
     )), 
    'multiOptions' => $options, 
)); 

et votre validateur sera utilisé à la place du joint automatiquement un.

+0

Le validateur InArray connecté automatiquement si nécessaire est défini sur true. Donc, cet exemple fonctionne car il n'y a pas de validateur InArray attaché automatiquement. – bsrykt