2014-07-02 4 views
1

Я использую функцию CodeIgniter и jQuery .ajax для отправки данных с моего представления на контроллер и обновления моей базы данных. Вот проблема, я использую form_open() для генерации кода для моей формы, мне нужно использовать его, чтобы в моем контроллере я мог использовать библиотеку проверки формы. Библиотека проверки версий работает только в том случае, если вы используете метод POST. Но неважно, все это.CodeIgniter form_open helper via ajax

Если бы я использовал обычную кнопку отправки, чтобы отправить мою форму контроллеру, все будет работать нормально. Однако я не знаю, как использовать ajax в этом случае, что мне следует добавить в $.ajax({ url: ??? });Мне нужен ajax, чтобы отправлять данные контроллеру точно так же, как в моей форме будет обычная кнопка отправки. Я думаю, что в моем случае функция ajax не отправляет запрос контроллеру, как обычная кнопка отправки.

Вот моя форма (I опущен встроенных стилей и классов по назначению):

HTML

<div class="" style=""> 
    <h1 id="header" class="">Login/Register</h1> 
    <?php echo form_open('users/sportappregister', 'data-ajax="false"'); ?> 
     <div style=""><input id="email" type="text" name="email" value="email" style=""></div> 
     <div style=""><input id="pass" type="text" name="password" value="password" style=""></div> 
     <div style="" class=""><img class="" style="" src="<?php echo img_path(); ?>ikone/fb_login_icon.png" />Login with Facebook</div> 
     <div id="send" style="" class=""><input type="submit"> Submit </div> 
     <div id="cancel" style="" class=""> Cancel </div> 
    </form> 
</div> 

JQuery

document ready etc... 
$("#send").click(function() { 
    $.ajax({ 
       url: "/public/index.php/users/sportappregister", 
       type: "POST", 
       data: {email: $("#email").val(), password: $("#pass").val()}, 
       dataType: "text", 
       success: function(msg){$("#header").css({"color":"red"}).html(msg);} 
      }); 

Мне не нужно, чтобы показать вы, мой диспетчер, все работает нормально, проблема только здесь, на моей странице формы. Данные не отправляются на контроллер правильно.

+1

Я думаю, у вас есть проблема с URL-адресом. Вы можете использовать консоль своего браузера для отслеживания ошибки в запросе ajax. – assaqqaf

+0

Прежде всего, вы можете отправлять статические значения своему контроллеру и проверять, что это сообщение? – Suleman

+0

Возможно, некоторая аутентификация реализована контроллеру – Suleman

ответ

0

Я думаю, что ваша проблема связана с проверкой формы, а не только с AJAX. Если вы добавите SAME url в свой запрос AJAX, он закончится в том же месте (если вы явно не напишите специальное правило для перенаправления AJAX, но я думаю, что это не так).

Когда вы отправляете сообщение напрямую (обычный подарок), вы отправляете ВСЕ ВХОД ВНУТРИ ФОРМЫ. В вашем случае, я подозреваю, что вы пытаетесь избежать CSRF и, таким образом, вы установили в файле конфигурации (приложение/Config/config.php) csrf_protection:

$config['csrf_protection'] = true 

При использовании Form_Open, CI создает скрытый введите значение, которое он будет внутренне проверять, чтобы убедиться, что вы тот, кого вы действительно говорите. При отправке формы без AJAX вы отправляете вход, но в своем запросе AJAX вы его не отправляете, и, таким образом, при проверке значения, которое не выполняется, проверка не выполняется. О спрятанном входе: http://ellislab.com/codeigniter/user-guide/libraries/security.html

Чтобы решить вашу проблему, укажите в своей форме, в чем скрыт ввод, и добавьте его как var в свой файл данных $ .ajax.

Более подробную информацию о CSRF и как она работает с CI здесь: Codeigniter CSRF - how does it work

UPDATE:

От: http://jerel.co/blog/2012/03/a-simple-solution-to-codeigniter-csrf-protection-and-ajax

$(function($) { 

    // this bit needs to be loaded on every page where an ajax POST may happen 
    $.ajaxSetup({ 
     data: { 
      csrf_test_name: $.cookie('csrf_cookie_name') 
     } 
    }); 

    // now you can use plain old POST requests like always 
    $.post('site.com/controller/method', { name : 'Jerel' }); 

}); 

csrf_test_name и csrf_cookie_name должно быть имя вашего $config['csrf_token_name'] и $config['csrf_cookie_name'] набор в вашем файле конфигурации. Выводимые значения - это значения, установленные в файле по умолчанию.

+0

. Теперь я понимаю, хотя я не хочу использовать дополнительный плагин «cookie», что это такое в любом случае? Есть ли решение без этого плагина? Мне нужен только этот вызов ajax в одном месте. Я не хочу добавлять эти скрытые данные в свой ajax, как я могу проверить, что это такое? – LazyPeon

+0

Другими словами, я хочу проверить значение (cookie hash) этого «csrf_token_name», не используя какой-либо плагин cookie – LazyPeon

+0

Но автор утверждает, что «единственное, что нужно для этого - это jQuery и плагин Cookie». Я не могу найти .cookie в документации jQuery – LazyPeon

0

Я думаю, что ваш URL может иметь некоторую проблему, попробуйте следующее:

'url' : base_url + '/' + controller + '/test_add' 

где controller Ваше имя контроллера и test_add ваше имя метода/функции, которая находится в контроллере.

Смежные вопросы