2009-07-20 18 views

Respuesta

34

Sinceramente, me gustaría crear un modelo sólo para la validación. Se puede crear un modelo que no utiliza una tabla añadiendo

var $useTable = false; 

Y a continuación, crear una matriz de validación de las normas para cada campo que desea validar:

var $validate = array('login' => 'alphaNumeric','email' => 'email','born' => 'date'); 

entonces, en su controlador, hacer algo como:

$this->MyModel->set($this->data); 
if($this->MyModel->validates()){ 
    // do stuff with valid data 
} 

Si realmente, realmente no puede utilizar un modelo, entonces usted tendrá que simplemente bucle sobre cada valor de $this->data en su acción del controlador y validarlo con una expresión regular o utilizar el material Validation::[rule](), como:

if(Validation::email($someThingThatMightBeAnEmailAddress)){ 
    // do stuff with valid email address. 
} 
+0

¿Por qué si (Validación :: correo electrónico ($ someThingThatMightBeAnEmailAddress)) que no trabaja en mi final? – PinoyStackOverflower

+0

@PinoyStackOverflower Si al no funcionar te refieres a que no se encuentra Validación de 'Clase', entonces podrías necesitar agregar App :: uses ('Validation', 'Utility') para incluir la clase de Validación. –

-3

Creo que mi primera pregunta sería la siguiente: si usted no tiene un modelo ... ¿Qué está validar? Por lo general, la recopilación de datos se realizaría para completar un modelo. Si está utilizando un repositorio de datos alternativo (archivo, servicios web, etc.), un modelo todavía sería la forma más apropiada para acceder y manipular los datos.

En resumen, para responder mejor a esto, creo que un poco más de contexto sería útil y tal vez incluso necesario.

+1

Muchas cosas no recopilan datos, pero aún podrían beneficiarse de la validación: campos de búsqueda, formularios de inicio de sesión, filtrado de una búsqueda ... –

+3

esto no es una respuesta, habría funcionado como respuesta a la pregunta – Costa

1

Había encontrado con esta pregunta, ya que también tenía un problema similar. Tengo un formulario que necesita recopilar datos y generar un PDF. Por lo tanto, no hay ningún ahorro de datos ni una clase de modelo de mecanizado. El PDF es un contrato de usuario y el usuario completará el formulario en línea y los datos rellenos se usarán para generar el PDF que deben imprimir y enviar por correo. Pero necesito validar si los campos no están vacíos, si el correo electrónico es realmente un formato de correo electrónico, y las entradas de fecha son realmente entradas de fecha.

Primero lo hice sin una clase de modelo y luego vi this quesion. Ahora estoy usando una clase de modelo ficticia para poner mis validaciones allí, ya que el código en la acción del controlador se ve muy bien.

9

Puede realizar la validación de los datos del formulario en CakePHP sin tener que crear un archivo model.php. Hay muchas ocasiones en las que tengo que hacer esto, y el almacenamiento de archivos modelo.php que no hacen nada más que la validación es un uso deficiente del patrón de diseño modelo.

Otro problema con CakePHP es que a veces las reglas de validación son comunes en varios modelos. Sería bueno mover la validación fuera del modelo, de la misma forma en que los comportamientos son para su propia subcarpeta. De esa forma podemos reutilizarlos o usarlos sin un modelo.

Otro problema con la validación es que depende del alias del modelo. Si tiene un modelo llamado "Correo electrónico" sin una tabla para realizar la validación, el formulario publicado también debe usar "Correo electrónico". Si el formulario usa un alias diferente del controlador, entonces debe establecer la acción. Una gran cantidad de pasos adicionales solo para hacer la validación. No puede volver a utilizar ese modelo nuevamente si su formulario utiliza un modelo diferente.

Así que aquí es mi enfoque alternativo.

En la acción de su controlador que recibe los datos del formulario publicado. Puede crear un modelo CakePHP predeterminado, agregar algunas reglas de validación y luego usar ese modelo para la validación.

