バージョン選択

フォーラム

メニュー

オンライン状況

82 人のユーザが現在オンラインです。 (70 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 81
tattsu もっと...

サイト内検索

質問 > フロント機能 > 検索をかけた際にある特定のカテゴリに属する商品は検索されない様にしたいです。

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
andez
投稿日時: 2014/6/26 4:35
対応状況: −−−
常連
登録日: 2013/5/24
居住地:
投稿: 35
検索をかけた際にある特定のカテゴリに属する商品は検索されない様にしたいです。
お世話になっております。
検索窓からキーワードを入力し、検索をかけた際にある特定のカテゴリに属する商品は検索されない様にする必要が事情により発生し、以下のスレッドを見つけ、試しておりましたが、エラーはでないものの、全てのカテゴリの商品を検索してしまいます。

http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=13155&forum=10&post_id=60310#forumpost60310

何か打開策とはありますでしょうか。お分かりの方がいらっしゃいましたらアドバイスを頂ければ幸いです。

EC-CUBE 2.12.5
(データベース) MySQL5.0.77
(WEBサーバ) apache2
(OS) Windows XP
(PHP) 5.0.22
tsuji
投稿日時: 2014/6/26 9:24
対応状況: −−−
仙人
登録日: 2013/11/19
居住地:
投稿: 958
Re: 検索をかけた際にある特定のカテゴリに属する商品は検索されない様にしたいです。
andez 様

特定のカテゴリのみを検索しないのであれば、
検索条件に特定のカテゴリ以外を追加するのが
よいと思いますが、

特定のカテゴリとそれ以下の階層のカテゴリを検索しない
のであれば、data\class\helper\SC_Helper_DB.phpの
sfGetCatWhereを参考に検索条件にcategory_idをNOT IN
で加えてみてはいかがでしょうか?


----------------
****************************************
株式会社システムフレンド
辻 拓也(takuya tsuji)
改造専門店・EC-CUBE工房
****************************************

andez
投稿日時: 2014/6/27 15:29
対応状況: −−−
常連
登録日: 2013/5/24
居住地:
投稿: 35
Re: 検索をかけた際にある特定のカテゴリに属する商品は検索されない様にしたいです。
Tsuji様

ご教授頂きまして感謝致します。いろいろと試しておりましたが、

具体的にはあるカテゴリに属する商品(孫カテゴリcategory_idの40以上56以下、あるいは子カテゴリcategory_id =10)を検索をかけた時に非表示にしたい場合、以下の記述の様に試すと画面が真っ白になります。

方向性、記述上の問題点などご教授頂けませんでしょうか。

SC_Helper_DB.php

function sfGetCatWhere($category_id) {
// 子カテゴリIDの取得
$arrRet = SC_Helper_DB_Ex::sfGetChildrenArray('dtb_category', 'parent_category_id', 'category_id', $category_id);

$where = 'category_id NOT IN 10';

return array($where, $arrRet);
}


tsuji
投稿日時: 2014/6/30 10:35
対応状況: −−−
仙人
登録日: 2013/11/19
居住地:
投稿: 958
Re: 検索をかけた際にある特定のカテゴリに属する商品は検索されない様にしたいです。
andez 様

> 具体的にはあるカテゴリに属する商品(孫カテゴリcategory_idの40以上56以下、あるいは子カテゴリcategory_id =10)を検索をかけた時に非表示にしたい場合、以下の記述の様に試すと画面が真っ白になります。

10のカテゴリの子カテゴリの商品も検索結果に出てきてほしく
いということですよね?

sfGetCatWhereでは、$category_idと$category_idの子のカテゴ
リを取得して、そこから商品を取得できるようにSQLの条件文を返
しています。
SC_Helper_DB_Ex::sfGetChildrenArrayで子のカテゴリIDを取得しています。

sfGetCatWhere自体は商品検索で使うので、別途下記のように
sfGetCatWhereをコピーして関数を作るのがよいかと思います。

/**
* カテゴリから商品を検索しない場合のWHERE文と値を返す.
*
* @param integer $category_id カテゴリID
* @return array 商品を検索する場合の配列
*/
function sfNotGetCatWhere($category_id) {
// 子カテゴリIDの取得
$arrRet = SC_Helper_DB_Ex::sfGetChildrenArray('dtb_category', 'parent_category_id', 'category_id', $category_id);

$where = 'category_id NOT IN (' . SC_Utils_Ex::repeatStrWithSeparator('?', count($arrRet)) . ')';

return array($where, $arrRet);
}

そして、商品の検索条件に新たに作成した検索条件を加えるのが
よいかと思います。


----------------
****************************************
株式会社システムフレンド
辻 拓也(takuya tsuji)
改造専門店・EC-CUBE工房
****************************************

andez
投稿日時: 2014/6/30 22:59
対応状況: −−−
常連
登録日: 2013/5/24
居住地:
投稿: 35
Re: 検索をかけた際にある特定のカテゴリに属する商品は検索されない様にしたいです。
Tsuji様

大変お世話になっております。またご教授頂きまして感謝いたします。
SC_Helper_DB.phpをtsuji様から頂きました記述に置き換えた後、

“そして、商品の検索条件に新たに作成した検索条件を加えるのが
よいかと思います。”

とは、LC_Page_Products_List.php内の記述を以下のように変更することだと考え(これしか相当のものが見つかりませんでしたので)試しておりました。が、Unknown column ' alldtl.category_id ' in 'where clause というエラーがlogファイルに吐き出されます。

// 商品検索条件の作成(未削除、表示)
$searchCondition['where'] = 'alldtl.del_flg = 1 AND alldtl.status = 0  AND alldtl.category_id = 10';

Sc_product.phpのalldtlにはcategory_idが存在しますので、unknown columnというエラーがなぜでるのか分からないでおります。

申し訳ございませんが、どこが間違っていると思われますでしょうか。
yuh
投稿日時: 2014/7/1 2:31
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1819
Re: 検索をかけた際にある特定のカテゴリに属する商品は検索されない様にしたいです。
alldtlにはcategory_idが存在しません。

LC_Page_Products_List.php


        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']);
        }


