2009-09-16 5 views

risposta

6

Credo che la migliore e più corretto modo per farlo è la creazione di un validatore personalizzato.

È possibile eseguire questo validatore in due modi diversi: uno utilizza il secondo parametro passato al metodo isValid, $ context, ovvero il modulo corrente che viene convalidato o, inietto l'elemento Checkbox, che deve essere controllato per convalida per verificarsi, nel costruttore. Io preferisco l'ultimo:

<?php 
class RequiredIfCheckboxIsChecked extends Zend_Validate_Abstract { 

    const REQUIRED = 'required'; 

    protected $element; 

    protected $_messageTemplates = array(
     self::REQUIRED => 'Element required' 
    ); 

    public function __construct(Zend_Form_Element_Checkbox $element) 
    { 
     $this->element = $element; 
    } 

    public function isValid($value) 
    { 
     $this->_setValue($value); 

     if($this->element->isChecked() && $value === '') { 
      $this->_error(self::REQUIRED); 
      return false; 
     } 

     return true; 
    } 

} 

Usage:

class MyForm extends Zend_Form { 

    public function init() 
    { 
     //... 

     $checkElement = new Zend_Form_Element_Checkbox('checkbox'); 
     $checkElement->setRequired(); 

     $dependentElement = new Zend_Form_Element_Text('text'); 
     $dependentElement->setAllowEmpty(false) 
      ->addValidator(new RequiredIfCheckboxIsChecked($checkElement)); 

     //... 
    } 

} 

Non ho ancora testato il codice, ma penso che dovrebbe funzionare.

1

Mi sono chiesto come farlo anche in ZF, anche se non ho mai dovuto implementare questa funzionalità.

Un'idea che viene in mente è creare un validatore personalizzato che accetta il campo checkbox come parametro ed eseguirlo in una catena di convalida come documented. Se la casella è selezionata, il validatore potrebbe restituire un errore. Quindi è possibile verificare se tutte le convalide non sono riuscite e solo successivamente trattare il modulo con convalida non riuscita.

Quel livello di personalizzazione della convalida del modulo potrebbe essere sconveniente, quindi forse utilizzare il metodo isValidPartial del modulo sarebbe meglio.

+0

vedi la mia risposta =) – JCM

2

In realtà non l'ho eseguito, ma dovrebbe funzionare entro limiti ragionevoli. Ho fatto qualcosa di simile prima che funzionasse, ma non riuscivo a ricordare dove fosse il codice.

<?php 

class My_Form extends Zend_Form 
{ 
    public function init() 
    { 
    $checkbox = new Zend_Form_Element_Checkbox("checkbox"); 
    $checkbox->setValue("checked"); 

    $textField = new Zend_Form_Element_Text("text"); 

    $this->addElements(array("checkbox", "text")); 

    $checkbox = $this->getElement("checkbox"); 

    if ($checkbox->isChecked()) 
    { 
     //get textfield 
     $textField = $this->getElement("text"); 

     //make fields required and add validations to it. 
     $textField->setRequired(true); 
    } 

    } 

} 
2

Ecco quello che faccio se ho bisogno di convalidare più elementi contro l'altro

$f = new Zend_Form(); 

if($_POST && $f->isValid($_POST)) { 
    if($f->checkbox->isChecked() && strlen($f->getValue('element')) === 0) { 
    $f->element->addError('Checkbox checked, but element empty'); 
    $f->markAsError(); 
    } 

    if(!$f->isErrors()) { 
    // process 
    ... 
    ... 
    } 
} 
0

Grazie JCM per la vostra buona soluzione.

Tuttavia 2 cose che ho notato:

  • Il metodo isValid del validatore deve restituire vero in caso di successo.
  • Il validatore non verrà eseguito durante la convalida del modulo senza passare l'opzione allowEmpty a false nel campo di testo.
1

Ho creato un validatore personalizzato che renderà l'elemento richiesto in base al valore di un altro elemento di forma zend.

Ecco il numero completo code. Spero che questo aiuti qualcuno.

L'idea è di creare un validatore personalizzato e passare il nome dell'elemento condizionale e il valore di quell'elemento condizionale nel costruttore. Il metodo isValid di Zend_Validor ha già accesso al valore dell'elemento a cui si sta collegando il validtor insieme a tutti i nomi e i valori dell'elemento del modulo.

Quindi, all'interno del metodo isValid sono disponibili tutte le informazioni necessarie per determinare se l'elemento del modulo deve essere un elemento richiesto.

+0

Benvenuti a Stack Overflow. Si prega di riassumere il link nella tua risposta; in questo modo, se il collegamento diventa obsoleto, la risposta non sarà completamente inutile. – michaelb958

0

Su Zend 1 estendere il metodo isValid, in cui si imposta richiesto a seconda dei dati inviati per esempio:

public function isValid($data) 
    { 
     if (!empty($data['companyCar'])) { 
      $this->getElement('carValue')->setRequired(true); 
     } 

     return parent::isValid($data); 
    }