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

Back to archive index

Seiji Sogabe sogab****@alles*****
2005年 4月 13日 (水) 09:00:22 JST


こんにちは、曽我部です。

長文です。

反応がないようなので、とりあえず動くものを作ってみました。(2.1MS1j R6aベース)
たたくなり、煮るなりしてください。

仕様として、

 1. 商品のモデルにクールか常温か判別する文字列を入れる。
     クール便: XXXXX-C   常温: -Cがつかない
                    ^^
 2. 配送方法として計算表による料金(table.php)を使用
 3. クールと常温が混在していたら、エラーメッセージを出して、
    計算表による料金を使用不可にする
 4. '計算表による料金'の下に、'クール便'か'常温便'か表示する。
 4. クールと常温で、別の計算表をもつ。それ以外の設定は共有する。

といったようなものです。
常温便とクール便の送料を別々に計算することもできますが、
別々に表示する方法が思いつかなかったので、例Bに近いものにしました。

・メッセージを埋め込んでいる
・冗長

といったところがありますので、そのへんは修正が必要です。

添付しようと思いましたが、添付はあまり使われていないようなので、
長いですが、以下に記述します。メールをエクスポートでもしてテキストで
見たほうがいいと思います。


catalog/includes/classes/shopping_cart.phpと
catalog/includes/modules/shipping/table.phpをいじります。

shopping_cart.phpは以下のfunctionを適当な位置に追加します。

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

      reset($this->contents);

      $isCool = 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'];
          // Cool or Normal ?
          if (preg_match('/.+-C$/', $model)) {
            $isCool = TRUE;
          } else {
            $isNormal = TRUE;
          }
        }

      }

      if ($isCool && $isNormal) {
        return 'mixed';
      } elseif ($isCool) {
        return 'cool';
      } else {
        return 'normal';
      }

table.phpは、3箇所いじります。
まずは、quoteを差し替えるか、コメントに書いてある修正内容に従います。

    function quote($method = '') {
      global $order, $cart, $shipping_weight, $shipping_num_boxes;

/* Add Start */
      $delivery_temperature = $cart->get_delivery_temperature();

      $text = '';
      switch ($delivery_temperature) {
        case "normal":
          $table_cost = split("[:,]" , MODULE_SHIPPING_TABLE_COST_NORMAL);
          $text = '常温便';
          break;
        case "cool":
          $table_cost = split("[:,]" , MODULE_SHIPPING_TABLE_COST_COOL);
          $text = 'クール便';
          break;
        case "mixed":
        default:
          $this->quotes = array('id' => $this->code,
                                'module' => MODULE_SHIPPING_TABLE_TEXT_TITLE);
          $this->quotes['error'] = '混在しています。';
          return $this->quotes;
      }
/* Add End */

      if (MODULE_SHIPPING_TABLE_MODE == 'price') {
        $order_total = $cart->show_total();
      } else {
        $order_total = $shipping_weight;
      }

/* Delete Start
      $table_cost = split("[:,]" , MODULE_SHIPPING_TABLE_COST);
Delete End */
      $size = sizeof($table_cost);
      for ($i=0, $n=$size; $i<$n; $i+=2) {
        if ($order_total <= $table_cost[$i]) {
          $shipping = $table_cost[$i+1];
          break;
        }
      }

      if (MODULE_SHIPPING_TABLE_MODE == 'weight') {
        $shipping = $shipping * $shipping_num_boxes;
      }

      $this->quotes = array('id' => $this->code,
                            'module' => MODULE_SHIPPING_TABLE_TEXT_TITLE,
                            'methods' => array(array('id' => $this->code,
/* Delete Start
                                                     'title' => MODULE_SHIPPING_TABLE_TEXT_WAY,
Delete End */
/* Add Start */
                                                     'title' => $text,
/* Add End */
                                                     'cost' => $shipping +
MODULE_SHIPPING_TABLE_HANDLING)));

      if ($this->tax_class > 0) {
        $this->quotes['tax'] = tep_get_tax_rate($this->tax_class, $order->delivery['country']['id'],
$order->delivery['zone_id']);
      }

      if (tep_not_null($this->icon)) $this->quotes['icon'] = tep_image($this->icon, $this->title);

      return $this->quotes;
    }

