2015-12-25 8 views
5

Ich habe eine moneyFieldset mit 2 Feldern, Menge und Währung.Fieldset Felder erforderlichen Parameter dynamisch ändern

class MoneyFieldset ... 
{ 
public function __construct($name = null, $options = array()) 
    { 
     parent::__construct($name, $options); 
     $this->setHydrator(...); 

     $this->add(array(
      'name' => 'currency', 
      'type' => 'select', 
      'options' => array(
       'value_options' => \Core\Service\Money::getAvailableCurrencies(true), 
      ), 
      'attributes' => array(
       'value' => \Core\Service\Money::DEFAULT_CURRENCY, 
      ), 
     )); 

     $this->add(array(
      'name'  => 'amount', 
      'type'  => 'text', 
     )); 
    } 
} 
public function getInputFilterSpecification() 
    { 
     $default = [ 
      'amount' => [ 
       'required' => false, 
       'allow_empty' => true, 
       'filters'  => [ 
        ['name' => AmountFilter::class] 
       ], 
       'validators' => [ 
       ] 
      ], 
      'currency' => [ 
       'required' => false, 
       'allow_empty' => true, 
       'filters'  => [ 
        ['name' => StringToUpper::class] 
       ], 
       'validators' => [ 
       ] 
      ] 
     ]; 
     return \Zend\Stdlib\ArrayUtils::merge($default, $this->filterSpec, true); 
    } 

Ich verwende moneyFieldset in meinem anderen Fieldset wie folgt aus:

 // Price Field 
     $this->add(array(
      'name'  => 'price', 
      'type'  => 'form.fieldset.moneyFieldset', 
      'attributes' => array(
       'required' => true, 
       'invalidText' => 'Please type an amount' 
      ), 
      'options' => array(
       ... 
      ), 
     )); 

Wenn ich Filter wie folgt festgelegt:

function getInputFilterSpecification() 
    { 
     'price' => [ 
      'required' => true, 
      'allow_empty' => false, 
     ], 
    } 

Es funktioniert nicht, weil Preis hat 2 Felder, also wie kann ich sagen Preis [Betrag] und preis [curreny] wird benötigt?

Antwort

4

Sie können die Eingabespezifikationen für das verschachtelte Feldset (im Kontext des Formulars) mithilfe der folgenden Arraystruktur angeben.

public function getInputFilterSpecification() 
{ 
    return [ 
     // ... 
     'price' => [ 
      'type' => 'Zend\InputFilter\InputFilter', 
      'amount' => [ 
       'required' => true, 
      ], 
      'currency' => [ 
       'required' => true, 
      ] 
     ], 
     //... 
    ]; 
} 

Wenn Sie dynamisch die Werte des Eingangsfilters modifiziert werden könnte es eine Überlegung wert, den Validator die Schaffung eines Service-Fabrik-Klasse und dann in eine Form Anbringen eher das Objekt API als Arrays.

+0

Ich habe es versucht, aber nichts geändert. Dies ist die Ausgabe: ''. Es gibt keinen 'required =' required'-Parameter. – Eray

+0

Mit zf2, sagen in inputFilterSpecification, dass ein Feld oder eine Gruppe von Feld erforderlich ist, bedeutet nicht, dass ein Attribut in HTML festgelegt ist, ist es nur zur Überprüfung, wenn Sie $ form-> isValid(), überprüft alle erforderlichen Felder innerhalb der ValidationGroup – Hooli

+0

Also muss ich auch erforderlichen Attribut auch setzen. Ich dachte, dass 'price [attributes] [required] = true' 'required = required' ergibt HTML-Attribut – Eray

3

Wie ich in die @ AlexP Kommentar, ein Feld oder eine Gruppe von Feld erklärt als wie dies erforderlich:

function getInputFilterSpecification() 
    { 
     'price' => [ 
      'required' => true, 
      'allow_empty' => false, 
     ], 
    } 

bedeutet nicht, dass es eine html wie dieser Druck sein wird:

<input type="text" required="required"/> 

Überprüfen Sie einfach, wenn Sie $form->isValid() tun, wenn Ihre Felder leer und erforderlich sind oder andere Prüfungen. Um dies zu erreichen, müssen Sie nur Attribute festlegen, die diese Felder benötigen. Wie du schon getan hast. Attribute können, wie Klassenattribute, HTML-Code zu einer Eingabe hinzufügen.

P.S: AlexPs Antwort ist die beste Antwort Ich gebe nur mehr Informationen darüber.

Verwandte Themen