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