Проверка формы Ajax в codeigniter - PullRequest
9 голосов
/ 03 апреля 2011

черт возьми, ребята,

Я недавно работал над ajax, и у меня возникла проблема при использовании его с библиотекой проверки формы codeigniter. Я использовал пример, который инструмент генерирует в функции http://formtorch.geekhut.org/. Теперь ajax работает отлично и возвращает данные правильно, когда я использую функцию json_encode() с фиктивными данными, но при проверке в примере используется библиотека validation вместо библиотеки form_validation, которая кажется более старой версией.

Для этого проверка не работала с ajax в этом примере, в частности, функция $this->form_validation->run() заставляет ajax не возвращать результата, даже если я эхо-фальсифицирую данные, используя json_encode() в начале create_course().

Итак, что не так с проверкой с помощью ajax, и объясните мне, как данные, отправленные с помощью ajax, получены контроллером.

так вот мой код:

    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);
    }

и это функция 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;
* * 1 022});

Ответы [ 5 ]

7 голосов
/ 21 февраля 2012

Вместо того, чтобы печатать через "this-> form_validation-> xxxx_error", вы можете использовать метод Form Heler "form_error ()" для вызова сообщений об ошибках.

Так что вы можете сделать что-то вроде ..

$data = array(
                    'course_code' => form_error('course_code'), 
                    'name' => form_error('name')
            );
5 голосов
/ 01 мая 2013

Вы также можете установить заголовок выходного типа контента для данных JSON.

$this->output->set_content_type('application/json');
echo json_encode($data);
3 голосов
/ 06 апреля 2011

Какую версию Codeigniter вы используете?Помните ли вы, чтобы загрузить библиотеку проверки в вашу конструкцию?

$this->load->library('form_validation');
0 голосов
/ 01 августа 2015
****//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 голосов
/ 10 марта 2014

Если вы делаете запрос ajax, вы можете использовать validation_errors ().При запуске проверки будет заполнен массив сообщений об ошибках.

Вот пример:

// 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(),
  ));
} 

И затем на стороне клиента вы можете использовать ответ, подобный этому:*

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

Надеюсь, я помог, даже если я опоздал на 2 года.

PS Извините за мой сломанный английский.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...