Frage

Ich versuche, ein Formular zu erstellen, das die Validierung eines Feldes zu ändern basierend auf der Select-Option aus dem HTML-Formularfeld.

Ex: Wenn Benutzer eine Option 1 aus Dropdown-Feld „Optionen“ wählen, mag ich das Feld „metric“ zu validieren als sfValidatorInteger. Wenn der Benutzer wählen Sie die Option 2 aus dem Feld „Optionen“, möchte ich das Feld „metric“ zu validieren als sfValidatorEmail, etc.

So in der öffentlichen Funktion configure () {ich die switch-Anweisung den Wert von „Optionen“ zu erfassen, und erstellen Sie den Validator auf der Grundlage dieses Wertes aus den „Optionen“ zurückgegeben.

1.) Wie erfassen ich den Wert von „Optionen“? Ich habe versucht:

$this->getObject()->options
$this->getTaintedValues()

Das einzige, was derzeit für mich arbeiten, aber es ist nicht wirklich MVC:

$params = sfcontext::getInstance()->getRequest()->getParameter('options');

2.) Nachdem ich diese Informationen erfasst haben, wie kann ich den Wert von „metric“ zu einem anderen Feld zuordnen? ( „Metrik“ ist nicht eine reale Spalte in dB). Also brauche ich den Wert von „metric“ zu anderem Feld wie „E-Mail“, „Alter“ vergeben ... Zur Zeit bin ich die Handhabung bei dem Post-Validator dies wie diese, nur fragen, ob ich Wert innerhalb der configure zuweisen kann ( ):

$this->validatorSchema->setPostValidator(new sfValidatorCallback(array('callback' => array($this, 'checkMetric'))));

public function checkMetric($validator, $values) {

}

Danke!

War es hilfreich?

Lösung

Sie möchten einen Beitrag Validator verwenden. Versuchen Sie so etwas wie dies in der Form tun:

public function configure()
{
  $choices = array('email', 'integer');
  $this->setWidget('option', new sfWidgetFormChoice(array('choices' => $choices))); //option determines how field "dynamic_validation" is validated
  $this->setValidator('option', new sfValidatorChoice(array('choices' => array_keys($choices)));
  $this->setValidator('dynamic_validation', new sfValidatorPass()); //we're doing validation in the post validator
  $this->mergePostValidator(new sfValidatorCallback(array(
    'callback' => array($this, 'postValidatorCallback')
  )));
}

public function postValidatorCallback($validator, $values, $arguments)
{
   if ($values['option'] == 'email')
   {
     $validator = new sfValidatorEmail();
   }
   else //we know it's one of email or integer at this point because it was already validated
   {
     $validator = new sfValidatorInteger();
   }
   $values['dynamic_validation'] = $validator->clean($values['dynamic_validation']); //clean will throw exception if not valid
   return $values;
}

Andere Tipps

1) In einem post-Validator können Werte von die $ values ??Parameter verwenden. Verwenden Sie einfach $ Werte [ ‚Optionen‘] und es sollte in Ordnung sein ... oder wollten Sie diese Werte für den Zugriff von einem anderen Teil von Ihnen Code? $ This-> getObject () -> widgetSchema [ 'Optionen'] sollte auch funktionieren denke ich, sobald das Formular an ein Objekt gebunden ist

.

2) Das configure () -Methode wird am Ende des Formulars Konstruktor aufgerufen, so Werte nicht noch zugänglich noch gebunden, es sei denn, Sie Ihr Formular mit einem Objekt aus dem db initialisiert wird (die keine Validierung erforderlich ist). Aber wenn Sie Ihre Form von $ _POST initialisiert werden soll, ein Post Validator ist definitiv der Weg IMHO zu gehen.

Ich habe den Fehler bei der Überprüfung neben dem Feld angezeigt werden, indem ein sfValidatorErrorSchema anstelle einem sfValidatorError werfen.

$values['dynamic_validation'] = $validator->clean($values['dynamic_validation']);

... wird ...

try
{
    $values['dynamic_validation'] = $validator->clean($values['dynamic_validation']);
}
catch(sfValidatorError $e)
{
    $this->getErrorSchema()->addError($e, 'dynamic_validation');
    throw $this->getErrorSchema();
}

Nicht sicher, ob dies der beste Weg ist, um dieses Ergebnis zu erhalten, aber es scheint im Moment für mich zu arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top