EC-CUBEで以前
個別に商品に送料無料を設ける:EC-CUBE2.11.1
の記事で書いたやり方で個別に送料無料を設定した商品がカートの中に入ってるときに、
「現在カートの中に送料無料の商品が入ってます」
のような表記をカートの中に表示させる方法をメモ。

1.SC_CartSession.phpの編集

まず、data/class/SC_CartSession.php
の中に(function calculateの定義の下ぐらいがわかりやすいかも・・)

//送料無料商品の有無
function getSouryouFree($productTypeId) {
        $objDb = new SC_Helper_DB_Ex();
		$sFree = 0;
        if (OPTION_PRODUCT_DELIV_FEE == 1) {
            	$cartItems = $this->getCartList($productTypeId);				
		foreach ($cartItems as $item) {
			//送料無料商品があるとき
			if($item['productsClass']['deliv_fee'] == 1){
				$sFree = 1;
			}
		}
	}
	return $sFree;
}

と追加し、アップロードします。
※SC_CartSession.phpは簡単に言うとカートの情報を管理しているファイルです。(たぶん・・・)

2.「カートの中」phpファイルの編集

次に、カートの中のphpファイルを編集していきます。
EC-CUBEのデフォルトでは
カートの中にも

  • ・カートの中(サイドバー等に表示するブロック)
  • ・カートの中(ページ)

の2種類があると思いますが、今回は両方に
「現在カートの中に送料無料の商品が入ってます」
と表示させます。

まず、カートの中(サイドバー等に表示するブロック)
に表示させるには、
data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Cart.php

function lfGetCartData(&$objCart) {
        $arrCartKeys = $objCart->getKeys();
        foreach ($arrCartKeys as $cart_key) {
            // カート情報を取得
            $arrCartList = $objCart->getCartList($cart_key);
            // カート内の商品ID一覧を取得
            $arrAllProductID = $objCart->getAllProductID($cart_key);
            // 商品が1つ以上入っている場合には商品名称を取得
            if (count($arrCartList) > 0){

                foreach($arrCartList['productsClass'] as $key => $val){
                    $arrCartList[$key]['product_name'] = $val['name'];
                }
            }
            // 購入金額合計
            $products_total += $objCart->getAllProductsTotal($cart_key);
            // 合計数量
            $total_quantity += $objCart->getTotalQuantity($cart_key);

            // 送料無料チェック
            if (!$this->isMultiple && !$this->hasDownload) {
                $is_deliv_free = $objCart->isDelivFree($cart_key);
            }
        }

↑の部分を

function lfGetCartData(&$objCart) {
        $arrCartKeys = $objCart->getKeys();
        foreach ($arrCartKeys as $cart_key) {
            // カート情報を取得
            $arrCartList = $objCart->getCartList($cart_key);
            // カート内の商品ID一覧を取得
            $arrAllProductID = $objCart->getAllProductID($cart_key);
            // 商品が1つ以上入っている場合には商品名称を取得
            if (count($arrCartList) > 0){

                foreach($arrCartList['productsClass'] as $key => $val){
                    $arrCartList[$key]['product_name'] = $val['name'];
                }
            }
            // 購入金額合計
            $products_total += $objCart->getAllProductsTotal($cart_key);
            // 合計数量
            $total_quantity += $objCart->getTotalQuantity($cart_key);

            // 送料無料チェック
            if (!$this->isMultiple && !$this->hasDownload) {
                $is_deliv_free = $objCart->isDelivFree($cart_key);
            }
	// 送料無料商品の有無--追加
        $Muryou += $objCart->getSouryouFree($cart_key);
        }

のように
$Muryou += $objCart->getSouryouFree($cart_key);
を追加し、
さらにその下の

$arrCartList[0]['ProductsTotal'] = $products_total;
$arrCartList[0]['TotalQuantity'] = $total_quantity;

と書かれてる部分を

$arrCartList[0]['ProductsTotal'] = $products_total;
$arrCartList[0]['TotalQuantity'] = $total_quantity;
//追加
$arrCartList[0]['sFree'] = $Muryou;

のように
$arrCartList[0][‘sFree’] = $Muryou;
と追加しアップロードでOK

次に、カートの中(ページ)に表示させるための編集をします。
data/class/pages/cart/LC_Page_Cart.php

foreach ($this->cartKeys as $key) {
    // カート集計処理
    $this->tpl_message = $objCartSess->checkProducts($key);
    $this->tpl_total_inctax[$key] = $objCartSess->getAllProductsTotal($key);
    $this->tpl_total_tax[$key] = $objCartSess->getAllProductsTax($key);
    // ポイント合計
    $this->tpl_total_point[$key] = $objCartSess->getAllProductsPoint($key);

    $this->arrData[$key] = $objCartSess->calculate($key, $objCustomer);

    // 送料無料チェック
    $this->arrData[$key]['is_deliv_free'] = $objCartSess->isDelivFree($key);

    // 送料無料までの金額を計算
    $this->tpl_deliv_free[$key] = $this->arrInfo['free_rule'] - $this->tpl_total_inctax[$key];
}

の部分を

foreach ($this->cartKeys as $key) {
    // カート集計処理
    $this->tpl_message = $objCartSess->checkProducts($key);
    $this->tpl_total_inctax[$key] = $objCartSess->getAllProductsTotal($key);
    $this->tpl_total_tax[$key] = $objCartSess->getAllProductsTax($key);
    // ポイント合計
    $this->tpl_total_point[$key] = $objCartSess->getAllProductsPoint($key);

    $this->arrData[$key] = $objCartSess->calculate($key, $objCustomer);

    // 送料無料チェック
    $this->arrData[$key]['is_deliv_free'] = $objCartSess->isDelivFree($key);

    // 送料無料までの金額を計算
    $this->tpl_deliv_free[$key] = $this->arrInfo['free_rule'] - $this->tpl_total_inctax[$key];
			
// 送料無料商品の有無--追加
$this->arrData[$key]['muryou'] = $objCartSess->getSouryouFree($key);
}

のように
$this->arrData[$key][‘muryou’] = $objCartSess->getSouryouFree($key);
を追加しアップロードします。

3.テンプレートへの記述

あとは、表記させたい部分に
カートの中(サイドバー等に表示するブロック)の場合は
「管理画面」→「ブロック設定」→「かごの中」ブロック内に

<!--{if $arrCartList.0.sFree > 0}-->
送料無料商品があるときのメッセージ
<!--{else}-->
送料無料商品がないときのメッセージ
(ないときは表示させないならこの部分は削除OK)
<!--{/if}-->

と記述。

カートの中(ページ)の場合は
「管理画面」→「ページ詳細」→「かごの中」内に

<!--{if $arrData[$key].muryou > 0}-->
送料無料商品があるときのメッセージ
<!--{else}-->
送料無料商品がないときのメッセージ
(ないときは表示させないならこの部分は削除OK)
<!--{/if}-->

と記述すればOK。

※ちなみにスマートフォンとモバイルサイトの「かごの中(ページ)」に
表示させる場合も上記の記述でできます。

表示させる場所によっては
例えば「かごの中(ブロック)」の場合

<!--{if $arrCartList.0.TotalQuantity > 0 and $arrCartList.0.free_rule > 0 and !$isMultiple and !$hasDownload}-->
ここに上記ソース挿入
<!--{/if}-->

などで囲ってあげないと動かないです。