バージョン選択

フォーラム

メニュー

オンライン状況

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

PR

デザインテンプレート EC-CUBE3.0版が登場!
広告掲載について

サイト内検索

その他 > その他 > 【質問】新規に作成したページから、商品登録している特定商品カテゴリーの商品を一覧表示したいです。

その他

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
Mative_Doi
投稿日時: 2017/9/7 13:10
対応状況: −−−
新米
登録日: 2017/9/7
居住地:
投稿: 4
【質問】新規に作成したページから、商品登録している特定商品カテゴリーの商品を一覧表示したいです。
▼テンプレート
[EC-CUBE] 3.0.14
[レンタルサーバ] ヘテムル
[OS] Linux、4.11.6
[PHP] 7.1.2
[データベース] MySQL 5.6.23-log
[WEBサーバ] Apache
[ブラウザ] chrome バージョン: 60.0.3112.113
[導入プラグインの有無]
[カスタマイズの有無] はじめまして。この度EC-CUBEを使用して、販売サイトを制作することになりました。
EC-CUBEのカスタマイズ経験が全くなく、何をどうすればやりたい事が実現できるのか不明な状況です。
下記、カスタマイズしたいことを記載いたしますので、
ご存じの方いらっしゃいましたら、ご教授の程、宜しくお願いいたします。

カスタマイズしたいこと

EC-CUBEにて、コンテンツ管理 -> ページ管理 -> 新規ページを作成しました。
新たに作ったページにて、既に商品登録してある特定カテゴリの商品を商品一覧として表示させたいです。一覧商品された商品は、クリックすると、商品詳細ページに飛ぶように、リンクもさせたいです。

このようなことを実現するには、どうすれば良いでしょうか?
新規ページ内に、コードを書けば良いでしょうか?
ブロック管理から、ブロックを追加して割り当てれば良いでしょうか?
また、その場合は、どんなコードを書いたら良いでしょうか?
twigについても、全く分かっておりません。

もしくは、そのような機能を持ったプラグインを組み込めば良いでしょうか?

ご教授の程、お願いいたします。


[現象]
Mative_Doi
投稿日時: 2017/9/9 23:55
対応状況: −−−
新米
登録日: 2017/9/7
居住地:
投稿: 4
Re: 新規に作成したページから、商品登録している特定商品カテゴリーの商品を一覧表示したいです。
自己レスです。

半分まで、自己解決出来ております。。

https://umebius.com/eccube/add_dynamic_block_programmatically/
の記事を参考にして、新たにコントローラーを作成しました。

また、Product/list.twigのコード内の一部コードを流用することにより、
新着商品登録5件を、新規作成ページ内に表示するところまで実装出来ました。


上記URLの手順2のtwigコード(app/template/default/Block/new_item.twig)を下記のように変更。
流用したコードはこちら。

new_item.twigファイル内

<ul>
{% for Product in Products %}

【list.twigの一部をそのまま流用】

<div id="result_list_box--{{ Product.id }}" class="col-sm-3 col-xs-6 list_item">
<div id="result_list__item--{{ Product.id }}" class="product_item">
<a href="{{ url('product_detail', {'id': Product.id}) }}">
<div id="result_list__image--{{ Product.id }}" class="item_photo">
<img src="{{ app.config.image_save_urlpath }}/{{ Product.main_list_image|no_image_product }}">
</div>
<dl id="result_list__detail--{{ Product.id }}">
<dt id="result_list__name--{{ Product.id }}" class="item_name">{{ Product.name }}</dt>
{% if Product.description_list %}
{# ↓アイテムコメントコメントアウト↓ #}
{# <dd id="result_list__description_list--{{ Product.id }}" class="item_comment">{{ Product.description_list|raw|nl2br }}</dd> #}
{% endif %}
{% if Product.hasProductClass %}
{% if Product.getPrice02Min == Product.getPrice02Max %}
<dd id="result_list__price02_inc_tax--{{ Product.id }}" class="item_price">
{{ Product.getPrice02IncTaxMin|price }}
</dd>
{% else %}
<dd id="result_list__price02_inc_tax--{{ Product.id }}" class="item_price">
{{ Product.getPrice02IncTaxMin|price }} ~ {{ Product.getPrice02IncTaxMax|price }}
</dd>
{% endif %}
{% else %}
<dd id="result_list__price02_inc_tax--{{ Product.id }}" class="item_price">{{ Product.getPrice02IncTaxMin|price }}</dd>
{% endif %}
</dl>
</a>
</div>
</div>

【list.twigの一部を流用】

{% endfor %}
</ul>


これで、新着商品5件までは、list.twigと同じように表示出来ました。

但し、やりたいことは、自分で指定した商品カテゴリー(list?category_id=XXみたいな感じで)の全商品リストを一覧表示させることです。
これを実現する為には、後、何を変更したら良いでしょうか・・。
恐らく、上記URLの、手順1.コントローラを作成を変更したら特定商品カテゴリーを表示出来るかと思いますが、
出来れば、手動指定したものを、毎回表示できるような仕組みが欲しい・・・。です。

ご教授の程、宜しくお願いいたします。

468
投稿日時: 2017/9/10 20:56
対応状況: −−−
仙人
登録日: 2008/10/26
居住地:
投稿: 796
Re: 新規に作成したページから、商品登録している特定商品カテゴリーの商品を一覧表示したいです。
新規追加されたコントローラー側で、Productsを組み立ててtwigに渡していると思いますが、
Productsはどのようにして生成されていますか?

/src/Eccube/Controller/ProductController.phpのfunction index()の中では、$paginationが商品データですので、
このあたりの記述を参考にされてみては如何でしょうか?


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

Mative_Doi
投稿日時: 2017/9/11 10:31
対応状況: −−−
新米
登録日: 2017/9/7
居住地:
投稿: 4
Re: 新規に作成したページから、商品登録している特定商品カテゴリーの商品を一覧表示したいです。
シロハチ様

お世話になっております。
早速ご回答頂きましてありがとうございます。

> /src/Eccube/Controller/ProductController.phpのfunction index()
> の中では、$paginationが商品データですので、このあたりの記述を参考にされてみては如何でしょうか?

有益な情報を頂き、ありがとうございました!
はい、まさに私も週末に同様の部分を参照しておりました。

ProductControllerのコントローラーから、最終的にProduct/list.twigに値を渡していること確認しました。

これと同じようなことを実現出来ればやりたいことが出来るのではないかと思います。

1)新たにコントローラーを作成。
2)新規追加するブロックへ値を渡してあげれば良いのかと思います。
3)新規追加ブロックを、各新規ページへレイアウトで組込み。


