モンスターカレンダー

« 2010年8月 »
12345678910111213141516171819202122232425262728293031

2010年8月アーカイブ

EC-CUBEで、特定商品を購入時は送料を無料にするロジックを組み込む。

参考:
EC-CUBEで送料無料
[EC- CUBE]商品に送料無料(込)のフラグを設ける

考え方は1番目のサイトの通り。
送料無料対象商品のフラグには、dtb_products の deliv_fee を利用する。(将来拡張予定のフィールドだが、本サイトでは個別送料設定はないだろうと思われるため)
(2番目のサイトは、フラグのフィールドを新たに設けるやり方)

管理画面のテンプレートは1番目のサイトの通りに変更。プログラム変更はナシ。(厳密には必須チェックしなければいけないが今回は見送り)

ソース変更は、1番目サイトのID登録が必要なようなのであきらめ、2番目のサイトのコードを参考に修正する。

●SC_Helper_DB_Ex.php

1.function sfTotalCart(&$objPage, $objCartSess, $arrInfo)

(1)add行追加。

        $objPage->tpl_total_pretax = 0;        // 費用合計(税込み)
        $objPage->tpl_total_tax = 0;        // 消費税合計
        if (USE_POINT === true) {
            $objPage->tpl_total_point = 0;        // ポイント合計
        }
        $objPage->tpl_postage_flag = 0;      // add:送料無料フラグ

(2)del行削除、add行追加。
        // 商品ごとの合計金額
        $objPage->arrProductsClass[$cnt]['total_pretax'] = $objCartSess->getProductTotal($arrInfo, $arrCart[$i]['id']);
               
        // 送料の合計を計算する
        //$objPage->tpl_total_deliv_fee+= ($arrData['deliv_fee'] * $arrCart[$i]['quantity']);  //del
        $objPage->tpl_total_deliv_fee = 0;  //add

        //送料無料フラグを判定する add
        if ($arrData['deliv_fee'] > 0) {    //1:送料込み=送料無料
            $objPage->tpl_postage_flag = 1;
        }

2.function sfTotalConfirm($arrData, &$objPage, &$objCartSess, $arrInfo, $objCustomer = "")

(1)del行削除
        //del
        // 商品ごとの送料が有効の場合
        /*if (OPTION_PRODUCT_DELIV_FEE == 1) {
            $arrData['deliv_fee']+= $objCartSess->getAllProductsDelivFee();
        }*/

(2)add行追加。
        // 送料無料条件が設定されている場合
        if($arrInfo['free_rule'] > 0) {
            // 小計が無料条件を超えている場合
            if($arrData['subtotal'] >= $arrInfo['free_rule']) {
                $arrData['deliv_fee'] = 0;
            }
        }

        //add
        // 送料無料商品が含まれている場合
        if ($objPage->tpl_postage_flag > 0) {
            $arrData['deliv_fee'] = 0;
        }


●ショップ画面
商品詳細画面と一覧画面で、deliv_fee == 1 で判定し、該当する場合は「この商品を購入の際は送料無料」のメッセージを表示する。
(カート画面、トップのオススメ一覧でも対応すればなおよし。今回は対象外)
サイトメンテナンス中は、メンテ中画面を単に表示しているだけだったが、ステータス503を返しておくのがよいとのこと。

メンテナンス中画面を出す正しい作法と.htaccessの書き方

.htaccessに以下のように書けばOK。

ErrorDocument 503 /maintenance.html

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule ^.*$ - [R=503,L]
</IfModule>

これは簡単。と適用してみると500エラーになってしまう。
エラーログには「RewriteRule: invalid HTTP response code for flag 'R'」と出ている。
調べてみると「RewriteRuleでR=503を指定するのは2.2系でしか使えない」だそうだ。上述のページのコメント欄に指摘があり、今回対象のサーバは使えないようだ...

メンテナンス画面を表示させる方法(Apache 1.3対応版)

上記の設定でようやくOK。

●503を返す503.phpを作成。
<?php
header ('HTTP/1.0 503 Service Temporarily Unavailable');
include(dirname(__FILE__) . '/index.html');
?>
●.htaccessの設定。

RewriteCond %{REQUEST_URI} !\.css$
RewriteCond %{REQUEST_URI} !\.js$
RewriteCond %{REQUEST_URI} !\.jpg$
RewriteCond %{REQUEST_URI} !\.gif$
RewriteCond %{REQUEST_URI} !\.png$
RewriteCond %{REQUEST_URI} !\.swf$
RewriteCond %{REMOTE_ADDR} !=192.168.0.1 #(管理者のIPアドレス)
RewriteCond %{REQUEST_FILENAME} !503.php
RewriteRule ^.*$ /maintenance/503.php [R,L]

ほんの10分で済む予定が1時間かかってしまいました。。