2013-04-03 13 views
5

Io uso un determinato modulo in più posizioni. In uno di essi ho bisogno di ignorare un elemento del modulo che ho impostato a livello di programmazione dopo la convalida.Zend Framework 2: l'elemento del modulo rimosso causa la mancata convalida

Poiché è solo un'eccezione, non desidero creare un nuovo modulo. Così ho pensato, ho solo rimuovere questo elemento nel controller come:

$myForm->remove('myElement'); 

Il problema è che la forma ora non convaliderà. Non ricevo errori, ma lo $myForm->isValid() restituisce solo un valore vuoto.

Tutte le idee che potrei fare male?

Grazie!

+0

Sei sicuro di utilizzare ZF2? Non riesco a trovare alcuna classe all'interno del componente Zend \ Form con i metodi "remove" e "isValid". – Maks3w

+0

http://framework.zend.com/apidoc/2.0/classes/Zend.Form.Form.html#remove – Ron

+0

Qual è il valore restituito da hasValidated prima che la chiamata sia valida? – Maks3w

risposta

10

Ok, finalmente ho found a solution! È possibile definire un ValidationGroup, che consente di impostare gli attributi che desideri per la convalida.Gli altri non sono convalidati:

$form->setValidationGroup('name', 'email', 'subject', 'message'); 
$form->setData($data); 
if ($form->isValid()) { 
    ... 
+1

Great! Questa è LA soluzione. Lo userò d'ora in poi! – lluisaznar

+1

Congratulazioni. Penso che questo sia il modo più accettabile perché non esiste il metodo 'detach()' su 'ValidatorChain'. – edigu

+1

Risposta corretta. Spiegato da @weierophinney qui: https://github.com/zendframework/zf2/issues/2839#issuecomment-9883750 – webDEVILopers

0

Ci deve essere un validatore definito per questo particolare elemento che si sta tentando di rimuovere.

Nel vostro controller in cui si stanno aggiungendo nuovi elementi alla forma, ci deve essere addValidator chiamando come:

$ elemento-> addValidator ('alnum');

Ciò causa effettivamente il fallimento della convalida. Quindi hai rimosso l'elemento dal modulo ma hai ancora la convalida definita su quell'elemento da controllare.

Se non si riesce a trovare questa funzione di aggiunta di convalida nel controller, provare a vedere se è stata definita tramite il file di configurazione.

È possibile leggere ulteriori sulla convalida forma in ZF qui: http://framework.zend.com/manual/1.12/en/zend.form.elements.html

+0

Sto aggiungendo i validatori tramite Annotazioni ... qualsiasi idea di come rimuoverli in 'ZF2'? – Ron

2

La prima cosa che ho pensato è stato quello di rimuovere il validatore dal ValidatorChain del MyElement. Si potrebbe ottenere all'interno del controller con:

$form->getInputFilter()->get('myElement')->getValidatorChain() 

Sembra che non è possibile rimuovere dal ValidatorChain, basta aggiungere. Controlla questo post. Matthew Weier O'Phinney, di Zend, spiega perché non può essere fatto e una possibile soluzione per il tuo scenario.

Il mio modo di risolvere questo problema, sta controllando la 'condizione di rimuovere' quando creo il validatore nella classe FormFilter. Se usi annotazioni, penso che non funzioni per te, quindi i suggerimenti di Matteo sono quelli che dovresti usare.

Oppure si può provare quello in questo post da @Stoyan Dimov: definire due forme, una sorta di BasicForm e ExtendedForm. Il primo presenta tutte le caratteristiche di forma comuni, il secondo è un esteso tra l'altro con il resto dei campi. A seconda delle tue condizioni puoi usare l'una o l'altra.

+0

grazie per questa risposta molto riassunta! sfortunatamente sto usando 'AnnotationForms' e finirò con una ridondanza quasi completa quando creo un secondo modulo ... – Ron

1

In class ValidatorChain implements Countable, ValidatorInterface, aggiungere un nuovo metodo:

public function remove($name){ 
    foreach ($this->validators as $key => $element) { 
     $validator = $element['instance']; 
     if($validator instanceof $name){ 
      unset($this->validators[$key]); 
      break; 
     } 
    } 
} 

Usa come questo:

$form->getInputFilter()->get("xxxxx")->getValidatorChain()->remove('xxxxxx'); 
+0

ValidatorChain è una delle classi principali di ZF2. Che dire di come aggiungere un nuovo metodo all'istanza di validationChain? – edigu

0

posso rimuovere l'elemento con:

$form->get('product')->remove('version'); 

Quando inserisco il modulo che ho disabilitato e il validatore su questo elemento con:

$form->getInputFilter()->get('product')->get('version')->setRequired(FALSE); 
Problemi correlati