> 新規追加されたコントローラー側で、Productsを組み立ててtwigに渡していると思いますが、
> Productsはどのようにして生成されていますか?

https://umebius.com/eccube/add_dynamic_block_programmatically/
こちらの記事を参考にしております。手順1のところです。
この記事内では、新着商品を5件表示するコントローラーの作成が紹介されておりましたので、
とりあえずは、こちらのコントローラーをそのまま利用してみました。

新着5件の商品登録情報を取得するコントローラ。

src/Eccube/Controller/Block/NewItemController

--
namespace Eccube\Controller\Block;


use Eccube\Application;
use Symfony\Component\HttpFoundation\Request;

class NewItemController
{
public function index(Application $app, Request $request)
{
$Products = $app['eccube.repository.product']
->createQueryBuilder('p')
->orderBy('p.create_date', 'DESC')
->setMaxResults(5)
->getQuery()
->getResult();
return $app->render('Block/new_item.twig', array(
'Products' => $Products,
));
}
}
--

こちらのコントローラーをそのまま利用し、
新規作成したブロックで新着商品5件を表示させるところまでは実現出来ました。


新規作成したブロック:new_item.twig

--
<ul>
{% for Product in Products %}

<div id="result_list_box--{{ Product.id }}" class="col-sm-3 col-xs-6 list_item">
<div id="result_list__item--{{ Product.id }}" class="product_item">
<a href="{{ url('product_detail', {'id': Product.id}) }}">
<div id="result_list__image--{{ Product.id }}" class="item_photo">
<img src="{{ app.config.image_save_urlpath }}/{{ Product.main_list_image|no_image_product }}">
</div>
<dl id="result_list__detail--{{ Product.id }}">
<dt id="result_list__name--{{ Product.id }}" class="item_name">{{ Product.name }}</dt>
{% if Product.description_list %}
{# ↓アイテムコメントコメントアウト↓ #}
{# <dd id="result_list__description_list--{{ Product.id }}" class="item_comment">{{ Product.description_list|raw|nl2br }}</dd> #}
{% endif %}
{% if Product.hasProductClass %}
{% if Product.getPrice02Min == Product.getPrice02Max %}
<dd id="result_list__price02_inc_tax--{{ Product.id }}" class="item_price">
{{ Product.getPrice02IncTaxMin|price }}
</dd>
{% else %}
<dd id="result_list__price02_inc_tax--{{ Product.id }}" class="item_price">
{{ Product.getPrice02IncTaxMin|price }} ~ {{ Product.getPrice02IncTaxMax|price }}
</dd>
{% endif %}
{% else %}
<dd id="result_list__price02_inc_tax--{{ Product.id }}" class="item_price">{{ Product.getPrice02IncTaxMin|price }}</dd>
{% endif %}
</dl>
</a>
</div>
</div>

{% endfor %}
</ul>
--


本来実現したかったこと。
ProductControllerコントローラーと、list.twigのように、

http://(URL)/products/list?category_id=XX

list?category_id=XX(カテゴリー番号)
の値を受けとり、その情報を用いて、

特定カテゴリーの商品一覧のみを表示できるような、
コントローラーとブロックを作りたいです。

ブロックの方は、Products なり、paginationなり、
このままで利用出来そうなので、あとは、コントローラーさえ
作れてしまえば、やりたいことは実現出来そうです。

ただ、コントローラーを作れる力がございません。。

ご教授頂けますと、大変ありがたいです。m(_ _)m
468
投稿日時: 2017/9/12 14:31
対応状況: −−−
仙人
登録日: 2008/10/26
居住地:
投稿: 796
Re: 新規に作成したページから、商品登録している特定商品カテゴリーの商品を一覧表示したいです。
弊社で商品一覧ブロックを追加するプラグインを開発中だったりするので、ちょっと答えづらい部分もあるのですが、
(こういったパターンでの利用を想定していましたので・・・)
コントローラー側の以下の箇所に、カテゴリによる絞込みを追加する必要があると思います。
$Products = $app['eccube.repository.product']
->createQueryBuilder('p')
->orderBy('p.create_date', 'DESC')
->setMaxResults(5)
->getQuery()
->getResult();


カテゴリの絞込みは、通常の商品一覧でも処理されており、

/src/Eccube/Repository/ProductRepository.php function getQueryBuilderBySearchData()の中身が参考になるのではないかと思います。
        // category
        $categoryJoin = false;
        if (!empty($searchData['category_id']) && $searchData['category_id']) {
            $Categories = $searchData['category_id']->getSelfAndDescendants();
            if ($Categories) {
                $qb
                    ->innerJoin('p.ProductCategories', 'pct')
                    ->innerJoin('pct.Category', 'c')
                    ->andWhere($qb->expr()->in('pct.Category', ':Categories'))
                    ->setParameter('Categories', $Categories);
                $categoryJoin = true;
            }
        }


ちょっとややこしいのが、
Categoryエンティティを条件として利用している事と
商品とカテゴリの関係が格納されているのがProductCategoryだと思います。

流れとしては、
1.リクエストからcategory_idを取得して、
$categoryId = $request->query->get('category_id');
↑多分これで取得できると思いますが・・・。

2.category_idでCategoryオブジェクトを取得
$Category = $app['eccube.repository.category']->find($categoryId);

3.2で取得したCategoryオブジェクトで商品を検索
$Products = $app['eccube.repository.product']
->createQueryBuilder('p')
※下に挿入
->innerJoin('p.ProductCategories', 'pct')
->innerJoin('pct.Category', 'c')
->andWhere('pct.Category = :Category')
->setParameter('Category', $Category)
※上に挿入
->orderBy('p.create_date', 'DESC')
->setMaxResults(5)
->getQuery()
->getResult();

こんな感じではないでしょうか?
(商品一覧の処理では、複数カテゴリにも対応できるようにin句を利用しているようですが、
 カテゴリが1つだけの場合、in句は不要かと思います)


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

Mative_Doi
投稿日時: 2017/9/12 23:46
対応状況: −−−
新米
登録日: 2017/9/7
居住地:
投稿: 4
Re: 新規に作成したページから、商品登録している特定商品カテゴリーの商品を一覧表示したいです。
シロハチ様

お世話になっております。

ご丁寧な返信内容を頂きありがとうございました。
頂いた内容を参考にして、NewItemController.phpを下記のように変更してみました。

/src/Eccube/Controller/Block/NewItemController.php

=====

namespace Eccube\Controller\Block;


use Eccube\Application;
use Eccube\Common\Constant;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Exception\CartException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;


class NewItemController
{

public function index(Application $app, Request $request)
{
$categoryId = $request->query->get('category_id');
$Category = $app['eccube.repository.category']->find($categoryId);

$Products = $app['eccube.repository.product']
->createQueryBuilder('p')
->innerJoin('p.ProductCategories', 'pct')
->innerJoin('pct.Category', 'c')
->andWhere('pct.Category = :Category')
->setParameter('Category', $Category)
->orderBy('p.create_date', 'DESC')
->setMaxResults(5)
->getQuery()
->getResult();

return $app->render('Block/new_item.twig', array(
'Products' => $Products,
));
}
}

=====

そしてURLに(新規作成したページのURL)?category_id=XX ID番号を割り当ててみましたが、
検索結果が画面に表示されませんでした。
上記のコントローラーの処理では、うまくDBからカテゴリーIDを
使用して商品データを引っ張ってくることが出来ませんでした。。

教えて頂いた通りの記述だったのですが、上のコントローラー内での記述に何か不備があるのでしょうか?
何かわかるようでしたら、、大変申し訳ございませんが、ご教授頂けると・・助かります。
何度も、申し訳ございません。

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

クレジットカード情報の非保持化対応

統計情報

総メンバー数は20,539名です
総投稿数は83,571件です

投稿数ランキング

1
seasoft
7331
2
AMUAMU
2712
3
nanasess
1662
4
yuh
1430
5
red
1076
6
fukap
907
7
shutta
827
8
468
796
9 ramrun 789
10
tsuji
784
11
umebius
721
12
tao_s
651
13 karin 641
14 sumida 638
15
homan
633
16 DELIGHT 571
17
patapata
502
18
flealog
483
19 tonton 436
20
ecbg
387


ネットショップの壺

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

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