CGI-BBS > SO−HO > ショッピングバスケット > バスケットv6:特定商品購入合計により送料無料に


カレッヂ
カレッヂ


質問者 片山  投稿日 2/3(月) 16:46:58
■改造したいこと■
v6をベースに
[小計が10000円以上の場合:送料無料] の改造はお陰様で出来ましたが、さらに
[ある特定商品の購入合計が、4000円以上の場合も:送料無料] にしたい、と考えております。

■改造プラン■
A)商品名(_gname) の語頭に判別文字を付け(例:*:)、その接頭文字商品は普通の会計
  とは別に、特別会計$FEE_SPECIAL を設定する
B)商品価格(_gfee) とは別にもうひとつ
  <input type="hidden" name="feexx" value="特別商品">を記述
  $FEE_SPECIAL += $feexx

以上どちらか設定した上で、
「すべての入力を確認する画面」の項、送料書出で
if ($in{'_area'} =~ /(.*):(.+)$/) { $area = $1; $soryo = $2; } のあとに
if ($SHOKEI >= 10000) { $soryo = 0; } ←これを追加
elseif ($FEE_SPECIAL >= 4000) { $soryo = 0; } ←これを追加

ここ数日やっと買った参考書を見つつ、A)は連想配列から特定の文字情報だけ抽出
することができるのか? と考えていたところ、数日前の重量によって送料変更の
やりとりを拝見、B)の方が素直かと考えています。今年になってCGI勉強中なので
的外れでしたら、恐縮です。ご指導よろしくお願いいたします。

プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:Mac9
エディタ:simpletext
FTPソフト:fetch
サーバ移転:していない
改造:していない
CGI習熟度:middle

回答者 呑兵衛@大阪  [削除]  投稿日 2/3(月) 21:56:06
動かしてみてだめならもう一度ご質問を。
> elseif ($FEE_SPECIAL >= 4000) { $soryo = 0; } ←これを追加
typo です。elsif
質問者 片山  [削除]  投稿日 2/5(水) 14:13:00
B)だと自分でも改造できそうと考えて、トライしましたが、うまく行きませんでした。
下記のような改造をしてみたのですが。$feexx が認識されていないのでしょうか。
いかがでしょうか?
----
商品価格(_gfee) とは別にもうひとつ
<input type="hidden" name="_gfeexx" value="特別商品の値段">を記述

sub mado と sub cfm で
($code,$name,$fee) = split(/\t/,$_,3); があるのでこれを
($code,$name,$fee,$feexx) = split(/\t/,$_,4); と変更し
$FEE_SPECIAL += $feexx としました。

sub input_to_cart で
$FEE_SPECIAL = $in{'_gfeexx'}*{in{'_kazu'}; としました。


「すべての入力を確認する画面」の項、送料書出で
if ($in{'_area'} =~ /(.*):(.+)$/) { $area = $1; $soryo = $2; } のあとに
if ($SHOKEI >= 10000) { $soryo = 0; } 
elsif ($FEE_SPECIAL >= 4000) { $soryo = 0; } ←この2行を追加
----
回答者 呑兵衛@大阪  [削除]  投稿日 2/5(水) 18:50:47
「特定**」を取り出す方法はいくつもあります。
<input type="hidden" name="_gfeexx" value="特別商品の値段">
よりも
<input type=hidden name="_gname" value="商品名_S">
とでもしておいて                              ^^
sub input_to_cart は触らず
sub mado と sub cfm で
foreach (@CARGO) {
($code,$name,$fee) = split(/\t/,$_,3);
if ($DELETED{$code}) { next; }
if ($name =~ /_S$/) { $name =~ s/_S$//g; $FEE_SPECIAL = $fee++; }
$SHOKEI += $fee; # 累計
($fee,$fee2) = &comma($fee);
で特別商品だけの値段、$FEE_SPECIAL、を取り出すことができます。
このとき $SHOKEI は買物総額自体変わりません。
質問者 片山  [削除]  投稿日 2/6(木) 19:11:37
あ〜、なるほど。ご教授いただいた式をリファレンス片手にその意味/仕掛けを
理解しようと頑張っております。どうもありがとうございます。

しかし、なぜか、うまく行かないのです。何度かチェックをくり返しているのですが。

sub mado と sub cfm で
if ($name =~ /_S$/) { $name =~ s/_S$//g; $FEE_SPECIAL = $fee++; }

それと、sub cfm で
if ($in{'_area'} =~ /(.*):(.+)$/) { $area = $1; $soryo = $2; } のあとに
if ($SHOKEI >= 10000) { $soryo = 0; } 
elsif ($FEE_SPECIAL >= 4000) { $soryo = 0; }

の3箇所だけ、今の所、追加しております。
ほんとにスミマセンが、よろしくお願いいたします。
回答者 呑兵衛@大阪  [削除]  投稿日 2/7(金) 00:53:06
Mistake! 申し訳ない!
if ($name =~ /_S$/) { $name =~ s/_S$//g; $FEE_SPECIAL = $fee++; }
は
if ($name =~ /_S$/) { $name =~ s/_S$//g; $FEE_SPECIAL += $fee; }
質問者 片山  [削除]  投稿日 2/13(木) 13:58:50
呑兵衛さま、ご回答ありがとうございました。
あれから、1週間あれこれと試行錯誤しましたが、依然としてうまく行かず、
ヒントが何かいただけないかと、また(しつこくてすみません)質問する次第です。

2/6 の質問のとおり、
オリジナル CART.CGI に3箇所追加
if ($name =~ /_S$/) { $name =~ s/_S$//g; $FEE_SPECIAL += $fee; } に変更


「_S」が末尾についた商品を4000円以上購入しても、送料0円にならない状態です。
どうしたもんでしょうか? お忙しいところ、恐縮ですが、ご指南お願いいたします。
回答者 呑兵衛@大阪  [削除]  投稿日 2/13(木) 17:19:54
期待通りになりませんでしたねぇ。カスタマイズ版でやってたので間違ってました。
/_S$/ の文字列のケツという $ が余計でした。
 
sub mado で
$SHOKEI += $fee; # 累計
$name =~ s/_S//g;
#表示だけなので

sub cfmで
$SHOKEI += $fee; # 累計
if ($name =~ /_S/) { $name =~ s/_S//g; $FEE_SPECIAL .= $fee; }
#_S のついたものに限定するため ラベル=if が必要

if ($in{'_area'} =~ /(.*):(\d+)$/) { $area = $1; $soryo = $2; }
if ($FEE_SPECIAL >= 5000) { $soryo = 0; }
質問者 片山  [削除]  投稿日 2/13(木) 19:27:24
完璧です!
永くおつきあい頂き、ありがとうございました。

頂いたこの数式をじっくりと吟味します。もっと勉強しなくては。

このページは終了したので返信(回答)は書きこめません
 


Web裏技