2010-03-14 126 views
9

Estoy usando el formulario de CodeIgniter y la biblioteca de validación de formularios para compilar mis formularios. Tengo problemas para hacer el menú desplegable "fijo" y también encontrar las reglas de validación adecuadas.Validación del menú desplegable de formulario en CodeIgniter

Esta es la forma en que estoy poblando el drodown:

foreach($events as $event){ 
$options[$event->event_title] = $event->event_title; 
} 
$firstItem = '<option>Please select one...</option>'; 
echo form_dropdown('events', $options, '', $firstItem); 

Esta es la construcción de las opciones de eventos almacenados en la base de datos. El formulario se ve bien y está rellenando todos los campos correctamente.

Hwoever, cuando llego a enviar el formulario, ¿el menú desplegable no se mantiene en el valor seleccionado? Además, cómo debo validarlo, quiero hacerlo obligatorio, pero también quiero asegurarme de que no salvo la primera opción en el menú desplegable 'Seleccione uno ...'

Gracias de antemano.

Saludos, Gaz

Respuesta

8

haces esto en una vista? Voy a demostrar que tiene que manejar esto, pero todo sucede en un controlador:

// first, we can set a validation rule for the input 'country' (our dropdown), in this case it is required, and must be a natural number. You can look up more rules in the CI user guide, and you can write your own functions as well and add them to the 3rd parameter here. I believe some native PHP functions can be used as well. 
$this->form_validation->set_rules('country', 'Country', 'required|is_natural'); 

// the form is not valid! we'll enter this block whenever the form validation rules above are not met, as well as when first going to this controller-action. 
if ($this->form_validation->run() == FALSE) { 
    // buid your form, there's some CI functions to help with this that I'm using 
    $my_form = form_open('user/edit', 'class="superform"') 
     . form_fieldset() 
     . '<ol>' 
     . '<li>' 
     . form_label('Country<br/>', 'country') 
     // so here is the dropdown, matching the name given to the validation rule we've set, the second parameter takes an array, which I am grabbing from a model, the last parameter is the 'selected; value, which I am grabbing from some variable, if it's not present the first item in the dropdown will obviously be selected 
     . form_dropdown('country', $this->Country_model->get_countries_dropdown(), $user->country) 
. form_error('country', ' <em>', '</em>' 
     . form_submit('mysubmit', 'Save', 'class="button"') 
     . '</li>' 
     . '</ol>' 
     . form_fieldset_close() 
     . form_close() 
    ); 
    // sending the form variable to my view, where i will simply <?=$my_form?> it 
    $this->load->view('user_edit', $my_form); 
} else { 
    // form has validated! do something! 
} 

La función form_dropdown() toma una matriz que está configurado como: valores de clave => $ $ Cuando la llave en mi caso es una identificación de país, y el valor es el nombre de los países. Tengo el par '0' => 'NINGUNO' al comienzo de mi matriz de país, por lo que el usuario no puede elegir uno. Si quisiera hacer esto como tu situación, podría configurarlo en '-1' => 'Por favor selecciona ...' y no validaría, ya que -1 no es un número natural.

Espero que mis divagaciones ayuden!

Editar:

bien, así que antes de crear el menú desplegable con form_dropdown(), lo que querrá hacer es comprobar el valor seleccionado de la matriz procedente de la POST.

En el caso del CI, se puede utilizar el set_value función ($ entrada), así que en mi formulario de ejemplo que podría hacer algo como:

$selected = (!empty(set_value('country'))) ? set_value($country) : ''; 

form_dropdown('country', $this->Country_model->get_countries_dropdown(), $selected) 

Así que ahora se establecerá el valor seleccionado de la lista desplegable a lo que se seleccionó en la última publicación. Es posible que desee comprobar ese valor para asegurarse de que sea válido. Si no se seleccionó nada, puede establecer $ selected como algo así como el valor actualmente en la base de datos, o un valor predeterminado que haya elegido.

+0

Eso es grande - que funcionó bien ¿Pensarías que habría una mejor manera de hacerlo? Además, ¿alguna idea de cómo hacer que el menú desplegable sea "adhesivo"? – Gaz

+0

¿Quiere decir que, si el formulario fue enviado pero algo no validado, y desea que el menú desplegable tenga el mismo valor seleccionado? –

+0

