2009-12-19 12 views
5

quiero usar la validación núcleo de CakePHP para las listas en mi modelo:validación del modelo de CakePHP con arreglo

var $validate = array(
    'selectBox' => array(
    'allowedChoice' => array(
     'rule' => array('inList', $listToCheck), 
     'message' => 'Enter something in listToCheck.' 
    ) 
) 
); 

Sin embargo, la matriz $listToCheck es la misma matriz que se utiliza en la vista, para llenar una caja de selección. ¿Dónde pongo esta función?

public function getList() { 
    return array('hi'=>'Hello','bi'=>'Goodbye','si'=>'Salutations'); 
} 

Ya en mi regulador, en una de las acciones Soy la creación por la vista, como:

public function actionForForm() { 
    $options = $this->getList(); 
    $this->set('options', $options); 
} 

Por lo tanto, yo no quiero tener que copiar la función getList(). ¿Dónde puedo ponerlo para que el Modelo pueda llamarlo para completar su matriz $listToCheck?

Gracias por su ayuda.

Respuesta

11

Teniendo en cuenta que se trata de datos, debe almacenar la lista de opciones válidas en el modelo.

class MyModel extends AppModel { 

    var $fieldAbcChoices = array('a' => 'The A', 'b' => 'The B', 'c' => 'The C'); 

} 

Puede obtener esa variable en el controlador simplemente como esto:

$this->set('fieldAbcs', $this->MyModel->fieldAbcChoices); 

Por desgracia no se puede simplemente usar esa variable en la declaración regla para la regla inList, ya que las normas se declaran como ejemplo las variables y esas solo se pueden inicializar de forma estática (no se permiten variables). La mejor forma de evitar eso es para establecer la variable en el constructor:

var $validate = array(
    'fieldAbc' => array(
     'allowedChoice' => array(
      'rule' => array('inList', array()), 
      'message' => 'Enter something in listToCheck.' 
     ) 
    ) 
); 

function __construct($id = false, $table = null, $ds = null) { 
    parent::__construct($id, $table, $ds); 

    $this->validate['fieldAbc']['allowedChoice']['rule'][1] = array_keys($this->fieldAbcChoices); 
} 

Si no se siente cómodo anulando el Constructor, también se puede hacer esto en una devolución de llamada beforeValidate().

También tenga en cuenta que no se debe nombrar su campo 'selectbox'. :)

+0

Gracias por la respuesta. Pero, ¿qué sucede cuando quiero usar la función '__()' en los valores de fieldAbc? – ash

+1

A continuación, cree todo el conjunto en el constructor, o 'array_walk' sobre él y aplique la función en los campos' mensaje'. '$ this-> choices = array ('a' => __ ('The A', true), ...);' – deceze

+0

Perfecto. ¡Gracias por tu ayuda! – ash

Cuestiones relacionadas