質問 > フロント機能 > トップにカテゴリー毎に分けた商品を数点ずつ表示したい。 |
フロント機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
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
|
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(); }
|
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インジェクションの対応は大丈夫なのでしょうか?
|
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);
|
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
|
Rights |
投稿日時: 2019/3/20 10:10
対応状況: −−−
|
一人前 登録日: 2019/3/12 居住地: 投稿: 99 |
Re: トップにカテゴリー毎に分けた商品を数点ずつ表示したい。 ありがとうございます。
スレッドの本題からかなり外れてしまいましたが、 引用:
→ /Eccube/Entity/Product.php の545行目に定義されていました。見落としておりました。 引用:
→ Ver.2 でこの方法をとった際、クエリの処理が非常に重い場合がありました。一度のクエリで複数の否定条件を入れた場合は、サーバーやDB側の問題もあるかとは思いますが注意が必要でしょうか? |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |