(2011.5.17に投稿文)
送料無料の商品A と 送料無料でない商品Bがある。また、送料は一律1000円とする。

この場合、以下の様な送料計算にしたい。

A)送料無料商品Aのみを買った場合(複数でも) → 送料無料
B)送料無料商品Aと送料無料でない商品B(複数でも)を買った場合 → 送料1000円
C)送料無料でない商品Bを買った場合(複数でも)ツꀀ→ 送料1000円

つまり、送料無料の商品のみの場合は送料無料。そこに送料無料でない商品Bを買った場合は、送料はちゃんと取る。というようなことをしたいのです。

2.11.1で、商品別送料の計算をonにした場合、どのパターンも商品別送料に+送料1000円が加算されます。

そこで以下のように変更しました。

data/class/SC_Cartsession.php のL.593あたりからです。

// 商品ごとの送料を加算
if (OPTION_PRODUCT_DELIV_FEE == 1) {
$cartItems = $this->getCartList($productTypeId);
$deliv_fee_cn = 0;
foreach ($cartItems as $item) {
if($item[‘productsClass’][‘deliv_fee’] != null){
$results[‘deliv_fee’] += $item[‘productsClass’][‘deliv_fee’] * $item[‘quantity’];
}else{
$deliv_fee_cn++;
}
}
}

// 配送業者の送料を加算
if (OPTION_DELIV_FEE == 1
&& $deliv_fee_cn != 0
&& !SC_Utils_Ex::isBlank($deliv_pref)
&& !SC_Utils_Ex::isBlank($deliv_id)) {
$results[‘deliv_fee’] += $objDb->sfGetDelivFee($deliv_pref, $deliv_id);
}

赤字を追加しました。

複数の場合どうなっているかは、ちゃんと調べていませんが・・・・・・。
1つでも、$item[‘productsClass’][‘deliv_fee’]がNULLの商品があった場合。つまり、商品個別送料が設定されていない商品があった場合は、通常の送料を追加するというような感じです。

送料無料になる上限の計算までは考えていませんが、送料無料になる上限になった場合は、商品個別送料も0円になるんではないかなぁ。

(追記)
ただし、これ、配送先複数の場合はこの計算をたどっているわけではないっぽい。
配送先複数のそれぞれにカートを設定してるんだと思い込んでたけど、そうじゃないみたいね。
配送先複数ってすごく使いたいんだけど、素人目に見てもちょっと使いにくい代物だなぁと思う。設定した配送先が増えていったら商品も増えるって仕様なのかな。便利なのか? 便利か? 間違えて配送先いれたから、入れなおしたとかいう想定が全くされていない気がするので、どうしたものかなぁと考え中。

「追加」じゃなくて「上書き」にするにはどうしたらいいかなぁとかそういうところがわからない自分の知識不足さに辟易。

(▼追記 2011.08.11)
そうこうしているうちに、2.11.2の修正ファイルが出て、「配送先複数」が使えるようになりました。
ただ、やはり「配送先別」に配送料金を設定しているわけではなさそう。
たとえば、

配送料1000円
5000円以上商品を買うと配送料無料という場合

Aさんに4800円分、Bさんに4800円分の商品を送りたい。

この場合、Aさんへの送料1000円とBさんへの送料1000円の合計2000円の送料が発生するはずなのだけども、合計で配送料をひっぱってくるので、合計9600円で5000円以上だから配送料は無料になってしまう。

これと同じく
送料込の商品A(つまり送料0円)と商品Bがある場合

Aさんに商品Aを
Bさんに商品Aと商品Bを
Cさんに商品Aと商品Bを送りたい場合、
(まぁ、送料5000円で無料は今のところ外しておいて)

Aさんの送料は0円、Bさんの送料は1000円、Cさんの送料は1000円  で合計2000円

なんだけど、全部一緒に考えるので 送料は1000円になってしまう。

つまり、配送先ごとに送料を計算してその合計を出すという仕組みではないということです。

eccube2.11 配送先毎に送料を加算。 (webmageさん、ありがとうございます!)を参考にして、以下のようにしてみました。