Sí, eso es lo que quiero decir. Re: validación: CI parece tener una buena documentación para la validación de entrada básica, pero no tanto para los menús desplegables. Además, habría pensado que habría un alto porcentaje de desplegables que se rellenan a partir de los valores de la base de datos, por lo que set_select() se encargaría de eso, ¿no es así? – Gaz

4

En LINEAS:

echo form_dropdown('events', $options, '', $firstItem); 

sólo lo hacen:

echo form_dropdown('events', $options, set_value('events'), $firstItem); 
+2

Importante: para que set_value() funcione cuando se usa la biblioteca de validación de formularios, el campo ('eventos' en este ejemplo) debe ser parte de las reglas de validación. –

4

Personalmente, me gusta mucho la construcción de mi formulario en la vista en lugar de la mezcla de la presentación en el controlador. Pero esa es solo mi opinión. Entiendo que debo precargar los datos si se trata de una lista grande, pero no creo que realmente deba compilar todo el formulario solo para una lista desplegable. Tuve el mismo problema e hice una pequeña búsqueda de documentos para encontrar una buena solución.

para validar las opciones de selección
Todo lo hice por eso era proporcionar un método personalizado en la clase del controlador que se ve algo como esto

function select_validate($selectValue) 
{ 
    // 'none' is the first option and the text says something like "-Choose one-" 
    if($selectValue == 'none') 
    { 
     $this->form_validation->set_message('select_validate', 'Please pick one.'); 
     return false; 
    } 
    else // user picked something 
    { 
     return true; 
    } 
} 

En su índice() (o cualquier método que es el procesamiento los datos y cargar la vista) configura su código de validación para el menú desplegable.

$this->form_validation->set_rules('select', 'Select', 'callback_select_validate'); 

Es imperativo que escribir antes de la función personalizada con "callback_".

Mantenimiento de selección de usuario El mantenimiento de las opciones de selección también es super sencillo si utiliza lo que CI le ofrece. Solo necesita usar la función set_select() para cada opción en la lista de selección.

Digamos que tiene un menú desplegable con dos opciones para hacerlo más fácil. Esto es todo lo que haces.

<select name="select"> 
    <option value="none" <?php echo set_select('select', 'none', true);?> >- Select One -</option> 
    <option value="one" <?php echo set_select('select', 'one');?> >Option one</option> 
    <option value="two" <?php echo set_select('select', 'two');?> >Option two</option> 
</select> 

Lo bueno acerca del uso de esta función es que se preselecciona la primera opción "de prueba" y luego, si el usuario hace una selección, pero no otras validaciones, la selección será retenido y pre-seleccionados después de la forma se publica y solicita al usuario que corrija los otros errores.

De nuevo, esto puede no satisfacer a todos pero es una solución bastante directa para la validación desplegable con CodeIgniter.

+0

De acuerdo. Mucho más entusiasta de trabajar con mi html en el sitio web. A veces los ayudantes pueden limitar la experimentación y la limpieza del código. – ChristoKiwi

0

tenía el mismo problema y logró resolverlo:

  • javascript de validación utilizando la validación de Spry Javascript
  • función de devolución de
  • CodeIgniter en forma de clase de validación

Si es posible que tenga un código específico que puedo ayuda

1

Me encontré con este problema también, después de leer la publicación recomendada aquí, lo hice funcionar pero me molestó debido a el mensaje de validación que devuelve. Sin embargo, creo que he encontrado una mejor opción:

foreach($events as $event){ 
    $options[$event->event_title] = $event->event_title; 
} 

$firstItem[''] = 'Please select one...'; 

// I used array merge to ensure that my firstItem was infact my first item, 
// otherwise you could just do $options[''] = 'Please select one...'. 
// Array_unshift also does not allow you to specify the [''] array key we want 
$options = array_merge($firstItem, $options); 

$selected_option = $this->input->post('events', TRUE) ? $this->EE->input->post('events', TRUE) : ''; 

echo form_dropdown('events', $options, $selected_option); 

Luego, con la validación puede simplemente hacer:

$this->form_validation->set_rules('events', 'Events', 'required'); 

Entonces la validación devuelve el mensaje de lo normal 'required'

+0

¡Hurra! El truco aquí es establecer la clave de matriz en una cadena vacía, de modo que ese valor se valide como vacío. – lwitzel

Cuestiones relacionadas