バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > トップにカテゴリー毎に分けた商品を数点ずつ表示したい。

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
minny
投稿日時: 2019/3/17 17:23
対応状況: −−−
常連
登録日: 2014/6/20
居住地:
投稿: 44
トップにカテゴリー毎に分けた商品を数点ずつ表示したい。
カテゴリーとは別に、特集のような形で絞り込んだ商品を数点動的にトップに表示したいです。

春にぴったりの商品
お値打ち商品
在庫わずか
…など

おすすめ商品プラグインを使用する方法も考えたのですが、複数作ることができないようでさたので…

タグを利用する形かなと考えています。
このタグが付いている商品を4件このブロックに表示するなど…
更にnewアイコンもつけられると嬉しいです。

取得の仕方が分からず、お力添え頂けたら大変有り難いです。
どうぞ、よろしくお願いいたします。
umebius
投稿日時: 2019/3/17 23:11
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: トップにカテゴリー毎に分けた商品を数点ずつ表示したい。
タグを使用するならクエリビルダを使用するなどして、タグがついた商品の一覧を取得可能です。

トップページのコントローラ(必要に応じてカスタマイズディレクトリを使用ください)
src/Eccube/Controller/TopController.php

以前の記事に書いたので参考まで
特定のタグが設定された商品一覧の取得方法 EC-CUBE4


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

Rights
投稿日時: 2019/3/18 23:02
対応状況: −−−
一人前
登録日: 2019/3/12
居住地:
投稿: 99
Re: トップにカテゴリー毎に分けた商品を数点ずつ表示したい。
タグで設定した商品一覧の取得について、記事を拝見しました。

商品一覧や詳細で表示している商品のタグを取得して、同じタグが設定された商品を取得しようとした場合に、パラメータとして動的に表示している商品のタグを渡して結果をとる場合、表示商品のタグ(ID)が取得できないようですが、取得クエリの変更が必要でしょうか?
umebius
投稿日時: 2019/3/19 15:21
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: トップにカテゴリー毎に分けた商品を数点ずつ表示したい。
Productエンティティから見てタグの取得方法は下記のようにします。
$Tag->getId()でタグのIDが取得できますので、
このIDを利用して上のようにクエリビルダを使うか、
$Tag->getProductTag()でも商品一覧が取得できます。

foreach ($Product->getProductTag() as $ProductTag) {
$Tag = $ProductTag->getTag();

}


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

Rights
投稿日時: 2019/3/19 20:11
対応状況: −−−
一人前
登録日: 2019/3/12
居住地:
投稿: 99
Re: トップにカテゴリー毎に分けた商品を数点ずつ表示したい。
あまりスマートではないですが、表示している商品詳細ページと同じタグが登録された商品の一覧表示用データを取得しています。

$product_tag_ids = array();
foreach ($Product->getProductTag() as $ProductTag) {
$Tag = $ProductTag->getTag();
array_push($product_tag_ids, $Tag->getId());
}

$qb_ext = $this->entityManager->getRepository('Eccube\Entity\Product')->createQueryBuilder('p');
$qb_ext ->innerJoin('p.ProductTag', 'pt')
->innerJoin('pt.Tag', 't');
foreach ($product_tag_ids as $key => $val) {
if ($key == 0) {
$qb_ext ->where('t = ' .$val);
} else {
$qb_ext ->orwhere('t = ' .$val);
}
}
$qb_ext ->orderBy('p.create_date', 'desc');

$Products_ext = $qb_ext->getQuery()->getResult();

where句の指定で、配列から複数条件を指定する方法がわからなかったため、上記のようにしています。
setParameterで指示する事も考えましたが、こちらで進めようと思います。
468
投稿日時: 2019/3/19 20:58
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: トップにカテゴリー毎に分けた商品を数点ずつ表示したい。
個人的に気になるのですが、
whereに渡す文字列をsetParameterを使わずに
文字列連結で組み立てた場合、
SQLインジェクションの対応は大丈夫なのでしょうか?


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

