▼テンプレート
[EC-CUBE] EC-CUBE 4.0.4
[OS] Windows10
[PHP] php7.4
[データベース] MySQL XAMPP 7.4.19
[ブラウザ] Chrome最新バージョン
[導入プラグインの有無] なし
[カスタマイズの有無] なし
[現象]
Windowsでローカル開発環境構築したEC-CUBEで新着商品を登録した順番に5つの商品を表示するブロックを作成したいのですができません。
app/Customize/Twig/Extension/NewProductExtension.php を作成しました。
<?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']]),
];
}
}
更に、ブロックを作成して、
Twig名をNewProductExtension5.twigとして、
{% 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>
このブロックをトップページに配置したのですが、
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']]), ]; } }
と表示されてしまいます。
どのようにしたら、最新登録した商品5個を表示するブロックを作成することができるのでしょうか?
お手数と思いますが、どなたか教えていただけるとありがたいです。