2013-04-26 4 views
11

Ich benutze Zend \ Formular \ Factory-Formen in zend framework2Wie setze ich Filter und Validatoren in ZF2 Fieldsets mit Zend Form Factory?

$factory = new Zend\Form\Factory(); 
$factory->createForm(array(
    'elements' => array(
     array(
      'spec' => array(
       'name' => 'name', 
      ), 
     ), 
    ), 
    'input_filter' => array(
     'name' => array(
      'validators' => array(
       // validators for field "name" 
      ), 
      'filters' => array(
       // filters for field "name" 
      ), 
     ), 
    ), 
)); 

Sie können sehen, zu schaffen, dass es Filter und Prüfer für das Feld "Name". Es klappt. Ich habe das Problem, wenn ich Fieldset verwenden:

$factory->createForm(array(
    'fieldsets' => array(
     array(
      'spec' => array(
       'name' => 'common', 
       'elements' => array(
        array(
         'spec' => array(
          'name' => 'name', 
         ), 
        ), 
       ), 
      ), 
     ), 
    ), 
    'input_filter' => array(
     'name' => array(
      'validators' => array(
       // validators for field "name" 
      ), 
      'filters' => array(
       // filters for field "name" 
      ), 
     ), 
    ), 
)); 

In diesem Beispiel Eingangsfilter doesn `t Arbeit. Ich weiß nicht, wie Filter zu setzen und Validatoren „name“ in Fieldset „common“

Dieses Beispiel nicht funktionieren Feld:

$factory->createForm(array(
    'fieldsets' => array(
     array(
      'spec' => array(
       'name' => 'common', 
       'elements' => array(
        array(
         'spec' => array(
          'name' => 'name', 
         ), 
        ), 
       ), 
       'input_filter' => array(
        'name' => array(
         'validators' => array(
          // validators for field "name" 
         ), 
         'filters' => array(
          // filters for field "name" 
         ), 
        ), 
       ), 
      ), 
     ), 
    ),  
)); 
+0

Definieren Sie die Validierer und Filterspezifikationen in der relevanten Feldgruppenspezifikation, nicht in der Top-Level-Formularspezifikation. – timdev

+0

Ich habe versucht, dies zu tun, aber es funktioniert auch nicht. (aktualisierte Frage) ZF2 2.1.5 – Ildar

+0

Hmm ... Ich kann es momentan nicht testen, aber ich vermute, du brauchst einen '' name '=>' name ', 'Schlüssel/Wert-Paar in deinem Hauptnamen' Schlüssel. Ich werde es versuchen. – timdev

Antwort

18

Sie müssen ‚Typ‘ Schlüssel im Eingangsfilter angeben, wenn Sie Fieldset verwendet.

$factory = new \Zend\Form\Factory();   
$form = $factory->createForm(array(
    'hydrator' => 'Zend\Stdlib\Hydrator\ArraySerializable', 
    'elements' => array(
     array(
      'spec' => array(
      'name' => 'email1', 
      ), 
     ), 
    ), 
    'fieldsets' => array(
     array(
      'spec' => array(
       'name' => 'common', 
       'elements' => array(
        array(
         'spec' => array(
         'name' => 'email2', 
         ), 
        ), 
       ), 
      ), 
     ), 
    ), 
    'input_filter' => array(    
     'email1' => array(
      'validators' => array(
      // validators for field "name"       
       new \Zend\Validator\EmailAddress(), 
      ), 
      'filters' => array(
      // filters for field "name" 
       array('name' => 'Zend\Filter\StringTrim'), 
      ), 
     ), 
     'common' => array(
      'email2' => array(
       'validators' => array(
       // validators for field "name"       
       new \Zend\Validator\EmailAddress(), 
       ), 
       'filters' => array(
       // filters for field "name" 
       array('name' => 'Zend\Filter\StringTrim'), 
       ), 
      ), 
      'type' => 'Zend\InputFilter\InputFilter', 
     )   
    ), 

)); 

$form->setData(array('email1'=>'[email protected]','common'=>array('email2'=>'invalid-email'))); 
if(!$form->isValid()){ 
    print_r($form->getMessages()); 
} 
+0

Ich glaube nicht, 'validators' => array ( // validatoren für feld "name" new \ Zend \ Validator \ EmailAddress(), ) , funktioniert ... weil der Validator nach dem Schlüsselwert pare des Arrays fragt und diesen Fehler gibt "Ungültige Validiererspezifikation wird bereitgestellt; enthält nicht den Namen" Schlüssel ".. eine beliebige Lösung? – Ruwantha

1

Sie haben Ihre Syntax falsch ist, sind häufig und spec soll verschachtelte Fieldsets oder etwas? Nicht sicher, was Sie dort tun ... Probieren Sie die spec Teil zu entfernen

$factory = new Factory(); 
$form = $factory->createForm(array(
'fieldsets' => array(
    array(
     'name' => 'details', 
     /** 
     * Elements for the "details" form 
     */ 
     'elements' => array(
      array(
       'name' => 'name', 
       'type' => 'Text', 
       'options' => array(
        'label' => 'Full name', 
        ), 

      ), 
      array(
       'type' => 'Zend\Form\Element\Email', 
       'name' => 'email', 
       'options' => array(
        'label' => 'Email address', 
        ), 
      ), 
     ), 
    ), 
    array(
     'name' => 'extra', 
     'elements' => array(
      array(
       'name' => 'address', 
       'type' => 'Text', 
       'options' => array(
        'label' => 'Address', 
       ), 
      ), 
      array(
       'name' => 'notes', 
       'type' => 'Zend\Form\Element\Textarea', 
       'options' => array(
        'label' => 'Notes', 
       ), 
      ), 
     ), 
    ), 
), 
/** 
* Elements on the form itself, not in the fieldsset 
*/ 
'elements' => array(
    array(
     'type' => 'Zend\Form\Element\Captcha', 
     'name' => 'captcha', 
     'options' => array(
      'captcha' => array(
       'class' => 'Dumb', 
      ), 
     ), 
    ), 
    array(
     'type' => 'Zend\Form\Element\Csrf', 
     'name' => 'security', 
    ), 
    array(
     'name' => 'send', 
     'type' => 'Submit', 
     'attributes' => array(
      'value' => 'Submit', 
     ), 
    ), 
), 
/*/ 
* Input Filters Spec here 
*/ 
'input_filter' => array(
    'name' => array(
     'validators' => array(
      // validators for field "name" 
     ), 
     'filters' => array(
      // filters for field "name" 
     ), 
    ), 
), 
)); 
+0

Meine Syntax ist korrekt, ich habe es überprüft. Allgemein ist nur ein Name von fieldset. "Common" Index in Fields Array war nur für mich, für den einfachen Zugriff habe ich bereits "common" Index aus dem Post entfernt. spec ist erforderlich, ohne es bekomme ich Ausnahme "Zend \ Form \ Fieldset :: add: Element oder fieldset vorgesehen ist nicht benannt, und kein Name in Flag zur Verfügung gestellt". Also, Ihr Code ist falsch – Ildar

+1

Mein Code ist falsch? das ist lustig, es ist direkt aus der docs, spec ist nicht erforderlich. – Andrew

+0

Ich denke, das ist Dokumentationsfehler. Beispiel funktioniert wirklich nicht. https://github.com/zendframework/zf2/issues/2561 – Ildar

2

Wenn Sie dynamische Validatoren in der Aktion hinzufügen möchten (zB Validatoren, die nur benötigt werden, wenn einige andere Felder einen bestimmten Wert haben), ist es ein ganz Puzzle diese anzuwenden, wenn das Formular Sammlung verwenden.

Um dies zu erreichen, sollten Sie die Validator-Kette aus dem spezifischen Element greifen. Für jedes Fieldset sollten Sie jedoch zuerst einen eigenen Eingabefilter verwenden. Ich möchte dies teilen, weil dies 2 Stunden dauerte, um zu verstehen;)

Nehmen wir an, Sie haben ein Basisformular, das Basisformular hat ein Fieldset, und das Feldset hat x-Elemente. Der Code um eine Prüfung einer der x-Elemente erfordert folgende Kette hinzuzufügen:

$form->getInputFilter() 
    ->get('base-form') 
    ->get('fieldset-form') 
    ->getInputFilter() 
    ->get('element') 
    ->getValidatorChain() 
    ->addValidator($validator); 

Das 2 getInputFilter() können Sie eine Kopfschmerzen.