umebius
投稿日時: 2019/3/19 21:16
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: トップにカテゴリー毎に分けた商品を数点ずつ表示したい。
このコードの限りではデータベースから取得したID値なのでSQLインジェクションの可能性はないでしょうが、上の:Tagを使ったコードのようにプレースホルダを使用するに越したことはないでしょうね。

また、foreach ($product_tag_ids)のループは、INを使って下のようにも書けると思います。
$qb_ext->where('t IN (:ids) ')
->setParameter('ids', $product_tag_ids);



----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

Rights
投稿日時: 2019/3/19 22:45
対応状況: −−−
一人前
登録日: 2019/3/12
居住地:
投稿: 99
Re: トップにカテゴリー毎に分けた商品を数点ずつ表示したい。
ご指摘ありがとうございます。
修正してみました。

$product_tag_ids = array();
foreach ($Product->getProductTag() as $ProductTag) {
$Tag = $ProductTag->getTag();
array_push($product_tag_ids, $Tag->getId());
}

$qb_ext = $this->entityManager->getRepository('Eccube\Entity\Product')->createQueryBuilder('p');
$qb_ext ->innerJoin('p.ProductTag', 'pt')
->innerJoin('pt.Tag', 't');

$view_product_id = $Product->getId();

↓↓↓↓↓現在表示している商品は無条件で除外としたいのですが、否定条件の指示はこれでよいのでしょうか?(パターン1)
$qb_ext ->where('not p.id = :id')
->setParameter('id', $view_product_id);

↓↓↓↓↓現在表示している商品は無条件で除外としたいのですが、否定条件の指示はこれでよいのでしょうか?(パターン2)
 条件が増えると遅くなると聞きますが、単一の条件の場合は、やはりパターン1でしょうか?
$view_product_id = array();
array_push($view_product_id, $Product->getId());

$qb_ext ->where('p.id NOT IN (:id)')
->setParameter('id', $view_product_id);


↓↓↓↓↓このままだと非公開の商品まで表示してしまうため、ステータスが表示のデータのみ
 product_status_id が存在しないとエラーとなりますが、発行しているSQLのSELECT句には、product_status_idの指定がありました。
$qb_ext ->andwhere('product_status_id = :sid')
->setParameter('sid', 1);
$qb_ext ->andwhere('t IN (:ids)')
->setParameter('ids', $product_tag_ids);

$qb_ext ->orderBy('p.update_date', 'desc');

$Products_ext = $qb_ext->setMaxResults(10)->getQuery()->getResult();

非公開の条件を付加するとエラーとなりますが、ここを外すと当初必要とした挙動となります。
umebius
投稿日時: 2019/3/20 0:11
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: トップにカテゴリー毎に分けた商品を数点ずつ表示したい。
公開商品を絞り込む
->andwhere('product_status_id = :sid')
は、
->andwhere('p.Status = :sid')
ですかね。

否定はパターン1でいいと思います。
p.id <> :id


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

Rights
投稿日時: 2019/3/20 10:10
対応状況: −−−
一人前
登録日: 2019/3/12
居住地:
投稿: 99
Re: トップにカテゴリー毎に分けた商品を数点ずつ表示したい。
ありがとうございます。

スレッドの本題からかなり外れてしまいましたが、

引用:

umebiusさんは書きました:
公開商品を絞り込む
->andwhere('product_status_id = :sid')
は、
->andwhere('p.Status = :sid')
ですかね。


→ /Eccube/Entity/Product.php の545行目に定義されていました。見落としておりました。

引用:

否定はパターン1でいいと思います。
p.id <> :id


→ Ver.2 でこの方法をとった際、クエリの処理が非常に重い場合がありました。一度のクエリで複数の否定条件を入れた場合は、サーバーやDB側の問題もあるかとは思いますが注意が必要でしょうか?
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

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

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1568
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
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.