技術アーカイブス
EC-CUBE4のトップページに新着商品を自動で表示する方法
EC-CUBE4になってTOPページのデザインも、より魅力的なものになりました。 しかし、トップページにある新着商品は、自動で更新されるものになっていません。 そこで今回は、商品を追加したときに自動で更新するようにカスタマイズしていきます。
また、カスタマイズ方法ですが、EC-CUBE3ではできなかった本体のソースコードを変更しない方法で実装していきます。
※ 商品を追加したときに、自動で更新するようにしていきます。
手順
- 修正ファイルを設置
- Blockファイルのmoreボタンを適切なリンクに変更
- TwigExtentionを利用し、新着商品を取得
- 新着商品をTwigテンプレート反映
1.修正ファイルを設置
今回必要なファイルは、2ファイルになります。
/app
Ltemplate
Ldefault
LBlock
Lnew_item.twig
LCustomize
LTwig
LExtension
LTwigExtension.php
まず、新着商品のTwigファイルをコピーします。
コピー元
src/Eccube/Resource/template/default/Block/new_item.twig
コピー先
app/template/default/Block/new_item.twig
次にTwigExtention用のファイルを作成します。
app/Customize/Twig/Extension/TwigExtension.php
2. Blockファイルのmoreボタンを適切なリンクに変更
moreボタンを見るとリンク先が商品一覧になっています。 リンク先の商品一覧のソート順を新着順となるように「app/template/default/Block/new_item.twig」のリンクを修正します。
href="{{ url('product_list') }}"
この記述を以下のように修正。
href="{{ url('product_list') }}?orderby={{eccube_config.eccube_product_order_newer}}"
3.TwigExtentionを利用し、新着商品を取得
Twig側で「CustomizeNewProduct()」を実行したときに、新着商品3件返す仕様にします。
app/Customize/Twig/Extension/TwigExtension.phpファイルにメソッドを定義します。
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('CustomizeNewProduct', array($this, 'getCustomizeNewProduct')),
);
}
// 省略...
/**
* 新着商品3件返す
* @return Products|null
*/
public function getCustomizeNewProduct()
{
try {
// productRepository->getQueryBuilderBySearchData()の引数に商品の出力順番を指定できるので新着順を定義
$searchData = array();
$qb = $this->entityManager->createQueryBuilder();
$query = $qb->select("plob")
->from("Eccube\\Entity\\Master\\ProductListOrderBy", "plob")
->where('plob.id = :id')
->setParameter('id', $this->eccubeConfig['eccube_product_order_newer'])
->getQuery();
$searchData['orderby'] = $query->getOneOrNullResult();
// 商品情報の取得する
$qb = $this->productRepository->getQueryBuilderBySearchData($searchData);
// 新着順の商品情報3件取得
$query = $qb->setMaxResults(3)->getQuery();
$products = $query->getResult();
return $products;
} catch (\Exception $e) {
return null;
}
return null;
}
4.新着商品をTwigテンプレート反映
app/template/default/Block/new_item.twigファイルを編集。
{% set Products = CustomizeNewProduct() %}
{% if Products|length > 0 %}
<div class="ec-role">
<div class="ec-newItemRole">
<div class="ec-newItemRole__list">
<div class="ec-newItemRole__listItem">
<div class="ec-newItemRole__listItemHeading ec-secHeading--tandem">
<span class="ec-secHeading__en">{{ 'front.block.new_item.title__en'|trans }}</span>
<span class="ec-secHeading__line"></span>
<span class="ec-secHeading__ja">{{ 'front.block.new_item.title__ja'|trans }}</span>
<a class="ec-inlineBtn--top" href="{{ url('product_list') }}?orderby={{eccube_config.eccube_product_order_newer}}">{{ 'front.block.new_item.more'|trans }}</a>
</div>
</div>
{% for Product in Products %}
<div class="ec-newItemRole__listItem">
<a href="{{ url('product_detail', {'id': Product.id}) }}">
<img src="{{ asset(Product.main_list_image|no_image_product, 'save_image') }}">
<p class="ec-newItemRole__listItemTitle">{{ Product.name }}</p>
<p class="ec-newItemRole__listItemPrice">
{% if Product.hasProductClass %}
{% if Product.getPrice02Min == Product.getPrice02Max %}
{{ Product.getPrice02IncTaxMin|price }}
{% else %}
{{ Product.getPrice02IncTaxMin|price }} ~ {{ Product.getPrice02IncTaxMax|price }}
{% endif %}
{% else %}
{{ Product.getPrice02IncTaxMin|price }}
{% endif %}
</p>
</a>
</div>
{% endfor %}
</div>
</div>
</div>
{% endif %}