バージョン選択

フォーラム

メニュー

オンライン状況

69 人のユーザが現在オンラインです。 (56 人のユーザが フォーラム を参照しています。)
登録ユーザ: 2
ゲスト: 67
tapioka3 abushaim もっと...

サイト内検索

質問 > フロント機能 > 商品検索項目の追加について

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
nksm
投稿日時: 2014/8/6 12:50
対応状況: −−−
半人前
登録日: 2012/4/25
居住地:
投稿: 24
商品検索項目の追加について
EC-CUBE 2.12.2
DBサーバー PostgreSQL 8.1.23
PHP 5.3.28

現在、構築中のサイトにて各商品に商品重量を設定し、
商品検索に重量別(○gまでの商品、○g〜○gまでの商品)での検索を
実現しようとしています。

2.11にて運用していた際はdata/class/pages/products/LC_Page_Products_List.phpの修正で
同様の仕様を実現出来たのですが、今回同じ改修を加え、
検索結果の表示までは確認出来たのですが、
検索結果数の表示が上手くいきません。(「全○商品中 ○〜○件表示」の部分)

改修した箇所は下記の通りです。

data/class/SC_Product.php

function findProductIdsOrder(&$objQuery, $arrVal = array()) {
$table = <<< __EOS__
dtb_products AS alldtl



function findProductIdsOrder(&$objQuery, $arrVal = array()) {
$table = <<< __EOS__
dtb_products AS alldtl
JOIN dtb_products_class AS T1
ON alldtl.product_id = T1.product_id


data/class/pages/products/LC_Page_Products_List.php

//表示条件の取得 に

'deliv_fee_min' => $this->arrForm['deliv_fee_min'],
'deliv_fee_max' => $this->arrForm['deliv_fee_max']

を追加

function lfGetSearchCondition を

function lfGetSearchCondition($arrSearchData) {
$searchCondition = array(
'where' => '',
'arrval' => array(),
'where_category' => '',
'arrvalCategory' => array()
);

// カテゴリからのWHERE文字列取得
if ($arrSearchData['category_id'] != 0) {
list($searchCondition['where_category'], $searchCondition['arrvalCategory']) = SC_Helper_DB_Ex::sfGetCatWhere($arrSearchData['category_id']);
}
// ▼対象商品IDの抽出
// 商品検索条件の作成(未削除、表示)
$searchCondition['where'] = 'alldtl.del_flg = 0 AND alldtl.status = 1 ';

if (strlen($searchCondition['where_category']) >= 1) {
$searchCondition['where'] .= ' AND EXISTS (SELECT * FROM dtb_product_categories WHERE ' . $searchCondition['where_category'] . ' AND product_id = alldtl.product_id)';
$searchCondition['arrval'] = array_merge($searchCondition['arrval'], $searchCondition['arrvalCategory']);
}

// 商品名をwhere文に
$name = $arrSearchData['name'];
$name = str_replace(',', '', $name);
// 全角スペースを半角スペースに変換
$name = str_replace(' ', ' ', $name);
// スペースでキーワードを分割
$names = preg_split('/ +/', $name);
// 分割したキーワードを一つずつwhere文に追加
foreach ($names as $val) {
if (strlen($val) > 0) {
$searchCondition['where'] .= ' AND ( alldtl.name ILIKE ? OR alldtl.comment3 ILIKE ?) ';
$searchCondition['arrval'][] = "%$val%";
$searchCondition['arrval'][] = "%$val%";
}
}

// メーカーらのWHERE文字列取得
if ($arrSearchData['maker_id']) {
$searchCondition['where'] .= ' AND alldtl.maker_id = ? ';
$searchCondition['arrval'][] = $arrSearchData['maker_id'];
}

$searchCondition['where_for_count'] = $searchCondition['where'];

// 重量検索
if ($arrSearchData['deliv_fee_min'] != 0 && $arrSearchData['deliv_fee_max'] != 0) {
$searchCondition['where'] .= ' AND T1.deliv_fee >= ? AND T1.deliv_fee <= ?';
$searchCondition['arrval'][] = $arrSearchData['deliv_fee_min'];
$searchCondition['arrval'][] = $arrSearchData['deliv_fee_max'];
} elseif ($arrSearchData['deliv_fee_min'] != 0 && $arrSearchData['deliv_fee_max'] == 0) {
$searchCondition['where'] .= ' AND T1.deliv_fee >= ?';
$searchCondition['arrval'][] = $arrSearchData['deliv_fee_min'];
} elseif ($arrSearchData['deliv_fee_min'] == 0 && $arrSearchData["deliv_fee_max"] != 0) {
$searchCondition['where'] .= ' AND T1.deliv_fee <= ?';
$searchCondition['arrval'][] = $arrSearchData['deliv_fee_max'];
}

// 在庫無し商品の非表示
if (NOSTOCK_HIDDEN) {
$searchCondition['where'] .= ' AND EXISTS(SELECT * FROM dtb_products_class WHERE product_id = alldtl.product_id AND del_flg = 0 AND (stock >= 1 OR stock_unlimited = 1))';
$searchCondition['where_for_count'] .= ' AND EXISTS(SELECT * FROM dtb_products_class WHERE product_id = alldtl.product_id AND del_flg = 0 AND (stock >= 1 OR stock_unlimited = 1))';
}

return $searchCondition;
}

に変更です。


カテゴリー及び商品重量のみで検索した場合には検索結果と結果数がマッチするのですが、
キーワードと商品重量を入力して検索するとキーワードのみで検索した場合の結果数が返っている状態です。

何かお気付きの点がありましたらご教示頂けますと幸いです。






yuh
投稿日時: 2014/8/6 13:19
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1819
Re: 商品検索項目の追加について
$searchCondition['where_for_count'] = $searchCondition['where'];

を重量検索の処理の後に移動です。
キーワードの処理が終わって重量の処理の前にカウント用のクエリを保存してしまってるので、件数に関しては重量のクエリは適用されないままになってしまってる感じです。
nksm
投稿日時: 2014/8/6 14:07
対応状況: −−−
半人前
登録日: 2012/4/25
居住地:
投稿: 24
Re: 商品検索項目の追加について
ご回答ありがとうございます。

ご指摘の箇所を変更してみましたところ、システムエラーとなってしまいました。

ログには

Fatal error(E_USER_ERROR): DB処理でエラーが発生しました。 SQL: [SELECT COUNT(*) FROM dtb_products AS alldtl WHERE alldtl.del_flg = 0 AND alldtl.status = 1 AND T1.deliv_fee <= ? ] MDB2 Error: unknown error prepare: [Error message: Unable to create prepared statement handle] [Last executed query: DEALLOCATE PREPARE mdb2_statement_pgsql_86d2ed2d9801dbf5bf99187b1938168ea83924a75] [Native message: ERROR: missing FROM-clause entry for table "t1"] on [/data/class/SC_Query.php(1008)]

となっているのですが、何かお分かりになりますでしょうか。
yuh
投稿日時: 2014/8/6 14:19
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1819
Re: 商品検索項目の追加について
findProductCountがdtb_productsしかテーブルを使用してないっぽいのが原因です。
その部分のテーブルをdtb_products_classもJOINさせるか、WHEREのクエリをEXISTS等を使ってdtb_product_classをJOINしなくても検索できるように変更する必要があります。
nksm
投稿日時: 2014/8/6 17:02
対応状況: −−−
半人前
登録日: 2012/4/25
居住地:
投稿: 24
Re: 商品検索項目の追加について
ご回答ありがとうございました。

data/class/SC_Product.phpの function findProductCountに
dtb_products_classをJOINする事で解決致しました。

お世話になりました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は89,017名です
総投稿数は110,020件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1296
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.