ここに書いてあるようにcategory_idで検索をかけるのであれば、dtb_product_categoriesからtsuji様の記述されているsfNotGetCatWhereからカテゴリIDを取り、データがあるのであればNOT EXISTSでチェックするように使用すればいいと思います。


// 商品検索条件の作成(未削除、表示)
$searchCondition['where'] = 'alldtl.del_flg = 1 AND alldtl.status = 0  AND alldtl.category_id = 10';

このように記述するのであれば、


// 商品検索条件の作成(未削除、表示)
$searchCondition['where'] = 'alldtl.del_flg = 1 AND alldtl.status = 0 AND EXISTS(SELECT * FROM dtb_product_categories WHERE product_id = alldtl.product_id AND category_id = 10)';

このように書いた方がいいと思います。
おそらくやりたいのは

// 商品検索条件の作成(未削除、表示)
$searchCondition['where'] = 'alldtl.del_flg = 0 AND alldtl.status = 1 NOT EXISTS(SELECT * FROM dtb_product_categories WHERE product_id = alldtl.product_id AND category_id = 10)';

こんな感じだとは思いますが。
andez
投稿日時: 2014/7/1 4:16
対応状況: 解決済
常連
登録日: 2013/5/24
居住地:
投稿: 35
Re: 検索をかけた際にある特定のカテゴリに属する商品は検索されない様にしたいです。
Yuh様 Tsuji様

できました。
ご教授いただき感謝いたします。ありがとうございます。

具体的には子カテゴリ10、孫カテゴリ40以上56以下の場合(子カテゴリ10に属する孫カテゴリ40以上56以下を非表示にしたい)、以下の設定で思い通りに抽出すると思われます。(後で問題が発生してくるかどうかは分かりませんが)

$searchCondition['where'] = 'alldtl.del_flg = 0 AND alldtl.status = 1 AND NOT EXISTS(SELECT * FROM dtb_product_categories WHERE product_id = alldtl.product_id AND category_id < 57 and category_id > 39)';

いずれにせよ、本当にありがとうございます。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

総メンバー数は88,846名です
総投稿数は109,985件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1291
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.