カートの中身はSC_CartSessionで管理されているのですが、この作りが酷い。
見れば見るほど誰がこんな正気の沙汰ではない実装を行ったのか、というかどうしてこのような実装を行おうという発想に至ったのかが不思議でしょうがない。
例えばカートの中身を全部拾うメソッドを実装するとして、100人中99人が
とか書く思うのですが、EC-CUBEの場合は何故か2回ループが走ります。
具体的にはこんな。
これに限らず、カートに対して何か操作を行おうとするたびに
・毎回カートセッションの全要素に対してforeachでループを行い配列のキーの最大値を求める
・求めた値に対しforループを行い何かを行う
という流れになっています。
なんでこんなことになっているかというと、これは、カートセッションの作りが、
と、カート内商品と他の要素が並列になっているからです。
なので商品に対し何かを行いたい場合に直接扱えない状態になっています。
ってするだけで平穏無事に終わったはずなのに。
最初の設計が悪かったせいで後々まで苦労するといういい例ですね。いやよくないけど。
ところでこのSC_CartSession、メソッド中の'cart'の部分が全て$this->keyとなっており、引数を変えることで同時に複数のカートセッションを扱えるような作りになっています。
この部分だけは面白いのだが使い道がわからない。
EC-CUBEの記事
見れば見るほど誰がこんな正気の沙汰ではない実装を行ったのか、というかどうしてこのような実装を行おうという発想に至ったのかが不思議でしょうがない。
例えばカートの中身を全部拾うメソッドを実装するとして、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
トラックバック
トラックバックURL: