2011-04-03 18 views
9

chicos HELLP,validación de formularios Ajax en CodeIgniter

He estado trabajando en ajax recientemente, y tengo un problema en su uso con CodeIgniter biblioteca de formularios de validación. Usé el ejemplo que genera la herramienta en la función http://formtorch.geekhut.org/. Ahora, ajax funciona perfectamente y devuelve datos correctamente cuando uso la función json_encode() con datos ficticios, pero la validación en el ejemplo usa la biblioteca validation en lugar de la biblioteca form_validation, que parece ser una versión anterior.

Para ello, la validación no funcionó con el Ajax en ese ejemplo, específicamente $this->form_validation->run() función hace ajax volver sin ningún resultado, incluso si me hago eco de datos ficticios utilizando json_encode() en el comienzo de create_course().

así que qué hay de malo con la validación con ajax, y explíqueme cómo los datos enviados por ajax son recibidos por el controlador.

así que este es mi código:

function create_course() 
{ 
     $this->form_validation->set_rules('course_code', 'course_code', 'trim|xss_clean|required'); 
     $this->form_validation->set_rules('name', 'name', 'xss_clean|required'); 
     // .. etc   
     if ($this->form_validation->run()) {    
      // validation ok 
      $data['course_code'] = $this->form_validation->set_value('course_code'); 
      $data['name'] = $this->form_validation->set_value('name'); 
      // ... etc 
      if ($this->models_facade->create_course($user_id,$data)) { // success 
        $data = array('profile_change' => $this->lang->line('profile_change')); 
      } else {     // fail 
        $data = array('profile_change_error' => $this->lang->line('profile_change_error')); 
      } 
     } 
     else 
     { 
      $data = array(
        'course_code' => $this->form_validation->course_code_error, 
        'name' => $this->form_validation->name_error 
      ); 
     }   
     echo json_encode($data); 
    } 

y esta es la función de jQuery Ajax

   $(function(){ 
    $("#submit").click(function(){ 
     var course_code = $("#course_code").val(); 
     var name = $("#name").val(); 
     // etc   
     $.post("<?php echo base_url() ?>home/create_course", course_code:course_code, name:name}, 
    function(data){ 
     function(data){ 
      alert(data.data); 
      $("#course_code_error").html(data.course_code); 
      $("#name_error").html(data.name); 
     },'json'); 
    }); 
    return false; 

});

Respuesta

2

¿Qué versión de Codeigniter está utilizando? ¿Recuerdas cargar la biblioteca de validación en tu construcción?

$this->load->library('form_validation'); 
+0

'json' era el problema que debería ser "json" – Khaled

+0

su siempre algo pequeño :) – tylerpenney

7

En lugar de imprimir a través de "this-> form_validation-> xxxx_error" se puede utilizar el método asistente de formulario "form_error()" para llamar a los mensajes de error.

para que pueda hacer algo así ..

$data = array(
        'course_code' => form_error('course_code'), 
        'name' => form_error('name') 
      ); 
5

También podría considerar el establecimiento de la cabecera de tipo de contenido de salida para los datos JSON.

$this->output->set_content_type('application/json'); 
echo json_encode($data); 
+0

Este es un buen consejo. La configuración del tipo de contenido es importante para determinar cómo se maneja la información. – Manatax

0

Si está realizando una solicitud de AJAX, puede utilizar validation_errors(). Cuando se ejecuta la validación, se rellenará la matriz de mensajes de error.

Aquí un exemple:

// Set your rules 
$this->form_validation->set_rules('course_code', 'course_code', 'trim|xss_clean|required'); 
$this->form_validation->set_rules('name', 'name', 'xss_clean|required'); 

if ($this->form_validation->run()) { 
    //happy happy time 
} 
else { 
    //well now i'm sad... 

    //Important to turn that off if it's on 
    $this->output->enable_profiler(false); 

    $this->output->set_status_header('500'); 
    $this->output->set_content_type('application/json'); 

    echo json_encode(array(
     'error_msg' => validation_errors(), 
)); 
} 

Y luego en su lado del cliente puede utilizar la respuesta de esa manera:

error:function(data) { 
    $("your-error-input-selector").html('').append(data.responseJSON.msg); 
} 

Espero ayudado incluso si soy 2 año de retraso.

P.S Lo siento por mi inglés roto.

