AJAX не совмещается с контроллером Codeigniter - PullRequest
2 голосов
/ 31 декабря 2010

Я изучаю AJAX и позаимствовал скрипт из NETTUTS Codeigniter у Scratch: AJAX Сам сценарий работает идеально, как адаптированный к моей форме, однако он не обновляет базу данных для контроллера. Firebug говорит, что сообщение прошло хорошо из сценария AJAX. Наверное, мой вопрос: как и где мне не удается запустить контроллер?

Скрипт form_open

echo form_open('contacts/entry', $form);

Ajax-скрипт (выше того, что я показываю, есть скрипт проверки, который работает нормально)

 var form_data = {
    fname: $('#fname').val(),
    lname: $('#lname').val(),
    email: $('#email').val(),
    phone: $('#phone').val(),
    relate: $('#relate').val(),
    ajax: '1'
};

$.ajax({
    url: "<?php echo site_url('contacts/entry'); ?>",
    type: 'POST',
    data: 'form_data',
    success: function() {
        $('#status').text('Update successful!'); 
    }
});

return false;   

});

Обратите внимание, что я включил "AJAX: 1" в данные формы
Контроллер

function entry()
{
   if ($this->input->post('ajax')) {  
   $data = array
           (
           'fname' => $this->input->post('fname'),
           'lname' => $this->input->post('lname'),
           'email' => $this->input->post('email'),
           'phone' => $this->input->post('phone'),
           'relate' => $this->input->post('relate'),
           );

   //removed validation set rules to shorten the question

   if ($this->form_validation->run() == TRUE)
   {
    $this->db->insert('contacts', $data);   
    $this->index();    
   } else
   {
    $this->index();
   }       
} 
}

Является ли использование "if ($ this-> input-> post ('ajax'))" правильным способом для запуска контроллера? Без jquery форма отлично работает сама по себе и запускает контроллер. Итак, я знаю, что две отдельные части работают, они просто не связаны. Спасибо

Ответы [ 2 ]

5 голосов
/ 31 декабря 2010

Прежде всего я удалю var form_data { ajax: '1' } и использую что-то вроде этого:

if($this->input->server('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest')
{
    // This is AJAX
}
else {
    // This is standard HTTP
}

Хороший способ справиться с этим, если использовать MY_Controller.Если вы используете его, добавьте функцию, подобную этой:

protected function is_ajax() {
    return ($this->input->server('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest') ? TRUE : FALSE;
}

И вы можете использовать:

if($this->is_ajax())
{
    // This is AJAX
}
else {
    // This is HTTP
}

Затем вы должны отобразить результаты, чтобы передать их фактическому видусправиться с операцией.Например:

if ($this->form_validation->run() == TRUE)
{
    // Tip: you've to do the data management on MODELS
    $action = $this->db->insert('contacts', $data);

    // With this method you can handle AJAX and HTTP on the same
    // validation. If is AJAX you print, if not you redirect.
    if($this->is_ajax())
        echo $action;
    else {
        // if worked, redirect the user to the success 
        // else send it to the form error
        if($action)
            redirect("form_success");
        else
            redirect("form_error");
    }
else {
    if($this->is_ajax())
        echo false;
    else {
        $this->load->view("error_form");
    }
}

И вам нужно исправить код jQuery для обработки операции:

$.ajax({
    url: "<?php echo site_url('contacts/entry'); ?>",
    type: 'POST',
    data: form_data, // Like said jondavidjohn
    success: function(data) {
        if(data)
        {
            $('#status').text('Update successful!');
        } else {
            $('#status').text('Operation failed!');
        } 
    }
});
2 голосов
/ 31 декабря 2010

вы публикуете строку 'form_data' вместо переменной form_data, удалите кавычки вокруг form_data и повторите попытку.

$.ajax({
    url: "<?php echo site_url('contacts/entry'); ?>",
    type: 'POST',
    data: form_data,    // <-- previously you had data: 'form_data', which would pass the string 'form_data', not the variable.
    success: function() {
        $('#status').text('Update successful!'); 
    }
});

Я бы также повторил результат вашей операции с БД и затем использовал возвращенные данные, чтобы проверить, успешно ли завершена операция БД.

PHP / CI

...
echo $this->db->insert('contacts',$data);
...

JQuery / AJAX

...
success: function(data) {
    if(data) {
        //alert success
    }
    else {
        //alert failure
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...