#!/usr/bin/perl #↑サーバーに合わせて設定してください # #/////////////////////////////////////////////////////////// # # Hal Shopping Cart System(z(ip)shop_hal_proAG900W) # スクリプト名:detail.cgi(2006/08/23)(zipshop/zshop共用) # 本スクリプトはハル・ネットワークスが書いたものです。 # 本スクリプトについての質問は下記へお願いします。 # info@hal9800.com http://www.hal9800.com/ # -NOTE- # 2005/06/16 詳細ページ別窓/同一窓の選択ができるよう改良 # 2005/06/16 カゴの中の合計金額を表示するよう改良 # 2005/06/16 Customer Reviewに対応できるように改良 # 2006/01/18 関連商品で商品表示ON/OFF未対応を修正 # 2006/03/02 展示のON/OFFを○/×→1/0に変更 # 2006/03/02 画像を5枚まで表示 # 2006/03/20 カゴの中身を表示するように改良 # 2006/03/24 カゴの中身を操作できるようにする(W) # 2006/04/23 関連商品表示で画像が登録されていない商品に対処 # 2006/08/23 flockの使用法を変更 # 2006/09/22 タイトルバーに商品名を表示 # # 2007/08 クール便と重量をカート項目に追加 # #/////////////////////////////////////////////////////////// #---初期設定------------------------------------------------ #本スクリプト名を指定(通常はこのまま) $self = 'detail.cgi'; #jcode.plへのパスを指定(通常はこのまま) require '../common/jcode.pl'; #config.plへのパスを指定(通常はこのまま) require '../common/config.pl'; #library.plへのパスを指定(通常はこのまま) require '../common/library.pl'; #基本設定読み込み(変更しないで下さい) &config; #======================= #購入数の入力方法の設定 #======================= #手入力の場合は"m"プルダウンの場合は"p"としてください。 $kounyu="p"; #プルダウンで表示する数値は以下の配列で設定して下さい。 @pull=('1','2','3','4','5','6','7','8','9','10','20','30'); #=============== #在庫表示の設定 #=============== #在庫が基準値(管理→基本設定で変更可)より多いときの表示内容 #商品登録の際に「在庫表示」で指定した数値が以下の数値に #対応することになります。 #※画像も使用できます。 $stock[0]="kazu";#←この行は変更しないで下さい $stock[1]=""; $stock[2]="あり"; $stock[3]="〇"; $stock[4]="受注生産"; $stock[5]="受注発注"; $stock[6]="予\約受付中"; $stock[7]="入荷待ち"; $stock[8]="お問い合わせ下さい"; #在庫が基準値より少なくなったときの表示を数値以外の文字(記号) #や画像で表示したい場合は以下の変数($fzaiko)に設定して下さい。 #(行頭の「#」を取った行が有効になります。) #数値で表示する場合は空にして下さい。 #$fzaiko=''; #「残りわずか」と表示する場合は以下のようになります。 $fzaiko='残りわずか'; #画像で表示する場合は以下のようになります。 #$fzaiko=""; #在庫が0になったときの表示(※デフォルトは画像表示) #$soldout=""; #文字で表示させる場合は以下のようになります $soldout="販売開始までもうしばらくお待ちください"; #================= #画像サイズの設定 #================= #商品画像の横幅(画像のサイズに合わせて設定して下さい。最大250pxl) $pwidth='250'; #関連商品画像の横幅(最大140pxl) $kwidth='140'; #============= #基本色の設定 #============= $dark="#FF9933";#基本濃色 $light="#FFECDD";#基本薄色 $kagowaku="#BFD5EC";#カゴ枠色 $kagoback="#336699";#カゴ文字背景色 $more_dark="#336600";#最も濃色 #---初期設定ここまで---------------------------------------- #商品記録ファイルを設定 $cart_id = $ENV{'REMOTE_ADDR'}; $cart = "$cart_dir/$cart_id.cart"; if (! -e $cart){ open (CART, ">$cart"); close (CART); chmod 0777, $cart; } &decode; $mode = $in{'mode'}; $code = $in{'code'}; #商品をカゴに入れる $regist="$in{'regist'}"; $code="$in{'code'}"; $shohin="$in{'shohin'}"; $price="$in{'price'}"; $option1="$in{'option1'}"; $option2="$in{'option2'}"; $option3="$in{'option3'}"; $kazu="$in{'kazu'}"; #---2007/08 $coolbin="$in{'coolbin'}"; $jyuryo="$in{'jyuryo'}"; #商品を削除する $delete=$in{'delete'}; $del_code=$in{'del_code'}; $del_option1=$in{'del_option1'}; $del_option2=$in{'del_option2'}; $del_option3=$in{'del_option3'}; if($regist){&kazu_check; ®ist;} if($delete){&del_item($del_code,$del_option1,$del_option2,$del_option3);} open(CART,$cart) || &error("カートファイルが開けません"); @items=; close(CART); $count=@items; if($count==0){ $total='0'; $list.="カゴの中は空です\n"; }else{ foreach $item (@items){ ($_code,$_shohin,$_price,$_kazu,$_option1,$_option2,$_option3) = split (/<>/, $item); $d_option1=$_option1; @opt_data=split(/\*/,$d_option1); if ($opt_data[1]){ if($opt_data[1]=~/^\+/){ $opt_data[1]=~s/\+//g; $_price=$_price+$opt_data[1]; $d_option1="($opt_data[0])"; }else{ $_price=$opt_data[1]; $d_option1="($opt_data[0])"; } } $unit_subtotal=int($_price*$_kazu); $total=$total+$unit_subtotal; $disp_opt=""; if($d_option1){ if($_option2){ if($_option3){ $disp_opt="".$d_option1."".$_option2."".$_option3; }else{ $disp_opt="".$d_option1."".$_option2; } }else{ $disp_opt="".$d_option1; } } $list.="\n"; $list.="\n"; $list.="\n"; $list.="\n"; $list.="\n"; $list.="\n"; $list.="\n"; $list.="\n"; $list.="\n"; $list.="".$_shohin."×".$_kazu.$disp_opt."\n"; $list.="\n"; $list.="------------------\n"; } } while ($total =~ s/^([-+]?\d+)(\d{3})/$1,$2/){} #現在の時刻を取得 $time_now=time; #-------------------- # 商品データ読み込み #-------------------- @lines=(); open(DATA,"$datafile") || &error("$datafileを開けません"); flock(DATA,1); @lines = ; close(DATA); $exist=0; foreach $line (@lines){ ($e_code,$date,$categ,$subcateg,$shohin,$price,$zaiko,$note,$shohinpage,$picture1,$picture2,$picture3,$picture4,$picture5,$option1,$option2,$option3,$kanren,$zaiko_h,$new,$osusume,$note2,$disp,$cool,$omosa)=split(/,/,$line); if ($code eq $e_code && $disp eq '1'){$exist=1;last;} } # HTMLの出力を開始 &header("$k_message|$shohin"); &head_lines; if ($exist==0){¬_exist;} &show_detail; &foot_line; &footer; #---------------- # 詳細ページ表示 #---------------- sub show_detail{ $time_span=$time_now-$date; if($time_span < $del_new){ $new_mark=" "; }else{ $new_mark=""; } if ($new=="1"){ $new_mark=" "; }elsif($new=="2"){ $new_mark=""; } if ($osusume){ $osusume_mark=" "; }else{ $osusume_mark=""; } if ($cool eq "yes") { $cool_img=" "; }else{ $cool_img=""; } $jyuryo="総重量:$omosa Kg"; $tb_width = $pwidth +20; print <<"EOF"; EOF if($picture1){ print <<"EOF"; EOF }else{ print <<"EOF"; 準備中 EOF } if($picture2){ print <<"EOF"; EOF } if($picture3){ print <<"EOF"; EOF } if($picture4){ print <<"EOF"; EOF } if($picture5){ print <<"EOF"; EOF } print <<"EOF"; $osusume_mark$shohin $jyuryo$cool_img $note EOF $price2=$price; while ($price2 =~ s/^([-+]?\d+)(\d{3})/$1,$2/){} $op_flag=0; if($option1){ @option=split(/%/,$option1); print "$option[0]\n"; print "\n"; for ($j=1; $j<@option; $j++){ @opt_data=split(/\*/,$option[$j]); if ($opt_data[1]){ $op_flag=1; if($opt_data[1]=~/^\+/){ $kakaku_hyouji="$price2円"; }else{ $kakaku_hyouji='--'; } print "$opt_data[0]:$opt_data[1]円\n"; }else{ print "$option[$j]\n"; } } print "\n"; } if($option2){ @option=split(/%/,$option2); print "$option[0]\n"; print "\n"; for ($j=1; $j<@option; $j++){ print "$option[$j]\n"; } print "\n"; } if($option3){ @option=split(/%/,$option3); print "$option[0]\n"; print "\n"; for ($j=1; $j<@option; $j++){ print "$option[$j]\n"; } print "\n"; } if ($op_flag eq "1"){ $kakaku=$kakaku_hyouji; }else{ $kakaku="$price2円"; } #--価格の書式設定-- $kakaku = "$kakaku"; print <<"EOF"; 価格$kakaku EOF if ($zaiko_kanri eq "ON"){ if ($zaiko_h=='0'){ $zaiko_value="$zaiko"; }else{ $zaiko_value="$stock[$zaiko_h]"; } if (!$fzaiko){#変数名(fzaiko)を変えないとエラー $fstock=$zaiko; }else{ $fstock=$fzaiko; } if ($zaiko >$few){$zaiko2="$zaiko_value";} elsif ($zaiko >0){$zaiko2="$fstock";} elsif ($zaiko==0){$zaiko2="$soldout";} print <<"EOF"; 在庫状況$zaiko2 EOF } if ($zaiko_kanri eq "ON" && $zaiko=="0"){ ; }else{ print "";#数量/購入ボタン表示部 if ($kounyu eq "m"){ print <<"EOF"; 数量 EOF }else{ print <<"EOF"; 数量 EOF foreach $pull (@pull){ print "$pull"; } print ""; } print <<"EOF"; EOF } print <<"EOF"; EOF if($review){ print <<"EOF"; EOF } if ($target){ print <<"EOF"; EOF }else{ print <<"EOF"; EOF } print <<"EOF"; EOF #カゴ表示 print <<"EOF"; カゴの中 $list -合計:$total円- EOF #関連商品表示 if ($kanren){ print <<"EOF"; ≡関連商品のご紹介≡ EOF @item=split(/\*/,$kanren); $count=0; foreach $x (@item){ $exist2=0; foreach $line (@lines){ ($code,$date,$categ,$subcateg,$shohin,$price,$zaiko,$note,$shohinpage,$picture1,$picture2,$picture3,$picture4,$picture5,$option1,$option2,$option3,$kanren,$zaiko_h,$new,$osusume,$note2,$disp)=split(/,/,$line); if ($code eq $x and $disp eq '1'){$exist2=1;$count++;last;} } if ($exist2){ while ($price =~ s/^([-+]?\d+)(\d{3})/$1,$2/){} if ($shohinpage){#自作ページを使用する場合 print <<"EOF"; EOF if($picture1){ print <<"EOF"; EOF } print <<"EOF"; ■ $shohin \\$price EOF }else{#詳細ページ表示 print <<"EOF"; EOF if($picture1){ print <<"EOF"; EOF } print <<"EOF"; ■ $shohin \\$price EOF } } } if(!$count){ print <<"EOF"; -販売休止中です- EOF } } #関連商品表示ここまで print <<"EOF"; EOF } #-------------------- # 「該当なし」を表示 #-------------------- sub not_exist { print <<"EOF"; 該当商品はありません EOF &foot_line; &footer; exit; } #数チェック sub kazu_check{ if($kazu =~ /\D/ || $kazu== 0 ||$kazu eq "") { &error('0以外の半角数字を入力して下さい'); exit;} #在庫数チェックここから if($zaiko_kanri eq "ON"){ $flag=0; local(@items,$item); open(DATA,"$datafile") || &error("データファイルを開けません"); flock(DATA,1); @items = ; close(DATA); foreach $item (@items){ @data=split(/,/,$item); if($data[0] eq $code){ $flag=1; $zaiko=$data[6]; if($zaiko=='0'){&error($shohin."は売切れです");} elsif($zaiko<$kazu){&error($shohin."の在庫数が足りません。現在の在庫数は".$zaiko."です。");} last; } } if ($flag==0){&error("商品が登録されていません");} } #在庫数チェックここまで } #カゴに入れる sub regist { local(@lines); $order= "$code<>$shohin<>$price<>$kazu<>$option1<>$option2<>$option3<>$coolbin<>$jyuryo<>\n"; open (CART, "$cart") || &error("$cartを開けません1。一旦ブラウザーを閉じて、改めて買い物を始めてください。"); @lines = ; close (CART); if (@lines==0 ){ open (CART, ">>$cart") || &error("$cartを開けません2"); print CART "$order"; close (CART); }else{ $flag=0; foreach $line (@lines){ @reg=split(/<>/,$line); if ($code.$option1.$option2.$option3 eq $reg[0].$reg[4].$reg[5].$reg[6]){$flag=1;&change_list;last;} } if ($flag==0){ open (CART, ">>$cart") || &error("$cartを開けません3"); print CART "$order"; close (CART); } } } #数変更 sub change_list{ local(@lines); open(CART,$cart) || &error("$cartを開けません4"); @lines = ; close(CART); foreach $line (@lines){ @ch=split(/<>/,$line); if ($code.$option1.$option2.$option3 eq $ch[0].$ch[4].$ch[5].$ch[6]){ $line="$ch[0]<>$ch[1]<>$ch[2]<>$kazu<>$ch[4]<>$ch[5]<>$ch[6]<>$ch[7]<>$ch[8]<>\n"; push(@new,$line); }else{ push(@new,$line); } } open(CART,"+< $cart") || &error("$cartに書き込めません5"); truncate(CART,0); seek(CART,0,0); print CART @new; close(CART); } #商品削除 sub del_item{ local(@lines); local($code,$option1,$option2,$option3)=@_; open(CART,$cart) || &error("$cartを開けません6"); @lines = ; close(CART); foreach $line (@lines){ @dl=split(/<>/,$line); if ($code.$option1.$option2.$option3 ne $dl[0].$dl[4].$dl[5].$dl[6]){ push(@new,$line); } } open(CART,"+< $cart") || &error("$cartを開けません7"); truncate(CART,0); seek(CART,0,0); print CART @new; close(CART); }
$osusume_mark$shohin