このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0272

CI_Cart

 「CI_Cart」ライブラリクラスは、ショッピングサイトの「カート」機能を提供します。
 商品をカートに追加したり、カート内の商品情報の更新・削除などが行えます。

CI_Cartの日本語対応

 残念ながら、CodeIgniterに備わっている「CI_Cart」クラスでは日本語の商品名が扱えません。 また、金額表示フォーマット機能もドル表記で「100.00」小数点が付いてしまいます。

 日本語の商品名に対応し、金額表示フォーマット機能で小数点が付かないようにするには、
下記のファイル「MY_Cart.php」をダウンロードして「application/libraries/」ディレクトリに配置してください。

CI_Session 設定

 「CI_Cart」クラスは、セッションを使います。セッションはPHPのSESSION機能を利用せず、 CodeIgniterの「CI_Session」クラスを利用しています。
 そのため、「CI_Session」クラスが利用できるように予め「application/config/config.php」設定ファイル にて設定が必要です。

  • application/config/config.php
  • $config['encryption_key'] = '160f7d5e--a249-7cc05d1d4697'; // 適当な文字列

     「CI_Cart」クラスを利用するのに最低限必要なセッション設定は上記のみですが、より詳細な設定は 「CI_Session」クラスの項を参照してください。

CI_Cartクラスのロード

 「CI_Loader」クラスの「library()」メソッドで「CI_Cart」クラスをロードします。

    $this->load->library('cart');

 「CI_Cart」クラスは、内部で「CI_Session」クラスをロードしています。そのため、 「CI_Cart」クラスをロードする際は、第二引数に、「CI_Session」のロード時に渡す設定情報を指定することができます。
 指定しなかった場合は、「application/config/config.php」の設定が適用されます。

    $this->load->library('cart', $sess_config);

カート内の商品情報

 「CI_Cart」は、連想配列データとしてショッピングカート内の商品を管理します。
 「CI_Cart」が管理する商品情報の項目は、商品ID、商品名、価格、数量です。その他オプション項目として 自由に商品情報を持つことができます。

  • 商品情報項目
  • 項目 説明 バリデーション
    id 商品ID 「.」ドット 「A-Za-z」英字 「0-9」数字
    「_」アンダースコア 「-」ハイフン
    name 商品名 「.」ドット 「A-Za-z」英字 「0-9」数字
    「_」アンダースコア 「-」ハイフン 「:」コロン
    price 価格 「0-9」数字
    qty 数量 「0-9」数字
    options オプション情報 連想配列
  • 商品データ 例:
  • array(
        'id' => 'A011',
        'name' => 'Item-Name',
        'price' => '1500',
        'qty' => '1',
        'options' => array( 'size' => 'large', 'color' => 'blue')
    )

 当然、ショッピングカートには複数の商品を保持することができます。
 「CI_Cart」は、上記の商品情報連想配列を「rowid」(一意のID)をインデックスキーとして、更に連想配列で管理しています。
 この「rowid」は「CI_Cart」によって、商品をカートに追加する際に「id」と「options」のデータから 自動で計算され、一意なIDとして作成されます。 つまり、同じ商品IDでもオプション情報(例えばサイズや色)が違えば、異なる「rowid」として管理されます。

  • カートデータ
  • array(
        '自動生成されたrowid' => ARRAY(商品情報),
        '自動生成されたrowid' => ARRAY(商品情報),
    )

CI_Cartの機能

insert($items = array()) 一番上に戻る

 商品情報をカートに追加します。
 また、複数の商品情報連想配列を配列データとして追加することもできます。

    $id = $this->input->post('id');
    $qty = $this->input->post('qty');

    $this->load->model('item_model');
    $name = $this->item_model->getName($id);
    $price = $this->item_model->getPrice($id);

    $item = array(
        'id' => $id,
        'qty' => $qty,
        'name' => $name,
        'price' => $price,
    );

    $this->load->library('cart');
    $this->cart->insert($item);
  • 複数の商品を追加
  • $items = array(
        array( 'id' => 'A011', 'name' => 'Item_A', 'qty' => '1', 'price' => '1000'),
        array( 'id' => 'B023', 'name' => 'Item_B', 'qty' => '2', 'price' => '1800')
    );
    $this->cart->insert($items);

