EC-CUBE4の新着情報をブラウザでPUSH通知するプラグインを作る方法です。
まずは以下のコマンドでプラグインの雛形を作ります。
プラグインコードはなんでも良いのですが、今回は「Push4」にしてください。
bin/console eccube:plugin:generate
プッシュ通知するためのTwigファイルを用意
プッシュ通知するために今回はPush.jsを使用します。
以下のTwigファイルをPlugin/Push4/Resource/template/default/snippet/push.twigに設置してください。
{% block javascripts %}
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/push.js/1.0.7/push.min.js"></script>
    <script type="text/javascript">
        // アクセスから30秒後に通知を受け取る許諾ポップアップを表示
        setTimeout(function () {
            Push.Permission.request(onGranted, onDenied);
        }, 30 * 1000);
        function onGranted() {
            console.log('Granted!');
        }
        function onDenied() {
            console.log('Denied');
        }
        if (Push.Permission.has()) {
            Push.create("{{ BaseInfo.shop_name }}", {
                body:    "{{ News.title }}",
                icon:    "{{ asset('assets/img/common/favicon.ico') }}",
                timeout: 4000,
                onClick: function () {
                    {% if News.url %}
                    location.href = '{{ News.url }}'
                    {% endif %}
                    this.close();
                }
            });
        }
    </script>
{% endblock %}
フロントの場合のみTwigファイルを読み込む
上記で用意したTwigファイルをフロントの場合のみ読み込むイベントを用意します。
以下の内容をEvent.phpに追記してください。
<?php
namespace Plugin\Push4;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Eccube\Request\Context;
use Eccube\Event\TemplateEvent;
use Eccube\Repository\NewsRepository;
class Event implements EventSubscriberInterface {
    /**
     * @var \Eccube\Request\Context
     */
    protected $requestContext;
    /**
     * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface 
     */
    protected $eventDispatcher;
    /**
     * @var \Eccube\Repository\NewsRepository 
     */
    protected $newsRepository;
    public function __construct(
            Context $requestContext,
            EventDispatcherInterface $eventDispatcher,
            NewsRepository $newsRepository
    )
    {
        $this->requestContext = $requestContext;
        $this->eventDispatcher = $eventDispatcher;
        $this->newsRepository = $newsRepository;
    }
    /**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::CONTROLLER_ARGUMENTS => [['onKernelController', 100000000]],
        ];
    }
    public function onKernelController(FilterControllerEvent $event)
    {
        // フロントページでない場合はスルー
        if (!$this->requestContext->isFront()) {
            return;
        }
        if ($event->getRequest()->attributes->has('_template')) {
            $template = $event->getRequest()->attributes->get('_template');
            $this->eventDispatcher->addListener($template->getTemplate(), function (TemplateEvent $templateEvent) {
                $templateEvent->addSnippet('@Push4/default/snippet/push.twig');
                
                $News = $this->newsRepository->getList();
                $templateEvent->setParameter('News', $News->first());
            });
        }
    }
}
以上で完成です。
プラグインのインストールと有効化
プラグインのインストールと有効化を行うと動作します。
ちなみに上記の実装ではページをリロードするたびにプッシュ通知されます。
このプラグインのファイル一式はこちら。
