2012-03-06 5 views
0

После тонких кодировок, я чувствую, что, наконец, я обволакиваю голову вокруг AJAX, JSON и CI.CI_model не правильно считывает данные POSTED JSON

Однако, я чувствую, что ударил одну последнюю загвоздка. Ниже мой код:

HTML

<div id="structures"> 
    <h1>Build</h1> 
    <form name="buildForm" id="buildForm" method="POST" action="<?php echo base_url(); ?>/ajax/index/"> 
     <select name="buildID" class="buildClass"> 
     <option value="0" selected="selected" data-skip="1">Build a Structure</option> 
<?php foreach ($structures as $structure_info): ?> 
    <option name='<?php echo $structure_info['str_name'] ?>' value='<?php echo $structure_info['str_id'] ?>' data-icon='<?php echo $structure_info['str_imageloc'] ?>' data-html-text='<?php echo $structure_info['str_name'] ?><i> 
     <?php echo $structure_info['timebuildmins'] ?> minutes<br><?php echo $structure_info['buy_gold'] ?> gold</i>'><?php echo $structure_info['str_name'] ?></option> 
<?php endforeach ?> 
     </select> 
     <div id="buildSubmit"> 
      <input id ="btnSubmit" class="button" type="submit" value="Submit"/> 
     </div> 
    </form> 
</div> 

Здесь я просто строю свою форму.

AJAX/JS

$(function(){ 
    $("#buildForm").click(function(e, buildID){ 
     e.preventDefault(); 
     var frm = $(document.buildForm); 
     var dat = JSON.stringify(frm.serializeArray()); 
     alert("I am about to POST this:\n\n" + dat); 
     $.post(
      frm.attr("action"), 
      dat,   
     function(response) 
     { 
      alert(response); 
     } 
    ); 
}); 
}); 

Модель Функция

Я создал новое расширение класса контроллера "Ajax" и функция "индекс" Это просто вызывает моя модель «insert_build. " Мое обходное решение - взять файл .js со страницы и сохранить его в заголовке.

В любом случае. Когда я нажимаю кнопку отправки, он успешно предупреждает о выходе JSON. Хотя после того, как он передается в модель controller->, он, похоже, никуда не улавливается. Я предполагаю, что делаю это неправильно, но не могу понять, что.

Спасибо за помощь.

+0

Не уверен, если это просто, как вы вставили его в SO, но «$ this-> вход-> пост (Дат)» должно быть «$ this-> вход-> сообщение ('dat') " – Tjkoopa

+0

Небольшой намек, который может помочь вам в будущем. Дайте console.log попробовать вместо предупреждений. Это просто делает вещи более элегантными;). –

ответ

1

Попробуйте парочку вещей здесь.

После var frm = $(document.buildForm); попытки предупреждения этого значение действия

alert(frm.attr("action")); 

, чтобы убедиться, что ваш $.post на самом деле получить правильный URL.

Затем попробуйте изменить функцию insert_build, чтобы распечатать только то, что она получает. Вы не должны звонить $this->input->post(dat);, потому что у вас не будет сообщение с именем dat.

public function insert_build() 
{ 
    print_r($_POST); 
} 

EDIT

Вам нужно передать строку JSON в качестве URL-адреса парам. Попробуйте

$.post(frm.attr("action"), {data:dat}, function(response) 
    { 
     alert(response); 
    }); 

, а затем изменить свой РНР

public function insert_build() 
{  
    $str_id = $this->input->post('data'); 
    print_r(json_decode($str_id)); 
} 
+0

Спасибо.Действие указывало на URL-адрес с двумя слэшами (//), хотя даже после исправления этой ошибки он все равно возвращает и пуст массив с «print_r ($ _ POST); –

+0

Я предположил, что это может иметь отношение к« стягиванию »в ajax. Когда я удалил это, представление вернуло значения, которые я искал. Любое объяснение, почему было бы очень полезно! Спасибо –

+0

@RickyMason проверить мои правки. –

1

почему бы не использовать $ .ajax?

$('#buildForm').live('click', function(event){ 
var data = $('form[name="buildForm"]').serialize(); 
    $.ajax({ 
     url:'<?php echo base_url(); ?>ajax', 
     data:data, 
     type:'post', 
     success:function(result){ 
      alert(result); 
     }, 
     error:function(result){ 
      alert(result); 
     } 
    }); 
}); 

надеюсь, что это помогает

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