2009-12-29 16 views
6

Tengo una forma que requiere que el usuario introduzca información. Si no completan los campos obligatorios, se vuelven a presentar con el formulario; la parte superior de la página para notificarles qué campos son necesarios y he habilitado formularios adhesivos (set_value()) para que no se pierda su entrada.CodeIgniter - repoblar forma en la validación fallida después de presentar

estoy usando flashdata para mostrar mensajes al usuario (es decir, si lo que han entrado ya existe en la base de datos).

Mi forma está en el método del índice de mi controlador. Cuando se hace clic en Enviar desde mi vista, llama al método add() en mi controlador. El método add() realiza la validación y, según los resultados, se envía a la base de datos o se reanuda para obtener más datos.

que tienen varios problemas con la forma en que lo he hecho. 1. Si la validación falla, estoy usando $ this-> index() para volver a mi formulario y mostrar los errores de validación. Si intento usar el redireccionamiento, pierdo mis errores de validación y mis datos $ _POST [] para que mis formularios adhesivos terminen en blanco. 2. El uso de $ this-> index() agrega el 'agregar' al final de mi url 3. El uso de $ this-> index() causa problemas con flashdata. Resultados aleatorios.

¿Alguna idea?

<?php 
class Restaurant extends Controller { 

    function Restaurant() { 
     parent::Controller(); 
    } 

    function index() { 

     // Load libraries and models 
     $this->load->model('/restaurant/mRestaurantTypes'); 
     $this->load->model('/restaurant/mRestaurant'); 
     $this->load->model('/utilities/mUtilities'); 

     // Get states 
     $stateSelect = array(); 
     $getStates = $this->mUtilities->getStates(); 

     if($getStates->num_rows() > 0) { 
      foreach($getStates->result() as $row) { 
       $stateSelect[$row->abbr] = $row->name; 
      } 
     } 


     // Get restaurant types 
     $restaurantTypes = array(); 
     $getRestaurantTypes = $this->mRestaurantTypes->getRestaurantTypes(); 

     if($getRestaurantTypes->num_rows() > 0) { 
      foreach($getRestaurantTypes->result() as $row) { 
       $restaurantTypes[$row->restaurant_types_id] = $row->type; 
      } 
     } 

     // Create form elements 
     $data['name'] = array(
      'name'  => 'name', 
      'id'  => 'name', 
      'value'  => set_value('name'), 
      'maxlength' => '200', 
      'size'  => '50' 
     ); 

     $data['address'] = array(
      'name'  => 'address', 
      'id'  => 'address', 
      'value'  => set_value('address'), 
      'maxlength' => '200', 
      'size'  => '50' 
     ); 

     $data['city'] = array(
      'name'  => 'city', 
      'id'  => 'city', 
      'value'  => set_value('city'), 
      'maxlength' => '50', 
      'size'  => '25'   
     ); 

     $data['state'] = $stateSelect; 

     $data['zip'] = array(
      'name'  => 'zip', 
      'id'  => 'zip', 
      'value'  => set_value('zip'), 
      'maxlength' => '10', 
      'size'  => '10'  
     ); 

     $data['phone'] = array(
      'name'  => 'phone', 
      'id'  => 'phone', 
      'value'  => set_value('phone'), 
      'maxlength' => '15', 
      'size'  => '15'  
     ); 

     $data['url'] = array(
      'name'  => 'url', 
      'id'  => 'url', 
      'value'  => set_value('url'), 
      'maxlength' => '255', 
      'size'  => '50'  
     ); 

     $data['type'] = $restaurantTypes; 

     $data['tags'] = array(
      'name'  => 'tags', 
      'id'  => 'tags', 
      'value'  => set_value('tags'), 
      'maxlength' => '255', 
      'size'  => '50'  
     ); 

     $data['active'] = array(
      'name'  => 'active', 
      'id'  => 'active', 
      'value'  => 'Y', 
      'maxlength' => '1', 
      'size'  => '2' 
     ); 

     // Set page variables 
     $data_h['title'] = "Add new restaurant"; 

     // Load views 
     $this->load->view('/template/header', $data_h); 
     $this->load->view('/restaurant/index', $data); 
     $this->load->view('/template/footer');  

    } 


    /** 
    * Add the the new restaurant to the database. 
    */ 
    function add() { 

     // Load libraries and models 
     $this->load->library('form_validation'); 
     $this->load->model('/restaurant/mRestaurant'); 

     // Define validation rules 
     $this->form_validation->set_rules('name',  'Name',  'trim|required|max_length[255]|xss_clean'); 
     $this->form_validation->set_rules('address', 'Address', 'trim|required|max_length[100]|xss_clean'); 
     $this->form_validation->set_rules('city',  'City',  'trim|required|max_length[128]|xss_clean'); 
     //$this->form_validation->set_rules('state',  'State', 'trim|required'); 
     $this->form_validation->set_rules('zip',  'Zip',  'trim|required|max_length[128]|xss_clean'); 
     $this->form_validation->set_rules('phone',  'Phone', 'trim|required|max_length[10]|xss_clean'); 
     $this->form_validation->set_rules('url',  'URL',  'trim|required|max_length[255]|xss_clean'); 
     $this->form_validation->set_rules('tags',  'Tags',  'trim|xss_clean'); 


     // Form validation 
     if ($this->form_validation->run() == FALSE) { 

      // On failure 
      $this->index(); 

     } else { 

      // On success, prepare the data 
      $data = array(
       'name'  => $_POST['name'], 
       'address' => $_POST['address'], 
       'city'  => $_POST['city'], 
       'state'  => $_POST['state'], 
       'zip'  => $_POST['zip'], 
       'phone'  => $_POST['phone'], 
       'url'  => $_POST['url'], 
       'type'  => $_POST['type'], 
       'tags'  => $_POST['tags'], 
       'active' => $_POST['active'], 
      ); 

      // Check if the restaurant already exists 
      $check = $this->mRestaurant->getRestaurant($data['name'], $data['zip']); 

      // If no records were returned add the new restaurant 
      if($check->num_rows() == 0) { 
       $query = $this->mRestaurant->addRestaurant($data); 

       if ($query) { 
        // On success 
        $this->session->set_flashdata('status', '<div class="success">Added New Restaurant!</div>'); 
       } else { 
        // On failure 
        $this->session->set_flashdata('status', '<div class="error">Could not add a new restaurant.</div>');  
       } 

       redirect('restaurant/confirm', 'refresh'); 
      } else { 
       // Notify the user that the restaurant already exists in the database 
       $this->session->set_flashdata('status', '<div class="notice">This restaurant already exists in the database.</div>'); 
       redirect('restaurant/index'); 
      } 

     } 

    } 


