【EC-CUBE4】新着商品ブロックの商品一覧を動的に取得する方法

EC-CUBE4の新着商品ブロックの商品一覧を動的に取得する方法です。

デフォルトの新着商品ブロックの商品一覧は静的なので動的に出力するようにして自動で新着商品を表示するようにします。

新着商品を取得するTwig関数を作成

新着商品を取得するTwig関数を作成します。

サンプルコードは以下のとおりです。

<?php

namespace Customize\Twig\Extension;

use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Common\EccubeConfig;
use Eccube\Entity\Master\ProductListOrderBy;
use Eccube\Repository\ProductRepository;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class NewProductExtension extends AbstractExtension
{
    /**
     * @var ProductRepository
     */
    private $productRepository;

    /**
     * @var EntityManagerInterface
     */
    private $entityManager;
    /**
     * @var EccubeConfig
     */
    private $eccubeConfig;

    public function __construct(
        ProductRepository $productRepository,
        EntityManagerInterface $entityManager,
        EccubeConfig $eccubeConfig
    )
    {
        $this->productRepository = $productRepository;
        $this->entityManager = $entityManager;
        $this->eccubeConfig = $eccubeConfig;
    }

    public function getFunctions(): array
    {
        return [
            new TwigFunction('newProducts', function ($limit) {

                /** @var ProductListOrderBy $productListOrderBy */
                $productListOrderBy = $this->entityManager->getRepository(ProductListOrderBy::class)->find($this->eccubeConfig['eccube_product_order_newer']);

                $qb = $this->productRepository->getQueryBuilderBySearchData(['orderby' => $productListOrderBy]);
                $qb
                    ->setMaxResults($limit);

                return $qb->getQuery()->getResult();
            }, ['pre_escape' => 'html', 'is_safe' => ['html']]),
        ];
    }
}

ProductRepositoryのgetQueryBuilderBySearchDataメソッドからデータを取得することでCustomizeやプラグインでQueryCustomizerでカスタマイズされたクエリを取得できるようにしています。

これ重要です。

新着情報ブロックを更新

新着情報ブロックの内容を以下のように更新してください。

{% set Products = newProducts(5) %}
 
<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>

以上で完成です。

newProductsの数値を変更することで取得する商品数を指定することができます。

お気軽にコメントをどうぞ

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください