忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/03/29 19:57 |
EC-CUBE カートセッションの作り
カートの中身はSC_CartSessionで管理されているのですが、この作りが酷い。
見れば見るほど誰がこんな正気の沙汰ではない実装を行ったのか、というかどうしてこのような実装を行おうという発想に至ったのかが不思議でしょうがない。

例えばカートの中身を全部拾うメソッドを実装するとして、100人中99人が

1
2
3
    function getCartList(){
        return $_SESSION['cart']['products'];
    }

とか書く思うのですが、EC-CUBEの場合は何故か2回ループが走ります。
具体的にはこんな。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    function getCartList() {
        $max = $this->getMax();
        $arrRet = array();
        for($i = 0; $i <= $max; $i++) {
            if(isset($_SESSION['cart'][$i]['cart_no'])
               && $_SESSION['cart'][$i]['cart_no'] != "") {
                $arrRet[] = $_SESSION['cart'][$i];
            }
        }
        return $arrRet;
    }
    function getMax() {
        $cnt = 0;
        $pos = 0;
        $max = 0;
        if (count($_SESSION['cart']) > 0){
            foreach($_SESSION['cart'] as $key => $val) {
                if (is_numeric($key)) {
                    if($max < $key) {
                        $max = $key;
                    }
                }
            }
        }
        return ($max);
    }

これに限らず、カートに対して何か操作を行おうとするたびに
・毎回カートセッションの全要素に対してforeachでループを行い配列のキーの最大値を求める
・求めた値に対しforループを行い何かを行う
という流れになっています。

なんでこんなことになっているかというと、これは、カートセッションの作りが、

1
2
3
4
5
6
7
$_SESSION['cart']=array(
     'prev_url'=>戻り先URL
    ,'cancel_purchase'=>購入キャンセル
    ,[0]=>array(カート内の商品1)
    ,[1]=>array(カート内の商品2)
    ,…
);

と、カート内商品と他の要素が並列になっているからです。
なので商品に対し何かを行いたい場合に直接扱えない状態になっています。

1
2
3
4
5
6
7
8
9
$_SESSION['cart']=array(
     'prev_url'=>戻り先URL
    ,'cancel_purchase'=>購入キャンセル
    ,'products'=>array(
         [0]=>array(カート内の商品1)
        ,[1]=>array(カート内の商品2)
        ,…
    ));

ってするだけで平穏無事に終わったはずなのに。
最初の設計が悪かったせいで後々まで苦労するといういい例ですね。いやよくないけど。

ところでこのSC_CartSession、メソッド中の'cart'の部分が全て$this->keyとなっており、引数を変えることで同時に複数のカートセッションを扱えるような作りになっています。
この部分だけは面白いのだが使い道がわからない。


EC-CUBEの記事
PR


2010/04/13 01:26 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<==NOVEL PHILOSOMA== 10 | HOME | 買ったものリスト 2010/04/11>>
忍者ブログ[PR]