2015-12-25 23 views
5

I have a moneyFieldset con 2 campi, importo e valuta.Modifica parametro richiesto campi Fieldset 'dinamicamente

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); 
    } 

sto usando moneyFieldset in altri miei fieldsets come questo:

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

Quando ho creato il filtro in questo modo:

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

Non funziona perché prezzo ha 2 campi, quindi come posso dire prezzo [importo] e prezzo [curreny] è richiesto?

risposta

4

È possibile fornire le specifiche di input per il fieldset nidificato (nel contesto del modulo) utilizzando la seguente struttura di array.

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

Se si modifica dinamicamente i valori del filtro di ingresso potrebbe essere opportuno prendere in considerazione la creazione del validatore usando una classe di servizio fabbrica e poi attaccarlo ad un modulo che utilizza l'API oggetto piuttosto che array.

+0

L'ho provato ma non è cambiato nulla. Questo è l'output: ''. Non esiste un parametro 'required = 'required''. – Eray

+0

Con zf2, dire in inputFilterSpecification che è richiesto un campo o un gruppo di campi, non significa che un attributo richiesto è impostato in HTML, è solo per la convalida quando si fa $ form-> isValid(), esso controllerà tutti i campi richiesti all'interno del gruppo di validazione – Hooli

+0

Quindi ho anche bisogno di impostare anche l'attributo richiesto. Ho pensato che 'price [attributes] [required] = true' produrrà l'attributo HTML' required = required' – Eray

3

Come ho detto nel @ di AlexP commento, un campo, o di un gruppo di campo dichiarato, come richiesto in questo modo:

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

Non significa che sarà stampare un HTML come questo:

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

Basta controllare quando lo farai $form->isValid() se i tuoi campi sono vuoti e richiesti o altri controlli. Per ottenere ciò, è sufficiente impostare gli attributi per i quali si desidera richiedere tali campi. Come hai già fatto. Gli attributi possono aggiungere, come l'attributo di classe, il codice html a un input.

P.S: la risposta di AlexP è la migliore risposta, ho appena dato maggiori informazioni a riguardo.