<?php
namespace Plugin\PiaMailmagHistory\EventSubscriber;
use Eccube\Event\TemplateEvent;
use Plugin\PiaMailmagHistory\Repository\PiaMailmagReleaseDateRepository;
use Plugin\PiaMailmagHistory\Service\PiaMailmagHistoryService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ProductEditWidgetSubscriber implements EventSubscriberInterface
{
/**
* @var PiaMailmagHistoryService
*/
private $piaMailmagHistoryService;
/**
* @var PiaMailmagReleaseDateRepository
*/
private $releaseDateRepository;
public function __construct(
PiaMailmagHistoryService $piaMailmagHistoryService,
PiaMailmagReleaseDateRepository $releaseDateRepository
) {
$this->piaMailmagHistoryService = $piaMailmagHistoryService;
$this->releaseDateRepository = $releaseDateRepository;
}
public static function getSubscribedEvents()
{
return [
'@admin/Product/product.twig' => 'onAdminProductEdit',
];
}
/**
* 管理画面商品編集ページに商品メルマガ配信ウィジェットを追加
*/
public function onAdminProductEdit(TemplateEvent $event)
{
$parameters = $event->getParameters();
$product = $parameters['Product'] ?? null;
if (!$product || !$product->getId()) {
return;
}
$productId = $product->getId();
$ReleaseDate = $this->releaseDateRepository->findByProductId($productId);
$parameters['pia_mailmag_product_id'] = $productId;
$parameters['pia_mailmag_release_date'] = $ReleaseDate ? $ReleaseDate->getReleaseDate() : null;
$parameters['pia_mailmag_boxes'] = $this->piaMailmagHistoryService->getBoxes($productId);
$event->setParameters($parameters);
$source = $event->getSource();
// 「商品名」欄の直前(商品ID・商品購入履歴のすぐ下)にウィジェットを挿入する。
// 商品編集フォームは非常に縦長のため、auto_renderループの位置(拡張項目群の直前)だと
// 埋もれて見つけにくいので、V3と同様にフォーム最上部付近に表示する。
$marker = "'admin.product.name'|trans";
$markerPos = strpos($source, $marker);
if (false !== $markerPos) {
$rowStart = strrpos(substr($source, 0, $markerPos), '<div class="row">');
if (false !== $rowStart) {
$include = "{{ include('@PiaMailmagHistory/admin/Product/mailmag_widget.twig') }}\n";
$source = substr($source, 0, $rowStart).$include.substr($source, $rowStart);
}
}
$event->setSource($source);
}
}