0
****//view-path [application/views/myviews/myview2.php]**** 

    <script src="<?php echo base_url('/jquery-1.9.1.min.js');?>"></script> 
<script> 
$(document).ready(function() { 

    $("#frm").on('submit',(function(e) { 
     e.preventDefault(); 
     $.ajax({ 
      url: $('#frm').attr('action'), 
      type: "POST", 
      data: new FormData(this), 
      contentType: false, 
      cache: false, 
      processData:false, 
      success: function(data){ 
        console.log(data); 
        data = JSON.parse(data); 
        if(data.st == 0) 
        { 
         $(".error-message").remove(); 
         var data1 = JSON.parse(data.msg); 
         $('form :input').each(function(){        
             var elementName = $(this).attr('name');   
             var message = data1[elementName]; 
             if(message){ 
             var element = $('<div>' + message + '</div>') 
                 .attr({ 
                  'class' : 'error-message' 
                 }) 
                 .css ({ 
                  display: 'none' 
                 }); 
             $(this).before(element); 
             $(element).fadeIn(); 
             } 
         }); 
        } 

        if(data.st == 1) 
        { 
         $('#validation-error').html(data.msg); 
         $(".error-message").remove(); 
        } 
      }, 
      error: function(){}    
     }); 
    })); 

}); 
</script> 
<style> 
.error-message{color:red;} 
</style> 
<?php echo form_open_multipart('ajaxcontroller/index', array('id'=>'frm')); ?> 

<div id="validation-error"></div> 

<h5>Username</h5> 
<input type="text" name="username" value="<?php echo set_value('username'); ?>" size="50" /> 

<h5>Password</h5> 
<input type="text" name="password" value="<?php echo set_value('password'); ?>" size="50" /> 

<h5>Password Confirm</h5> 
<input type="text" name="passconf" value="<?php echo set_value('passconf'); ?>" size="50" /> 

<h5>Email Address</h5> 
<input type="text" name="email" value="<?php echo set_value('email'); ?>" size="50" /> 

<h5>Profile Pic</h5> 
<input type="file" name="image[]" value="" multiple=""/> 

<div><input type="submit" value="Submit" /></div> 

</form> 

**//controller--[application/controllers/ajaxcontroller.php]**** 

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Ajaxcontroller extends CI_Controller { 

    function __construct() 
    { 
     parent::__construct(); 

    } 

    function index() 
    { 
     if($_POST) 
     {   
      $this->load->library('form_validation'); 
      $this->form_validation->set_rules('username', 'Username', 'required|min_length[5]|max_length[12]'); 
      $this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]'); 
      $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required'); 
      $this->form_validation->set_rules('email', 'Email', 'required|valid_email'); 

      if (empty($_FILES['image']['name'][0])) { 
       $this->form_validation->set_rules('image[]', 'File', 'required'); 
      } 

      if ($this->form_validation->run() == FALSE) 
      { 
       $errors = $this->form_validation->error_array(); //function in library : My_Form_validation    
       echo json_encode(array('st'=>0, 'msg' => json_encode($errors))); 
      } 
      else 
      { 

       $username = $this->input->post('username'); 
       $password = $this->input->post('password'); 
       $email = $this->input->post('email'); 

       if(is_array($_FILES)) { 
        foreach ($_FILES['image']['name'] as $name => $value){ 
         if(is_uploaded_file($_FILES['image']['tmp_name'][$name])) { 
          $sourcePath = $_FILES['image']['tmp_name'][$name]; 
          $targetPath = "images/".$_FILES['image']['name'][$name]; 
          if(move_uploaded_file($sourcePath,$targetPath)) { 

          } 
         } 
        } 
       } 

       echo json_encode(array('st'=>1, 'msg' => 'Successfully Submiited')); 
      } 
     } 
     else 
     { 
      $this->load->view('myviews/myview2'); 
     }  
    } 

} 

**//library file -- path will be [application/libraries/MY_Form_validation.php]** 
<?php 
/** 
* 
* Enter description here ... 
* @return CI_Controller 
*/ 
class MY_Form_validation extends CI_Form_validation 
{ 
    public function error_array() 
    { 
     return $this->_error_array; 
    } 
} 
+0

utilice la URL de jquery ya sea en línea o almacenada en su máquina cliente primero. –

+0

¡Gracias por tu respuesta! Incluya una explicación junto con el código para proporcionar la mejor respuesta. – kittykittybangbang

Cuestiones relacionadas