Una acción de ejemplo podría verse así;

function edit() 
{ 
    $model = ClassRegistry::init(array('class'=>'Email','table'=>false,'type'=>'Model')); 
    if(!empty($this->data)) 
    { 
     $model->validate = array(
      'subject'=>array(
       'rule'=>'notEmpty', 
       'required'=>true 
      ), 
      'message'=>array(
       'rule'=>'notEmpty', 
       'required'=>true 
      ) 
     ); 
     if($model->save($this->data)) 
     { 
      // validation was successful, but no data was actually saved 
     } 
    } 
} 

La clave aquí es la creación de un modelo automático de CakePHP.

 $model = ClassRegistry::init(array('class'=>'Email','table'=>false,'type'=>'Model')); 

Lo anterior intenta encontrar un modelo por correo electrónico en la carpeta del modelo de aplicaciones. Cuando no se encuentre, CakePHP creará automáticamente un modelo en memoria para esa clase. Como hemos establecido el valor de 'table' en false, esto debería indicarle a CakePHP que este modelo no usa una tabla.

Esto funciona mientras no haya realmente un archivo email.php en la carpeta del modelo de aplicaciones. Una vez que este modelo se crea en la memoria. Se puede acceder desde la ayuda de Formularios integrada. Eso significa que los errores de validación se transmitirán correctamente a la vista.

Aquí hay un archivo de vista de ejemplo.

<?php echo $this->Form->create('Email',array('action'=>array('controller'=>'mycontroller','action'=>'edit'))); ?> 
<?php echo $this->Form->input('subject'); ?> 
<?php echo $this->Form->input('message',array('type'=>'textarea')); ?> 
<?php echo $this->Form->submit(); ?> 

La vista ahora representará los errores de validación del modelo de correo electrónico utilizando el Ayudante de formularios. Esto se debe a que el registro de clases de CakePHP ha guardado una copia del modelo automático de correo electrónico en la memoria a la que accederá el Ayudante de formularios.

Si desea utilizar reglas de validación personalizadas, deberá colocar los métodos de devolución de llamada en el archivo app_model.php.

Estos métodos ensayados en CakePHP 1.3

+1

También probado en CakePHP 2.4.4. Maravillosa respuesta! Fue realmente útil para mí. – t3b4n

0

clase de validación que es una subclase de objeto se utiliza por clase modelo para realizar la validación contra las reglas de validación especificados en el mismo.

Se puede instanciar directamente la clase de Validación dentro de cualquier controlador o modelo y usar sus métodos para realizar la validación en cualquier dato, no solo las entradas de los formularios.

0

@ ThinkingMedia's answer me hizo ir en la dirección correcta, pero $model->save($this-data) me estaba devolviendo una contraseña falsa, incluso cuando el formulario era válido. Estoy usando CakePHP 2.3.9 como referencia.

Resultó que, incluso con 'table'=>false conjunto de parámetros, al regresar de $successsave() se basó en un $count > 0 de las filas que se han creado/modificado/modificados. En mi caso sin tabla significaba que $count de 0 y $success era false. Terminé la mezcla de la respuesta que se hace referencia con este similar question's solution tener trabajo de validación correctamente sin un archivo de modelo:

function edit() 
{ 
    $model = ClassRegistry::init(array('class'=>'YourFormName','table'=>false,'type'=>'Model')); 
    if($this->request-is('post')) 
    { 
     $model->validate = array(
      'some_field'=>array(
       'rule'=>'notEmpty', 
       'required'=>true 
      ), 
      'another_field'=>array(
       'rule'=>'notEmpty', 
       'required'=>true 
      ) 
     ); 
     $model->set($this->request->data) 
     if($model->validate($this->request->data) && empty($model->validationErrors)) 
     { 
      // validation was successful, but no data was actually saved 
     } 
    } 
} 
Cuestiones relacionadas