2013-02-03 16 views
6

C'è un modo per richiedere un array di elementi nel metodo rules() di un modello Yii? Per esempio:Regole di convalida Yii per un array

public function rules() 
{ 
    return array(
      array('question[0],question[1],...,question[k]','require'), 
    ); 
} 

Sono stato in esecuzione in situazioni in cui ho bisogno di convalidare più array di elementi proveniente da un formulario e io non riesco a trovare un buon modo di andare su di esso altro che fare il sopra. Ho lo stesso problema quando si specifica attributeLables(). Se qualcuno ha qualche consiglio o un modo migliore per farlo, lo apprezzerei molto.

+0

dlnGd0nG, il collegamento non menziona come convalidare matrici di elementi. – dataplayer

+0

Ho pensato di voler aggiungere un input tabellare. Quali sono quelle 'domanda [x]'? Sono attributi di classe? e dal modello di Yii ti stai riferendo a cosa? 'CActiveRecord',' CfromModel' o 'CModel'? – dInGd0nG

+0

dlnGd0nG, la 'domanda [x]' sono valori di nome dei moduli che sto inviando. Il modello Yii che menziono sono in particolare CFormModels. – dataplayer

risposta

13

È possibile utilizzare l'alias CTypeValidator da type

public function rules() 
{ 
    return array(
      array('question','type','type'=>'array','allowEmpty'=>false), 
    ); 
} 
+0

Questo è totalmente quello che stavo cercando. Ho appena "scritto" alias, come hai detto tu: 'array ('question', 'CTypeValidator', 'type' => 'array', 'allowEmpty' => false),' e ha funzionato perfettamente. Grazie! – dataplayer

2

Con array('question','type','type'=>'array','allowEmpty'=>false), si può solo verificare che si riceve esattamente array, ma non si sa che cosa all'interno di questa matrice. Per convalidare gli elementi dell'array devi fare qualcosa del tipo:

<?php 

class TestForm extends CFormModel 
{ 
    public $ids; 

    public function rules() 
    { 
     return [ 
      ['ids', 'arrayOfInt', 'allowEmpty' => false], 
     ]; 
    } 

    public function arrayOfInt($attributeName, $params) 
    { 
     $allowEmpty = false; 
     if (isset($params['allowEmpty']) and is_bool($params['allowEmpty'])) { 
      $allowEmpty = $params['allowEmpty']; 
     } 
     if (!is_array($this->$attributeName)) { 
      $this->addError($attributeName, "$attributeName must be array."); 
     } 
     if (empty($this->$attributeName) and !$allowEmpty) { 
      $this->addError($attributeName, "$attributeName cannot be empty array."); 
     } 
     foreach ($this->$attributeName as $key => $value) { 
      if (!is_int($value)) { 
       $this->addError($attributeName, "$attributeName contains invalid value: $value."); 
      } 
     } 
    } 
} 
Problemi correlati