0

Es gibt eine komplexe Form mit vielen verschachtelten Feldgruppen. Einige Felder müssen abhängig vom Feld (-s) in einem anderen Feldset validiert werden. So kann ich nicht alle Validierungsregeln direkt in der getInputFilterSpecification() der Fieldset definieren, da ich dort nicht auf andere fieldsets (nur die Unterfeldgruppen) zugreifen kann. Der einzige Weg dies zu tun, ist die Form Validierung zu erweitern. Recht? Wenn ja, wie geht das?Was ist der richtige Weg, um Validierung auf der Formularebene in ZF2 hinzuzufügen?

MyForm extends Form 
{ 
    public function isValid() 
    { 
     $isFormValid = parent::isValid(); 
     $isFieldXyzValid = // my additional validation logic 
     if(! $isFieldXyzValid) { 
      $fieldXyz->setMessages(...); 
     } 
     return $isFormValid && $isFieldXyzValid; 
    } 
} 

Gefällt mir das? Oder ist ein sauberer Weg, um dieses Problem zu lösen?

Antwort

0

Ich habe bereits etwas ähnliches in meinem vorherigen Projekt entwickelt.

Dafür benutze ich einen Dienst, der meine Form annimmt und dynamisches Fieldset und natürlich benutzerdefinierte Validierungsregeln festlegt.

In Ihrem Controller, Ihre Form erhalten (über die Dependency Injection Formmanager (polyfilled oder nicht).

$form = $this->formManager->get('{your form}'); 

Ihren Dienst aufrufen und es Ihre Form geben.

Und in Ihrem Service können Sie tun alles wollen Sie mögen:

  • Ihr Material erhalten (von DB oder andere) wich Felder sind Pflicht
  • bestimmen
  • Für jeweils auf dem Formular
  • hinzufügen oder entfernen Fieldset
  • Hinzufügen oder Entfernen von Validation Felder
  • hinzufügen oder entfernen Filter
  • Hinzufügen oder Entfernen von Validatoren

Ich führte diejenigen, die über (Probe) in einer foreach wo $stuff ist ein Element der Lehre Sammlung

$nameFieldset = 'my_fieldset-'.$stuff->getId(); 
      $globalValidator = new GlobalValidator(); 
      $globalValidator->setGlobalValue($gloablValue); 

      $uoValidator = new UcValidator(); 
      $uoValidator->setOptions(array(
       'idToValidate' => $stuff->getId(), 
       'translator' => $this->translator 
      )); 

      $globalValidator->setOptions(array(
       'idToValidate' => $stuff->getId(), 
       'translator' => $this->translator 
      )); 

      $name = 'qty-'.$stuff->getId(); 

      $form = $this->setFilters($form, $name, $nameFieldset); 
      $globalValidator->setData($data); 
      $form = $this->setValidators($form, $name, $globalValidator, $uoValidator, $nameFieldset); 

Wo setFilters und setValidato rs sind benutzerdefinierte Methoden, die Filter und Validator zu meinen Feldern hinzufügen (auch benutzerdefiniert)

/** 
* @param myForm $form 
* @param $name 
* @param string $nameFieldset 
* @return myForm 
*/ 
public function setFilters($form, $name, $nameFieldset) 
{ 
    $form->getInputFilter()->get('items')->get($nameFieldset) 
     ->get($name) 
     ->getFilterChain() 
     ->getFilters() 
     ->insert(new StripTags()) 
     ->insert(new StringTrim()); 

    return $form; 
} 


/** 
* @param myForm $form 
* @param $name 
* @param $globalValidator 
* @param $uoValidator 
* @param $nameFieldset 
* @return myForm 
*/ 
public function setValidators($form, $name, $globalValidator, $uoValidator, $nameFieldset) 
{ 
    $optionsSpace = [ 
     'translator' => $this->translator, 
     'type' => NotEmpty::SPACE 
    ]; 
    $optionsString = [ 
     'translator' => $this->translator, 
     'type' => NotEmpty::STRING 
    ]; 
    $optionsDigits = [ 
     'translator' => $this->translator, 
    ]; 
    $form->getInputFilter()->get('items') 
     ->get($nameFieldset) 
     ->get($name) 
     ->setRequired(true) 
     ->getValidatorChain() 
     ->attach($uoValidator, true, 1) 
     ->attach($globalValidator, true, 1) 
     // We authorize zéro but not space nor strings 
     ->attach(new NotEmpty($optionsSpace), true, 2) 
     ->attach(new NotEmpty($optionsString), true, 2) 
     ->attach(new Digits($optionsDigits), true, 2); 
    return $form; 
} 
+0

Vielen Dank für eine detaillierte Antwort! Aber ich denke, es ist nicht, wonach ich suche: 1. Ich "kompiliere" meine "Form" auf eine andere Art und Weise - es gibt nur eine "Form" und sie (und ihre "Fieldsets") werden anders (sub -) 'Fieldset 'hängt vom Kontext ab. 2. Das eigentliche Problem besteht darin, Felder zu validieren, wenn diese Validierung von Feldern eines anderen 'Fieldsets' abhängt. – automatix

+0

In diesem Beispiel habe ich nur ein Formular, und wie Sie in dieser Antwort sehen können, füge ich so viel fieldset hinzu, wie ich Sachen in meiner Sammlung habe. – Hooli

Verwandte Themen