data/class/SC_Cartsession.php のL.585あたりの function calculat( の中、 $results[‘subtotal’] = $this->getAllProductsTotal($productTypeId); $results[‘deliv_fee’] = 0; の下に追加してください。

[php]
#####▽配送先が複数の場合の処理▽##### //add ▼start
if ( count($_SESSION[‘shipping’]) > 1 ){

//人数分の繰り返し
foreach ( $_SESSION[‘shipping’] as $deli) {

//配送先別の商品総額も初期化
$total_indiv = 0;#総額
$total_quantity = 0;#個数
$results[‘deliv_fee2’] = 0;

$temp_list = $deli[‘shipment_item’];

// 商品ごとの送料を加算//ここから下のしょりコピー
if (OPTION_PRODUCT_DELIV_FEE == 1) {
$cartItems = $temp_list;
$deliv_fee_cn = 0;//add

foreach ($cartItems as $item) {
if($item[‘productsClass’][‘deliv_fee’] != null){//add
$results[‘deliv_fee2’] += $item[‘productsClass’][‘deliv_fee’] * $item[‘quantity’];
}else{//add
$deliv_fee_cn++;//add
}//add

//配送先別の商品総額を計算
$total_indiv += $item[‘price’] * $item[‘quantity’];

//配送先別の商品個数を計算
$total_quantity += $item[‘quantity’];
}
}

// 配送業者の送料を加算
if (OPTION_DELIV_FEE == 1
$deliv_fee_cn != 0//add
!SC_Utils_Ex::isBlank($deli[‘shipping_pref’])
!SC_Utils_Ex::isBlank($deliv_id)) {
$results[‘deliv_fee2’] += $objDb->sfGetDelivFee($deli[‘shipping_pref’], $deliv_id);
}

// 送料無料チェック
//購入数量による送料無料チェック DELIV_FREE_AMOUNTはパラメータ設定から。この個数を超えると無料になるという設定
if (DELIV_FREE_AMOUNT > 0) {
if($total_quantity >= DELIV_FREE_AMOUNT) {
$results[‘deliv_fee2’] = 0;
}
}
//個別の購入金額が$arrInfo[‘free_rule’]円以上なら、送料無料
$arrInfo = $objDb->sfGetBasisData();
if ($arrInfo[‘free_rule’] > 0) {
if ( $total_indiv >= $arrInfo[‘free_rule’] ) { $results[‘deliv_fee2’] = 0; }
}

$results[‘deliv_fee’] += $results[‘deliv_fee2’];

}

}else{
###################################

#####▽通常の処理▽##### //add ▲end
[/php]

そして、 // 合計を計算 $results[‘total’] = $results[‘subtotal’]; $results[‘total’] += $results[‘deliv_fee’]; の上に、

[php]
} //########## add ##########
[/php]

を入れて、閉じる。です。
配送先が複数じゃなければ、else以下の普段の処理が実行されるというような感じです。
一応、○○円以上なら配送料無料とか、○個以上買ったら配送料無料とか、その辺の処理もできているつもり…。
というか、配送料無料の処理は、

if ($this->isDelivFree($productTypeId)) {
$results[‘deliv_fee’] = 0;
}

とか、うまく使ったらなんかいけそうな気がしたんだけど、そこまで読み込んでません。
なんか、おかしかったら、是非ご意見くださいませ 🙂

(再び追記▼ 2011.10.31)
2011.10.12あたりに出たバージョンアップや不具合修正のファイルの対象に、Cart_Session.phpも含まれていたので、上記の変更を当ててアップ。すると、うまく送料計算ができなくなった。

バージョンアップの修正に、

    * セッション中の商品情報データの調整。
     * productsClass項目から、不必要な項目を削除する。
という項目が追加されている(大体297行目あたり)
そこに、

function adjustSessionProductsClass(&$arrProductsClass) {
$arrNecessaryItems = array(
という記述がある。必要な項目のみ残しておくための「必要な項目」という部分にあたるのだろう。
そこに「’deliv_fee’ => true,」と追加すれば、プログラムは動くようになりました。
つまりこんな感じ

[php]
/**
* セッション中の商品情報データの調整。
* productsClass項目から、不必要な項目を削除する。
*/
function adjustSessionProductsClass(&$arrProductsClass) {
$arrNecessaryItems = array(
‘product_id’ => true,
‘product_class_id’ => true,
‘name’ => true,
‘price02’ => true,
‘point_rate’ => true,
‘main_list_image’ => true,
‘main_image’ => true,
‘product_code’ => true,
‘stock’ => true,
‘stock_unlimited’ => true,
‘sale_limit’ => true,
‘class_name1’ => true,
‘classcategory_name1’ => true,
‘class_name2’ => true,
‘classcategory_name2’ => true,
‘deliv_fee’ => true, //<-追加分
);
[/php]