[Tep-j-general] Re: 商品ごとに配送方法を限定するには? (長文)

Back to archive index

Margy Mutoh margy****@roseb*****
2005年 4月 16日 (土) 17:00:13 JST


曽我部さん、こんにちは。Margyです。(長文です。すみません)

ご報告遅くなりましたが、アドバイスいただいたコード、無事
動作確認しました。ありがとうございました。m(_ _)m
おかげさまで、だいぶやりたいことが見えてきまして、これを
参考にうちのショップに最適な解決方法を模索しておりました。
結局、

1)基本的には曽我部さんの案のように、常温/クール混在での
チェックアウトを許さない方向で、

2)配送モジュールで、ではなく、在庫数不足の警告のように、
「カートを見る」ページ(shopping.php)で警告を出す
(〜できればチェックアウトさせない)

…というスタイルが最善であろうという結論に至りました。

うちでは計算表による送料計算を採用していないので、送料モジ
ュールで対応するとすれば、現在使っている佐川急便モジュール
(をベースにした複数のモジュール)での改造が必要だったことが、
2)の最初の動機でしたが、それをやっている間に「さあチェック
アウトの段階で『別に注文しろ』と言われてチェックアウトでき
ないよりは、カートに入れた時点で警告が出るほうが、より親切
ではないか?」と思ったからです。

また、実際の運用を考えても、仮に最初の投稿で示した(例A)

> 商品a(常温)…  1000円
> 商品b(常温)…  1000円
> 商品c(クール)…1000円
> 送料(常温)…    500円
> 送料(クール)…  900円
> ---------------------
> 合計           4400円

のように常温送料とクール送料が合算で表示できたとしても、梱包の
段階で困ることになるケースも考えられます。
たとえば、下のような重量計算です。

(例1)

・1個口の最大重量20kg
・A(常温)…10個(15kg)
・B(冷凍)… 1個(0.5kg) …の場合

※ショッピングカートは「1個口」と計算するが、実際には常温と
冷凍の2個となる
※送料がそれぞれに計算されるため、実際には送料の変更はなく、
問題は起こらない

(例2)

・1個口の最大重量20kg
・A(常温)…10個(25kg)
・B(冷凍)… 1個(0.5kg) …の場合

※ショッピングカートは「2個口」と計算するが、実際には常温
2個口と冷凍1個口の3個となる
※送料が温度ごとに計算されれば「常温2+冷凍1」の送料計算と
なり3個で問題ないが、重量が温度にかかわらず合算されて2個
(常温1+冷凍1)の送料となった場合は、あとで送料を追加せねば
ならず、問題になる可能性がある
※無理に見積通り2個に収めようとすると、常温/クールの商品の
振り分けの判断に困る(物理的に不可能な場合もある)

そこで、開発途上でたいへんお恥ずかしいのですが、いまできた
ところまでを下に挙げました。(テスト段階なので、コメントも
じか書きです)
もっと効率のよい書き方ですとか、「ここでコレをやっちゃいけ
ない」という点などありましたら、ご指摘いただけたらたいへん
ありがたいです。m(_ _)m

----------------------------------------------------------------
●判定パターン
・常温(無印)/冷蔵(-C)/冷凍(-F) の3パターン

●動作パターン
・1点でも他と違う配送温度が混在していたら、その商品をカートに
入れてカートの中身が表示された時点で警告を表示する
※admin基本設定-ショップ情報の「商品の追加後にカートを表示」= true

◎TODO
・配送温度が混在している(mixed)場合、警告表示とともに、
shopping_cart.phpの「レジヘ」ボタンを隠し、header.phpの「レジヘ
進む」リンクを無効にして、配送選択ページへ進ませない
(もしくは、配送選択ページにはすべての配送方法を表示したうえで、
それぞれの配送方法に「この配送方法に適さない温度の商品が含まれ
ています」などの警告を出す)
・混在エラーが出た場合、在庫切れ商品のように、shopping_caret.php
で配送温度の違う商品に目印を表示する(どの商品がひっかかったかを
明確に提示するため)

以下、改造したコードです。

----------------------------------------------------------------
catalog/includes/class/shopping_cart.php
※末尾の } の直前に挿入

    /*
     * ショッピングカートにある商品のモデルをチェックし、
     * すべて常温の場合は、'normal'を
     * すべてクール(冷蔵)の場合は、'chilled'を
     * すべてクール(冷凍)の場合は、'frozen'を
     * 複数の温度が混在する場合は、'mixed'を返します。
     * 商品のモデルの最後に'-C'がつく場合は冷蔵、'-F'がつく場合は冷凍、
それ以外は常温とします。
     */

    function get_delivery_temperature() {

      reset($this->contents);

      $isChilled = FALSE;
      $isFrozen = FALSE;
      $isNormal = FALSE;

      while (list($products_id, ) = each($this->contents)) {
        $product_query = tep_db_query("select products_model from " .
TABLE_PRODUCTS . " where products_id='" . tep_get_prid($products_id) . "'");
        if ($product = tep_db_fetch_array($product_query)) {
          $model = $product['products_model'];
          // Chilled, Frozen or Normal ?
          if (preg_match('/.+-C$/', $model)) {
            $isChilled = TRUE;
          } elseif (preg_match('/.+-F$/', $model)) {
            $isFrozen = TRUE;
          } else {
            $isNormal = TRUE;
          }
        }
      }

      if ($isChilled && $isFrozen) {
        return 'mixed';
      } elseif ($isChilled && $isNormal) {
        return 'mixed';
      } elseif ($isFrozen && $isNormal) {
        return 'mixed';
      } elseif ($isChilled) {
        return 'chilled';
      } elseif ($isFrozen) {
        return 'frozen';
      } else {
        return 'normal';
      }
    }
----------------------------------------------------------------
catalog/shopping_cart.php
※108行目あたり…

        <td class="stockWarning" align="center"><br><?php echo
OUT_OF_STOCK_CANT_CHECKOUT; ?></td>
      </tr>
<?php
    }
   }
?>

…の直後に、以下を挿入

<?php
      $delivery_temperature = $cart->get_delivery_temperature();
      $text = '';
      switch ($delivery_temperature) {
        case "normal":
?>
      <tr>
        <td class="stockWarning" align="center"><br><?php echo '*** 現在
のカートの中身は、すべて常温便でお届けする商品です ***'; ?></td>
      </tr>
<?php
          break;
        case "chilled":
?>
      <tr>
        <td class="stockWarning" align="center"><br><?php echo '*** 現在
のカートの中身は、すべてクール(冷蔵)便でお届けする商品です ***'; ?></td>
      </tr>
<?php
          break;
        case "frozen":
?>
      <tr>
        <td class="stockWarning" align="center"><br><?php echo '*** 現在
のカートの中身は、すべてクール(冷凍)便でお届けする商品です ***'; ?></td>
      </tr>
<?php
          break;
        case "mixed":
?>
      <tr>
        <td class="stockWarning" align="center"><br><?php echo '<b>!!!
最後に入れた商品は配送温度(常温/冷蔵/冷凍)が違うため同梱できません
!!!<br>!!! 別々にオーダーいただけますようお願いいたします !!!</b>'; ?></td>
      </tr>
<?php
          break;
        case "default":
?>
<?php
      }
?>
----------------------------------------------------------------

上記TODOについては、また試行して、実現できたらご報告します。
よろしくお願いいたします。

Margy Mutoh






Tep-j-general メーリングリストの案内
Back to archive index