2番目に、 install()に以下を追加します。

      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key,
configuration_value, configuration_description, configuration_group_id, sort_order, date_added)
values ('配送料金の計算表(常温)', 'MODULE_SHIPPING_TABLE_COST_NORMAL', '2500:850,5000:550,10000:0',
'購入金額に基づいた配送料金(常温)の設定. 例: 2500:850,5000:550, ... 2500 まで 850, 5000 まで 550,
...', '6', '0', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key,
configuration_value, configuration_description, configuration_group_id, sort_order, date_added)
values ('配送料金の計算表(クール)', 'MODULE_SHIPPING_TABLE_COST_COOL', '2500:950,5000:650,10000:0',
'購入金額に基づいた配送料金(クール)の設定. 例: 2500:950,5000:650, ... 2500 まで 950, 5000 まで 650,
...', '6', '0', now())");

もとの'MODULE_SHIPPING_TABLE_COST'はコメントアウトします。

3番目に、keys()を差し替えます。

    function keys() {
      return array('MODULE_SHIPPING_TABLE_STATUS', 'MODULE_SHIPPING_TABLE_COST_NORMAL',
'MODULE_SHIPPING_TABLE_COST_COOL', 'MODULE_SHIPPING_TABLE_MODE', 'MODULE_SHIPPING_TABLE_HANDLING',
'MODULE_SHIPPING_TABLE_TAX_CLASS', 'MODULE_SHIPPING_TABLE_ZONE', 'MODULE_SHIPPING_TABLE_SORT_ORDER');
    }

以上です。

Margy Mutoh wrote:
> こんにちは。Margyです。いつもお世話様になります。
> 
> さて、うちのショップでは、常温品とクール(冷蔵)品、クール(冷凍)品、
> 3種類の配送方法の商品があり、原則、配送温度の違う商品は一つの
> オーダーに混在させないようお願いしています。が、ユーザさんの側は
> なかなかこちらの思うようにはオーダーしてくれず、ヘタをすると3種が
> すべて一つのオーダーに入ってきます。
> すると、どれとどれを何便で、送料はいくら、という計算をし直さな
> ければならず、面倒です。
> これからクールが増える時期になり、なんとかしたいと思っています。
> 
> 送料は、常温かクールかの2通り(クールであれば、冷凍でも冷蔵でも
> 送料は同じ)です。
> できれば、常温とクールが混在した場合は、それぞれの送料が一度に
> 計算されるように(例A)なれば理想なのですが、大工事になるようなら
> (なりそうですね…(^_^;)、常温をベースに「○○は常温便では送れま
> せん。常温品とは別にご注文ください」といったコメントを出す(例B)
> だけでもありがたいのですが…。
> 
> (例A)
> 商品a(常温)…  1000円
> 商品b(常温)…  1000円
> 商品c(クール)…1000円
> 送料(常温)…    500円
> 送料(クール)…  900円
> ---------------------
> 合計           4400円  ←理想型
> 
> (例B)
> 商品a(常温)…  1000円
> 商品b(常温)…  1000円
> 送料(常温)…    500円
> ---------------------
> 合計           2500円
> 
> ※商品c常温便では…【以下略】  ←コメントを出す
> 
> 
> どなたか同様のケースをうまく処理なさっていらっしゃる方、ありま
> せんでしょうか。もしくは、何かいいアイデアがあればアドバイス
> いただけたらありがたいです。
> 
> よろしくお願いいたします。m(_ _)m
> 
> Margy Mutoh
> 
> 
> 
> _______________________________________________
> Tep-j-general mailing list
> Tep-j****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/tep-j-general
> 


-- 
sogab****@alles*****




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