有限会社スプレッドワークス/Spread Works Inc.
ECサイト構築Webサイト構築Webシステム開発マーケティング支援制作実績課題解決
SERVICESサービス紹介
ECサイト構築・運用
CASES / WORKS課題解決 / 制作実績
NEWS / COLUMNお知らせ / ナレッジ・コラム
技術アーカイブス

EC-CUBE4のトップページに新着商品を自動で表示する方法

EC-CUBE4になってTOPページのデザインも、より魅力的なものになりました。 しかし、トップページにある新着商品は、自動で更新されるものになっていません。 そこで今回は、商品を追加したときに自動で更新するようにカスタマイズしていきます。

また、カスタマイズ方法ですが、EC-CUBE3ではできなかった本体のソースコードを変更しない方法で実装していきます。

※ 商品を追加したときに、自動で更新するようにしていきます。

手順

  1. 修正ファイルを設置
  2. Blockファイルのmoreボタンを適切なリンクに変更
  3. TwigExtentionを利用し、新着商品を取得
  4. 新着商品を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 %}

このコラムに関連するサービス・製品

ECサイト構築サービス with EC-CUBE

EC-CUBEを活用したECサイト構築サービスでは、オリジナルデザインや高機能プラグインを活用し、業種や規模に応じた柔軟なカスタマイズを提供します。小規模から大規模まで対応可能で、安定稼働と高水準のセキュリティを実現。

カテゴリー
  • すべて

  • 雑記

  • 技術アーカイブス

Powered by SPREAD Commerce on EC-CUBE.copyright © Spread Works Inc. all rights reserved.