    function confirm() { 

     $data['title'] = "Confirm"; 

     $this->load->view('/template/header'); 
     $this->load->view('/restaurant/confirm', $data); 
     $this->load->view('/template/footer'); 
    } 
} 
?> 

Respuesta

2

voy a tratar de ayudar con la lógica en el controlador que siempre uso:

function index() 
{ 
    //set some default variables 
    $data['error_message'] = ''; 
    //if this is to edit existing value, load it here 
    // from database and assign to $data 
    //... 
    //set form validation rules 
    $validation = array(); 
    $validation['field_name'] = array(
    'field' => 'field_name', 
    'label' => 'Field label', 
    'rules' => 'trim|required' 
); 
    //more rules here 
    //... 
    $this->load->library('form_validation'); 
    $this->form_validation->set_rules($validation); 
    //run validation 
    if ($this->form_validation->run() == FALSE) 
    { 
    $data['error_message'] .= validation_errors(); 
    } 
    else 
    { 
    //do insert/update 
    // 
    //it's better to do redirection after receiving post request 
    //you can use flashdata for success message 
    if ($success) 
    { 
     $this->session_set_flashdata('success_message', MESSAGE_HERE); 
    } 
    redirect(RESULT_PAGE); 
    } 
    //reaching this block can have 2 meaning, direct page access, or not have valid form validation 
    //assign required variables, such as form dropdown option, etc 
    //... 
    //load view 
    $this->load->view(VIEW_FILE, $data); 
} 

Ver archivo:

... 
<?php if ($error_message): ?> 
    <?php echo $error_message; ?> 
<?php endif; ?> 
<?php echo form_open(current_url, array('id' => 'some_form_id')); ?> 
<!-- form field here --> 
<label for="field_name">Field label</label> 
<input name="field_name" value="<?php echo set_value('field_name', $DEFAULT_FIELD_NAME_IF_NEEDED); ?>" /> 
<!-- more form field here --> 
<?php echo form_close(); ?> 
... 

espero que esto le ayudará.

Para el $DEFAULT_FIELD_NAME_IF_NEEDED en el archivo de vista, utilizo esto para pasar el valor predeterminado si esta página de formulario es para editar datos existentes de la base de datos. Puede cargar los datos en el controlador, luego pasarlos para ver el archivo y mostrarlo en el campo de formulario.

0

usted podría intentar que tiene la forma posterior al índice, y en el método de índice, hacer la validación si el formulario ha sido enviado. A continuación, represente la vista de índice (si hay errores) o agregue el restaurante y represente la vista de confirmación.

+0

Moví todo el código del método add() al índice(), luego intenté validar si el from se ha enviado: if (isset ($ _ POST ['add'])) {~~} Esto funciona la primera vez que se procesa el formulario; sin embargo, como $ _POST ['add'] está configurado, la próxima vez que el usuario pulse Agregar y las reglas de validación aún no se hayan cumplido, se repetirá. Me gustaría usar el método add() en lugar de agrupar todo el código en el índice. – mazer

+0

Creo que quieres que se repita hasta que todas las reglas de validación pasen, ¿verdad? Y puede mover toda su validación y agregar código a métodos privados o métodos de biblioteca y luego llamarlos desde el método de índice si lo desea. – Coomer

1

que tenía un problema similar y que terminé haciendo:

Mi forma es crear nuevo usuario, sino que debe obtener la idea.

if($this->form_validation->run() == FALSE) 
     { 
      $this->data['title'] = "Add User"; 
      $this->load->vars($this->data); 
      $this->load->view('head'); 
      $this->load->view('header'); 
      $this->load->view('admin/sidebar'); 
      $this->load->view('admin/add_user'); 
      $this->load->view('footer'); 
     } 

tan eficazmente en lugar de llamar nueva función que mostraba nueva vista desde la misma función. No es la mejor solución, pero funciona. También es posible que desee utilizar algo como esto para comprobar si el restaurante ya existe:

function _check_username($str) 
{ 
    $this->db->where('username', $str); 
    $query = $this->db->get('sm_users'); 

    if($query->num_rows() == 0) 
    { 
     return TRUE; 
    } 
    else 
    { 
     $this->form_validation->set_message('_check_username', "User '$str' already exists!"); 
     return FALSE; 
    } 
} 

Y uso la función de devolución de llamada de validación:

$this->form_validation->set_rules('userName','User Name','trim|required|min_length[3]|callback__check_username'); 
+0

Tuve el mismo problema, '$ this-> load-> library ('form_validation');' moví esta línea al '__constructor' y funciona –

2

------- ---- controlador ---

 
$data['post'] = $_POST; 
$this->load->view('view/view', $data); 

continuación, en su opinión

<input type="text" value="><?=$post['username'];?>" name="username">

Cuestiones relacionadas