11
votes

Zend_form: l'élément ne doit être requis que si une case à cocher est cochée.

J'ai un formulaire où l'utilisateur peut cocher une case à cocher "Créer une nouvelle adresse" et peut ensuite remplir les champs de cette nouvelle adresse dans le même formulaire.

Maintenant, je veux valider les champs de cette nouvelle adresse uniquement si la case à cocher a été vérifiée. Sinon, ils devraient être ignorés.

Comment puis-je faire cela en utilisant zend_form avec zend_validate?

merci!


0 commentaires

7 Réponses :


1
votes

Je me demandais également comment faire cela dans ZF, bien que jamais dû mettre en œuvre une telle fonctionnalité de formulaire.

Une idée qui vous vient à l'esprit consiste à créer un validateur personnalisé qui accepte le champ Cochez la case comme paramètre et exécutez-le dans une chaîne de validateur, comme documenté . Si la case à cocher est cochée, le validateur pourrait renvoyer une défaillance. Ensuite, vous pouvez vérifier si toutes les validations ont échoué et que ne traitent que le formulaire comme ayant échoué validation.

Ce niveau de personnalisation de la validation des formulaires pourrait être gênant, il serait donc préférable d'utiliser la méthode isvalidpartiale de formulaire.


0 commentaires

2
votes

Je n'ai pas réellement couru cela, mais cela devrait marcher dans la raison. J'ai fait quelque chose de similaire avant cela fonctionne, mais je ne me souviens pas où le code était.

<?php

class My_Form extends Zend_Form
{
  public function init()
  {
    $checkbox = new Zend_Form_Element_Checkbox("checkbox");
    $checkbox->setValue("checked");

    $textField = new Zend_Form_Element_Text("text");

    $this->addElements(array("checkbox", "text"));

    $checkbox = $this->getElement("checkbox");

    if ($checkbox->isChecked() )
    {
       //get textfield
       $textField = $this->getElement("text");

       //make fields required and add validations to it.
       $textField->setRequired(true);
    }

  }

}


0 commentaires

2
votes

Voici ce que je fais si je dois valider plusieurs éléments les uns contre les autres xxx


0 commentaires

7
votes

Je pense que le meilleur moyen et plus correct de le faire est de créer un validateur personnalisé.

Vous pouvez faire ce validateur de deux manières différentes, l'une utilise le deuxième paramètre transmis à la méthode isvalid, $ contextuel, C'est la forme actuelle étant validée ou, injecter l'élément à cocher, qui doit être vérifiée pour que la validation se produise, dans le constructeur. Je préfère le dernier: xxx

usage: xxx

Je n'ai pas testé le code, mais je pense que cela devrait fonctionner .


0 commentaires

0
votes

Merci JCM pour votre bonne solution.

Cependant 2 choses que j'ai remarquées:

  • La méthode isvalid de votre validateur doit revenir vrai en cas de succès.
  • Le validateur ne sera pas exécuté lors de la validation de formulaire sans passer l'option allecharpty à false au champ de texte.

0 commentaires

1
votes

J'ai créé un validateur personnalisé qui rendra votre élément requis en fonction de la valeur d'un autre élément de formulaire Zend.

Voici le complet code . J'espère que cela aide quelqu'un.

L'idée est de créer un validateur personnalisé et de passer au nom de l'élément conditionnel et de la valeur de cet élément conditionnel dans le constructeur. La méthode ISVALID de Zend_Validor a déjà accès à la valeur de l'élément que vous attachez le validteur à tous les noms et valeurs d'élément de formulaire.

Donc, à l'intérieur de la méthode ISVALID, vous avez toutes les informations dont vous avez besoin pour déterminer si votre élément de formulaire doit être un élément requis.


1 commentaires

Bienvenue dans le débordement de pile. Veuillez résumer le lien dans votre réponse; De cette façon, si le lien devient obsolète, la réponse ne sera pas complètement inutile.



1
votes

sur Zend 1 Étendez la méthode ISVALID, où vous définissez les données requises en fonction des données postées par exemple:

    public function isValid($data)
    {
        if (!empty($data['companyCar'])) {
            $this->getElement('carValue')->setRequired(true);
        }

        return parent::isValid($data);
    }


0 commentaires