2011-05-24 23 views
8

Por lo tanto, el marco es CodeIgniter 2.0.2. Tengo un formulario que tiene grupos de campos que corresponden a filas en una base de datos. Los nombres de los campos están en el formato:CodeIgniter: Validar formulario con datos POST multidimensionales

opt[0][foo] 
opt[0][bar] 
opt[1][foo] 
opt[1][bar] 
etc... 

El índice (1,2, etc ...) no corresponde a la fila identificadores en la base de datos, que es simplemente una manera de dividir los grupos de campos. Puede haber lagunas en el índice ya que los usuarios pueden agregar y eliminar un número arbitrario de los grupos de campo. Todos los grupos son idénticos, es decir, contienen exactamente el mismo conjunto de campos con los mismos nombres de segundo nivel.

Quiero ser capaz de utilizar la biblioteca de validación de CodeIgniter para validar el formulario y (p) volver a llenar según sea necesario. He encontrado un montón de publicaciones (además de la excelente guía de usuario de CI) sobre cómo poblar previamente y sé cómo trabajar con la repoblación en general. Sin embargo, esta es la primera vez que tengo que probar con los nombres de los campos indexados como se indicó anteriormente. He intentado el siguiente y no funciona:

array(
    'field' => 'opt[][foo]', 
    'label' => 'Foo', 
    'rules' => 'required' 
) 

supongo que sólo que esperaba demasiado y CodeIgniter no apoya lo que necesito que haga. La ampliación de la biblioteca de validación de formularios existente es una opción, por lo que si alguien ha estado en la misma situación y puede proporcionar algunos consejos que serían muy bienvenidos.

ACTUALIZACIÓN:

Sólo un poco de información adicional, también he intentado validar un campo específicamente indexado (véase más adelante) y que también no funcionaba ... Tengo entendido que la validación multidimensional debe trabajar en el caso específico:

array(
    'field' => 'opt[0][foo]', 
    'label' => 'Foo', 
    'rules' => 'required' 
) 

Respuesta

0

debería echar un vistazo a la callback functions para la clase de validación - esto debería ayudar a lograr lo que necesita para su validación.

+0

Las funciones de devolución de llamada no son el problema aquí. Los nombres de campo son el problema. – Endophage

2

El siguiente código de controlador funciona para mí en el IC 2.0.2

public function test() { 

     $this->load->library('form_validation'); 
     $this->load->helper('form'); 

     $this->form_validation->set_rules('test[test1][test2]', 'Test', 'required|valid_email'); 

     $this->form_validation->run(); 

     echo validation_errors(); 

     echo form_open($this->uri->uri_string()); 
     echo form_input('test[test1][test2]', set_value('test[test1][test2]')); 
     echo form_submit(); 
     echo form_close(); 

    } 
+0

¡De hecho lo hace! Trabajar con matrices también, recuerdo haber tenido problemas con esto en el pasado, tal vez hubo una actualización en 2.0 que lo solucionó. ¿O estoy incorrecto y esto nunca fue un problema? –

+0

Por favor, vuelva a leer la pregunta. Hay una cantidad arbitraria de elementos de primer nivel en la matriz POST. es decir, podría hacer la prueba [0-5] o podría tener la prueba [0-50]. Supongo que podría establecer las reglas en un bucle, pero esa es una solución realmente fea y prefiero resumirlas en un archivo de configuración. – Endophage

+0

Además, pruébelo nuevamente con un índice numérico, por lo tanto 'prueba [0] [prueba2]' ya que ese es mi formato de datos de devolución. Ese formato no funcionó para mí, como dije en la actualización. – Endophage

1

Usted puede usar esto para recorrer los opt reglas de validación de variables y establecer para cada entrada.

if(!empty($opt)) 
    { 
     foreach($opt as $id => $value) 
     { 
      $this->form_validation->set_rules('opt[' . $id . '][foo]', 'Foo', 'required'); 
      $this->form_validation->set_rules('opt[' . $id . '][bar]', 'Bar', 'required'); 
     } 
    } 
Cuestiones relacionadas