update($items = array()) 一番上に戻る

 カート内の商品の数量を変更します。数量が0になると、その商品はカートから削除されます。
 引数には「rowid」(一意ID)と「qty」(数量)の連想配列または、その連想配列を複数もつ配列データになります。

  • 一つの商品情報の数量を更新
  • $item['rowid'] = $this->input->post('rowid');
    $item['qty'] = $this->input->post('qty');
    $this->cart->update($item);
  • 複数の商品情報の数量を更新
  • <input type="hidden" name="1[rowid]" value="836742c7d1f8785c06278d735bc35322" />
    <input type="text" name="1[qty]" value="1" />
    <input type="hidden" name="2[rowid]" value="0ba67b8dc556a62882c58ea410557846" />
    <input type="text" name="2[qty]" value="2" />
    $items = $this->input->post();
    /*
    print_r($items);
    Array(
      [1] => Array( [rowid] => 836742c7d1f8785c06278d735bc35322 [qty] => 1)
      [2] => Array( [rowid] => 0ba67b8dc556a62882c58ea410557846 [qty] => 2)
    )
    */

    $this->cart->update($items);

total() 一番上に戻る

 カート内商品の合計金額を返します。

    $items = array(
        array( 'id' => 'A011', 'name' => 'Item_A', 'qty' => '1', 'price' => '1000'),
        array( 'id' => 'B023', 'name' => 'Item_B', 'qty' => '2', 'price' => '1800')
    );
    $this->cart->insert($items);
    $total = $this->cart->total();
    echo $total;
    //=> 4600

total_items() 一番上に戻る

 カート内の商品数の合計数を返します。
 全ての商品の「qty」の合計となります。

    $items = array(
        array( 'id' => 'A011', 'name' => 'Item_A', 'qty' => '1', 'price' => '1000'),
        array( 'id' => 'B023', 'name' => 'Item_B', 'qty' => '2', 'price' => '1800')
    );
    $this->cart->insert($items);
    $total_qty = $this->cart->total_items();
    echo $total_qty;
    //=> 3

contents() 一番上に戻る

 カート内のすべての商品情報(連想配列)を配列で返します。

    $items = array(
        array( 'id' => 'A011', 'name' => 'Item_A', 'qty' => '1', 'price' => '1000'),
        array( 'id' => 'B023', 'name' => 'Item_B', 'qty' => '2', 'price' => '1800')
    );
    $this->cart->insert($items);
    $contents = $this->cart->contents();
    print_r $contents;
    /*
    Array (
        [836742c7d1f8785c06278d735bc35322] => Array (
             [rowid] => 836742c7d1f8785c06278d735bc35322
             [id] => A011
             [qty] => 1
             [name] => Item_A
             [price] => 1000
        )
        [0ba67b8dc556a62882c58ea410557846] => Array (
             [rowid] => 0ba67b8dc556a62882c58ea410557846
             [id] => B023
             [qty] => 2
             [name] => Item_B
             [price] => 1800
        )
    )
    */


has_options($rowid = '') 一番上に戻る

 商品がオプション情報を持っているか判定します。
 オプション情報がある場合は「TRUE」、無い場合は「FALSE」 を返します。

    foreach ($items as $rowid => $item) {
        if ($this->cart->has_options($rowid)) {
            // オプションの処理
        }
    }

product_options($rowid = '') 一番上に戻る

 商品連想配列からオプションの連想配列を返します。

    foreach ($items as $rowid => $item) {
        if ($this->cart->has_options($rowid)) {
            $option = $this->cart->product_options($rowid);
            // オプションの処理
        }
    }

format_number($n = '') 一番上に戻る

 引数に指定された数値を「千単位」で「,」を付けます。また、「.」の後に小数点2ケタを付けたフォーマットの数値を返します。

    $amount = $this->cart->format_number(15000);
    echo $amount;
    //=> 15,000.00

 当サイトが提供する「MY_Cart.php」日本語対応版では、 「application/config/config.php」の 「$config['language']」が「japanese」に設定してある場合、小数点が付かないフォーマットで返します。


destroy() 一番上に戻る

カート内の商品情報を全て削除します。

    $items = array(
        array( 'id' => 'A011', 'name' => 'Item_A', 'qty' => '1', 'price' => '1000'),
        array( 'id' => 'B023', 'name' => 'Item_B', 'qty' => '2', 'price' => '1800')
    );
    $this->cart->insert($items);
    $this->cart->destroy();
    $contents = $this->cart->contents();
    print_r $contents;
    /*
    Array ()
    */