0

Codeigniter を使用して ajax ベースのショッピング カートを構築していますが、追加/削除機能は完全に機能します。複数のアイテムを追加するためのオプションを追加しようとしていますが、機能しません。

これが私が使用しているマークアップです。最適な設計かどうかはわかりませんが、ajax 以外の機能で動作しているので、問題ないはずです。

<form action="cart/add_multiple" method="post" accept-charset="utf-8">
<input type="hidden" name="items[0][id]" value="3571310" />
<input type="hidden" name="items[0][qty]" value="1" />
<input type="hidden" name="items[0][price]" value="59.00" />
<input type="hidden" name="items[0][name]" value="London" />
<input type="hidden" name="items[0][heb_name]" value="לונדון" />
<input type="hidden" name="items[0][full_price]" value="59.00" />
<input type="hidden" name="items[0][discount_price]" value="59.00" />

<input type="hidden" name="items[1][id]" value="7397903" />
<input type="hidden" name="items[1][qty]" value="1" />
<input type="hidden" name="items[1][price]" value="29.00" />
<input type="hidden" name="items[1][name]" value="London Triple" />
<input type="hidden" name="items[1][heb_name]" value="לונדון טריפל" />
<input type="hidden" name="items[1][full_price]" value="29.00" />
<input type="hidden" name="items[1][discount_price]" value="29.00" />
<input type="submit" name="add_multi" value="add to cart"  /></form>

ajax スクリプトは次のとおりです。

$(document).ready(function() {
$(document).on("submit", "div#winning_combo_small form", function () { //catches every click on the submit button of the "add to cart" form
    var items = $(this).serialize();

    alert(items);
    $.post(base_url + "cart/add_multiple", {items: items, ajax: '1' },
            function(data){
                if (data =='true')
                    { // Interact with returned data
                        $.get(base_url + "cart", function(cart){ // Get the contents of the url cart/show_cart
                        $("#cart_sidebar").html(cart);
                        })

                        $.get(base_url + "cart/count_items", function(items){
                            $("#cart_items").html(items);
                        })
                    }
                });
  return false;
})
});

add_multipleしかし、関数はデータを配列ではなく文字列として受け取るため、機能していません。データを配列に変換するには、何らかの方法でデータをデコードする必要がありますか? ヘブライ文字が邪魔をして、すべてを台無しにしますか?

ajax を使用せずに通常の方法でフォームを投稿すると、アイテムがカートに追加され、すべてが正常に機能します。では、通常の投稿と ajax 投稿の違いは何ですか?

4

1 に答える 1

0

それが最もエレガントな方法かどうかはわかりませんが、うまくいきました。

これが私がしたことです:

ajaxスクリプトでは、に変更var items = $(this).serialize();しましたvar items = $(this).serializeArray();。文字列の代わりに配列を取得しましたが、カートに挿入する必要のある形式ではありません。そこで、この配列をループして目的の形式の配列を作成し、その新しい配列を使用してカートに挿入しました。

これは、カートコントローラーの下にある私のadd_multiple関数です。

 function add_multiple()
{
    $items = $this->input->post('items');
    $ajax = $this->input->post('ajax');

    // Check if user has javascript enabled
    if($ajax != '1'){
        $this->cart->insert($items); //if posted the regular non-ajax way, the fields will be in an array in the correct format
        echo 'false';
        redirect('cart'); // If javascript is not enabled, reload the page with new data
    }else{

        $i = 0;
        foreach($items as $key=>$form_field)
        {
            $field_name = $form_field['name'];
            $from_char = strrpos($field_name, '[') +1 ;
            $length = strlen($field_name)-$from_char-1;
            $field = substr($field_name,$from_char,$length);

            $data[$i][$field] = $form_field['value'];
            if ($field == "discount_price") $i+=1; // I know 'discount price' is always the last field
        }

        $this->cart->insert($data);

        echo 'true'; // If javascript is enabled, return true, so the cart gets updated
    }
}
于 2013-02-21T14:28:36.663 に答える