#!/usr/bin/perl
#--NetShopOwner-CGI-version:4.2.5.5--
;#
;# goods_search.cgi
;# [PC]商品検索結果画面
;# Copyright (c) 2004- Increment P Corp. All rights reserved.
;#
;# 2009/09/30 NSO4対応
;# last modified 2010/06/30 DVC3対応
;#
use strict;
use uselib;
use defnsopath_shop;
use NsoVersionPC 1.00;
use NsoPage;
use NsoSearch;
use Design::NsoPagingBar;
use Lib::SiteStatus;
use Design::NsoSearchTable;
use Lib::DbConnect;
use DB::NsoGoodsVariationDB;
use DB::NsoStockDB;
# 20100630 Y.Motai start
use DB::NsoDetailUrl;
# 20100630 Y.Motai end
&ReadParse();
my %in = %main::in;
my %incfn = %main::incfn;
my %inct = %main::inct;
# インスタンス定義
my $objConfigSystem = Config::NsoSystem->newShop();
my $objConfigMaster = Config::NsoMaster->new();
# コンフィグレーションのキャッシュ
my %ConfigSystem = $objConfigSystem->cache_config();
my %ConfigMaster = $objConfigMaster->cache_config();
my $NsoMisc = NsoMisc->new();
my $NsoPage = NsoPage->new();
my $NsoSearch = NsoSearch->new();
# 20100630 Y.Motai start
my $DetailUrl = NsoDetailUrl->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster});
# 20100630 Y.Motai end
my $DbConnect = Lib::DbConnect->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster});
my $GoodsVariationDB = NsoGoodsVariationDB->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster});
my $NsoStockDB = NsoStockDB->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster });
my $status_err;
my $category_name;
FUNC:{
my $func = $in{func} || 'main';
my %function = (
main => \&main,
);
&check_closing();
if ($function{$func}){
$function{$func}->();
}else{
&main();
}
}
exit();
;#
;# 開店・閉店状態検査
;#
sub check_closing {
my $SiteStatus = Lib::SiteStatus->new({ ConfigSystem=>\%ConfigSystem });
$SiteStatus->CheckClosing({ IgnoreFlag=>1 });
}
;#
;# メイン処理
;#
sub main {
# 商品DB取得
my %GdsDB = &get_goods_db();
# テンプレート置換
&replace_tmpl(\%GdsDB);
}
;# 商品DBリファレンス取得
;#
sub get_goods_db {
# カテゴリID
my $CategoryID = $in{CategoryID};
# キーワード解析
my %HashKeyword = $NsoSearch->analyze_keyword($in{Keyword}, 'sjis');
my %HashPriceMin = $NsoSearch->analyze_keyword($in{PriceMin}, 'sjis');
my %HashPriceMax = $NsoSearch->analyze_keyword($in{PriceMax}, 'sjis');
my @Keywords = @{$HashKeyword{keywords}};
my $PriceMin = $in{PriceMin};
my $PriceMax = $in{PriceMax};
if ( $PriceMin =~ m/[^0-90123456789]/ig || $PriceMax =~ m/[^0-90123456789]/g){
$status_err = $status_err . "
" . "価格設定に不正がありました。" if($status_err ne "");
$status_err = "価格設定に不正がありました。" if($status_err eq "");
$PriceMin = "";
$PriceMax = "";
}
# 全角数字を半角数字に直す
$PriceMin = $NsoMisc->e_zenshan($PriceMin);
$PriceMax = $NsoMisc->e_zenshan($PriceMax);
# キーワード個数
my $Keycnt = @Keywords;
if ( ($ConfigSystem{SearchList}{pc}{KeyCount}) and $ConfigSystem{SearchList}{pc}{KeyCount} < $Keycnt ) {
$status_err = $status_err . "
" . "キーワード数が多すぎます。" if($status_err ne "");
$status_err = $status_err . "キーワード数が多すぎます。" if($status_err eq "");
return ( RecordCount => 0 );
return;
}
# 価格設定、キーワードが全ての未入力の場合には検索結果0件とする
if ( $PriceMin eq "" && $PriceMax eq "" && $Keycnt eq 0){
return ( RecordCount => 0 );
}
# DB接続
my $connectError = $DbConnect->DbConnect();
if ( $connectError ne "" ){
$status_err = $status_err . "
" . $connectError if($status_err ne "");
$status_err = $status_err . $connectError if($status_err eq "");
return ( RecordCount => 0 );
}
# キーワードのエスケープ&成形
my $i = 0;
foreach my $str (@Keywords){
# キーワード解析時にすでにsjisにデコードされているので、sjis→eucデコード
$str = $NsoMisc->j_decode_sjis2euc($str);
# \が入力された場合、エスケープ(\\)する
$str =~ s/\\/\\\\/g;
# すでにeucにデコードされているので、デコードなしエスケープ
$str = $DbConnect->Sql_Escape_non_decode($str);
# LIKE句のワイルドカードをエスケープ
$str =~ s/\%/\\\%/g;
$str =~ s/\_/\\\_/g;
# LIKE句で使用するため前後にワイルドカード付加
$str =~ s/^'/'%/g;
$str =~ s/'$/%'/g;
$Keywords[$i] = $str;
$i++;
}
# クエリ作成
my $SQL_query = $NsoSearch->make_searchQuery({ keywords=>\@Keywords, priceMin=>$PriceMin, priceMax=>$PriceMax, target=>0} );
# クエリ発行
my %db = $DbConnect->DbSelect($SQL_query);
# SQL 結果取得
my $RecordList = %db->{RecordList};
my $queryError = %db->{status_err};
if ( $queryError ne "" ){
$status_err = $status_err . "
" . $queryError if($status_err ne "");
$status_err = $status_err . $queryError if($status_err eq "");
return ( RecordCount => 0 );
}
my $RecordCount = scalar @$RecordList;
my $StartLine = 0;
my $EndLine = $RecordCount;
return (
RecordList => $RecordList,
RecordCount => $RecordCount,
);
}
;#
;# ページング情報取得
;#
sub get_paging_info {
my ($db) = @_;
my $RecordCount = $db->{RecordCount};
my $CategoryID = $in{CategoryID};
my $pn = ($in{pn} eq "" ? 0 : $in{pn});
my $sl = $ConfigSystem{SearchList}{pc}{SplitLine} || 20;
my %query_hash = (
Keyword => $NsoMisc->html_encode($in{Keyword}),
PriceMin => $NsoMisc->html_encode($in{PriceMin}),
PriceMax => $NsoMisc->html_encode($in{PriceMax}),
);
# 検索CGIのURL
my $GoodsSearchURL = $ConfigSystem{base_href}{cgishop}.$ConfigSystem{shop_script_name}{goods_search};
# SSL状況に応じてURLを置換する
$GoodsSearchURL = $NsoMisc->getChangedURL({url=>$GoodsSearchURL, key=>'OtherCgi'});
my %paging_args = (
sum => $RecordCount,
pn => $pn,
sl => $sl,
action => $GoodsSearchURL,
method => "get",
query => \%query_hash,
);
return $NsoPage->make_page_button(\%paging_args);
}
;#
;# ページングバー取得
;#
sub get_paging_bar {
my ($db) = @_;
my %paging = &get_paging_info($db);
my $NsoPagingBar = Design::NsoPagingBar->new({ ConfigSystem=>\%ConfigSystem });
return (
PagingBarUpper => $NsoPagingBar->GetPagingBar({ paging=>\%paging, key=>'GoodsSearch', kind=>'PagingBarUpper' }),
PagingBarLower => $NsoPagingBar->GetPagingBar({ paging=>\%paging, key=>'GoodsSearch', kind=>'PagingBarLower' }),
);
}
;#
;# テンプレート置換処理
;#
sub replace_tmpl {
my ($db) = @_;
my %paging = &get_paging_bar($db);
my $RecordList = $db->{RecordList};
my $RecordCount = $db->{RecordCount};
my $pn = ($in{pn} eq "" ? 0 : $in{pn});
my $sl = $ConfigSystem{SearchList}{pc}{SplitLine} || 20;
my $NsoSearchTable = Design::NsoSearchTable->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster});
my $system_templ_dir = $main::nsoDB_path ."/";
my $system_templ_kind = "templ";
my $system_templ_head = "goods_search_head.htmp";
my $system_templ_body1 = "goods_search_body1.htmp";
my $system_templ_body2 = "goods_search_body2.htmp";
my $system_templ_foot = "goods_search_foot.htmp";
my $contents_head;
my $contents_body1;
my $contents_body2;
my $contents_foot;
my %htmls = ();
$htmls{status_err} = "検索結果はありません " if ( $RecordCount == 0 );
$htmls{status_err} = $status_err if ( $status_err ne "" );
# システムテンプレート(ヘッタ部)置換
TemplHead:{
# テンプレート置換
my $NsoTempl = NsoTempl->new({ DataDir=>$system_templ_dir, DirKind=>$system_templ_kind, Data=>$system_templ_head });
my %Text = ();
# 検索内容の画面への設定
$Text{Keyword} = $in{Keyword};
$Text{PriceMin} = $in{PriceMin};
$Text{PriceMax} = $in{PriceMax};
my %replace_templ = (
htmls => \%htmls ,
Text => \%Text
);
$contents_head = $NsoTempl->replace_templ(\%replace_templ);
};
# システムテンプレート(フッタ部)置換
TemplFoot:{
# テンプレート置換
my $NsoTempl = NsoTempl->new({ DataDir=>$system_templ_dir, DirKind=>$system_templ_kind, Data=>$system_templ_foot });
my %replace_templ = ( paging => \%paging );
$contents_foot = $NsoTempl->replace_templ(\%replace_templ);
};
# 該当商品がない場合はヘッダ、フッタのみ出力し終了
if ( $RecordCount == 0 ) {
print $NsoMisc->print_header();
print $contents_head.$contents_foot;
return;
}
# システムテンプレート(ボディ部1)置換
TemplBody1:{
# テンプレート置換
my $NsoTempl = NsoTempl->new({ DataDir=>$system_templ_dir, DirKind=>$system_templ_kind, Data=>$system_templ_body1 });
my %replace_templ = ();
$contents_body1 = $NsoTempl->replace_templ(\%replace_templ);
};
# システムテンプレート(ボディ部2)置換
TemplBody2:{
my $i = -1;
foreach my $Record (@{$RecordList}){
$i++;
# 開始位置まで飛ばす
next if ( $i < $pn * $sl);
# 終了位置
last if ( $i > ($pn * $sl) + $sl - 1 );
my $cnt = 0;
my %RecordHash = (
ArticleID => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 01 商品ID
ArticleNo => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 02 商品番号
ArticleName => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 03 商品名
ArticleNameMobile => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 04 携帯用商品名
ProductTypeName => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 05 任意属性名
ProductName => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 06 任意属性値
LabeledPriceName => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 07 任意定価属性名
LabeledPrice => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 08 定価
ExTaxPrice => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 09 税別価格
InTaxPrice => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 10 税込価格
SalePriceName => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 11 任意売価属性名
CarriageType => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 12 送料区分
DeliveryTypeID => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 13 配送タイプ
ShareRate => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 14 重み付け
MaxOrderCount => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 15 1度の注文で購入できる数
ShowAdditionalIcon1 => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 16 アイコン表示フラグ1
ShowAdditionalIcon2 => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 17 アイコン表示フラグ2
ShowAdditionalIcon3 => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 18 アイコン表示フラグ3
ShowAdditionalIcon4 => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 19 アイコン表示フラグ4
VariationTypeName1 => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 20 バリエーション1項目名
VariationAvable1 => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 21 バリエーション1選択必須フラグ
VariationTypeName2 => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 22 バリエーション2項目名
VariationAvable2 => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 23 バリエーション2選択必須フラグ
VariationTypeName3 => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 24 バリエーション3項目名
VariationAvable3 => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 25 バリエーション3選択必須フラグ
VariationTypeName4 => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 26 バリエーション4項目名
VariationAvable4 => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 27 バリエーション4選択必須フラグ
KeywordAndDescription => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 28 検索用キーワードと紹介文
Show_PC => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 29 表示設定(PC)
Show_Mobile => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 30 表示設定(携帯)
Point => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 31 商品個別ポイント
SearchShow => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 32 商品検索対象
StockType => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 33 在庫管理タイプ
ExplanationMobile => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 34 携帯用説明文
ArticleCategoryID => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]), # 35 カテゴリID
);
# 在庫数を取得、レコードに追加
my $stock = $NsoStockDB->GetStockQuerySum($RecordHash{ArticleID});
if($stock eq ""){
# 在庫数無制限は-1を指定
$RecordHash{StockSum} = -1;
} else {
$RecordHash{StockSum} = $stock;
}
# バリエーションが設定されている商品の場合、ArticleVariationテーブル情報を取得
if ($RecordHash{VariationTypeName1} ne "" ||
$RecordHash{VariationTypeName2} ne "" ||
$RecordHash{VariationTypeName3} ne "" ||
$RecordHash{VariationTypeName4} ne ""){
my %resultArticleVariation = $GoodsVariationDB->GetArticleVariationAll($RecordHash{ArticleID});
my %resultArticleVariationHash = (
RecordList => $resultArticleVariation{RecordList},
RecordCount => $resultArticleVariation{RecordCount},
status_err => $resultArticleVariation{status_err},
);
# DBエラー時
if ($resultArticleVariationHash{status_err} ne ""){
# DBエラー設定
$htmls{status_err} = $resultArticleVariationHash{status_err};
# ヘッダ再作成
# テンプレート置換
my $NsoTempl = NsoTempl->new({ DataDir=>$system_templ_dir, DirKind=>$system_templ_kind, Data=>$system_templ_head });
my %Text = ();
# 検索内容の画面への設定
$Text{Keyword} = $in{Keyword};
$Text{PriceMin} = $in{PriceMin};
$Text{PriceMax} = $in{PriceMax};
my %replace_templ = (
htmls => \%htmls ,
Text => \%Text
);
$contents_head = $NsoTempl->replace_templ(\%replace_templ);
# ヘッダ、フッタを出力してエラー終了
print $NsoMisc->print_header();
print $contents_head.$contents_foot;
return;
}
# レコードハッシュにこの商品のバリエーション配列を追加
$RecordHash{VariationArray} = $resultArticleVariationHash{RecordList};
}
# 20100706 Y.Motai start
# 検索対象となった商品のIDからURLデータハッシュを取得する
my %UrlData = $DetailUrl->make_GetUrlQuery({ ArticleID => $RecordHash{ArticleID} });
my %resultUrlDataHash = (
RecordList => $UrlData{RecordList},
RecordCount => $UrlData{RecordCount},
status_err => $UrlData{status_err},
);
# DBエラー時
if ($resultUrlDataHash{status_err} ne ""){
# DBエラー設定
$htmls{status_err} = $resultUrlDataHash{status_err};
}
# 20100706 Y.Motai end
my %InfoHash = $NsoSearchTable->GetInfoByGoods(\%RecordHash);
my %Tag = %{$InfoHash{Tag}};
my %Text = %{$InfoHash{Text}};
# 20100712 Y.Motai start
# 商品詳細ページ用URLを置換対象に追加
$Text{URL} = $resultUrlDataHash{RecordList};
# 20100712 Y.Motai end
# テンプレート置換
my $NsoTempl = NsoTempl->new({ DataDir=>$system_templ_dir, DirKind=>$system_templ_kind, Data=>$system_templ_body2 });
my %replace_templ = (
Tag => \%Tag,
Text => \%Text,
);
# 20100701 Y.motai start
# URL設定の有無によってTag処理を行うため結合前に別変数に取得
my $contents_body2_sub = $NsoTempl->replace_templ(\%replace_templ);
# URLが存在しているならTagのみ削除、URLが存在していないならTagの中身をTagを含めて削除
if ( $resultUrlDataHash{RecordList} eq "" ) {
$contents_body2_sub =~ s/.*//s;
$contents_body2_sub =~ s/.*//s;
$contents_body2_sub =~ s/.*//s;
$contents_body2_sub =~ s/.*//s;
$contents_body2_sub =~ s/.*//s;
} else {
$contents_body2_sub =~ s///s;
$contents_body2_sub =~ s///s;
$contents_body2_sub =~ s///s;
$contents_body2_sub =~ s///s;
$contents_body2_sub =~ s///s;
$contents_body2_sub =~ s///s;
$contents_body2_sub =~ s///s;
$contents_body2_sub =~ s///s;
$contents_body2_sub =~ s///s;
$contents_body2_sub =~ s///s;
}
# 削除処理した文字列を連結
$contents_body2 .= $contents_body2_sub;
# $contents_body2 .= $NsoTempl->replace_templ(\%replace_templ);
# 20100701 Y.motai end
}
}
print $NsoMisc->print_header();
print $contents_head.$contents_body1.$contents_body2.$contents_foot;
}