バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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

フロント機能

新規スレッドを追加する

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

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

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

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

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

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

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


----------------
EC-CUBE3系4系 カスタマイズ ECのプロがシステム特急案件承ります。
公式インテグレートパートナー (株)U-Mebius

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

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

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

}


----------------
EC-CUBE3系4系 カスタマイズ ECのプロがシステム特急案件承ります。
公式インテグレートパートナー (株)U-Mebius

Rights
投稿日時: 2019/3/19 20:11
対応状況: −−−
半人前
登録日: 2019/3/12
居住地:
投稿: 30
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
居住地:
投稿: 1746
Re: トップにカテゴリー毎に分けた商品を数点ずつ表示したい。
個人的に気になるのですが、
whereに渡す文字列をsetParameterを使わずに
文字列連結で組み立てた場合、
SQLインジェクションの対応は大丈夫なのでしょうか?


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

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

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



----------------
EC-CUBE3系4系 カスタマイズ ECのプロがシステム特急案件承ります。
公式インテグレートパートナー (株)U-Mebius

Rights
投稿日時: 2019/3/19 22:45
対応状況: −−−
半人前
登録日: 2019/3/12
居住地:
投稿: 30
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
居住地: 東京日本橋
投稿: 1296
Re: トップにカテゴリー毎に分けた商品を数点ずつ表示したい。
公開商品を絞り込む
->andwhere('product_status_id = :sid')
は、
->andwhere('p.Status = :sid')
ですかね。

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


----------------
EC-CUBE3系4系 カスタマイズ ECのプロがシステム特急案件承ります。
公式インテグレートパートナー (株)U-Mebius

Rights
投稿日時: 2019/3/20 10:10
対応状況: −−−
半人前
登録日: 2019/3/12
居住地:
投稿: 30
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.co

統計情報

総メンバー数は45,179名です
総投稿数は91,762件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
nanasess
1894
4
468
1746
5
yuh
1584
6
umebius
1296
7
red
1281
8
fukap
907
9
tsuji
837
10
shutta
827
11 ramrun 789
12
tao_s
750
13
h_tanaka
730
14 karin 656
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
483
20 tonton 436


ネットショップの壺

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

Copyright© LOCKON CO.,LTD. All Rights Reserved.