umebius様
お世話になっております。追加で質問させてください。
■質問の概要
・EventクラスでRequestを受け取る方法は?
・Eventクラス内で既存ページに対して新規のフォームを生成する方法は?
・Eventクラス内で新規でQueryBuilderを操作する方法は?
■詳細
新着情報管理ページに新たに検索フォームを生成するには、以下の手順を行えばよいと認識しています。
①EccubeEvents::ADMIN_CONTENT_NEWS_INDEX_INITIALIZEイベントをフックする。
②生成したいFormとクエリの結果をsearch.twig(自分で作ったtwigファイル)に渡す。
③TemplateEventのaddSnippet()メソッドでnews.twig(新着情報管理ページ。EC-CUBE本体のファイル。)の</body>タグ直前に追加し、JQueryで位置を調整する。
それをもとに途中まで書いたEventクラスのコードが次のものです。
引用:
<?php
namespace Plugin\Sample;
use Eccube\Controller\AbstractController;
use Eccube\Event\TemplateEvent;
use Eccube\Repository\Master\PageMaxRepository;
use Eccube\Repository\NewsRepository;
use Knp\Component\Pager\PaginatorInterface;
use Plugin\MSEC_Client\Form\Type\Admin\Content\News\SearchNewsType;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class NewsEvent extends AbstractController implements EventSubscriberInterface
{
/**
* @var NewsRepository
*/
private $newsRepository;
/**
* @var PageMaxRepository
*/
private $pageMaxRepository;
/**
* @var PaginatorInterface
*/
private $paginator;
public function __construct(NewsRepository $newsRepository, PageMaxRepository $pageMaxRepository, PaginatorInterface $paginator)
{
$this->newsRepository = $newsRepository;
$this->pageMaxRepository = $pageMaxRepository;
$this->paginator = $paginator;
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
'@admin/Content/news.twig' => 'search',
];
}
public function search(TemplateEvent $event)
{
$searchForm = $this->createForm(SearchNewsType::class);
$twig = '@Sample/admin/Content/News/search.twig';
$event->addSnippet($twig);
}
}
検索フォームを生成するcreateForm()メソッドを呼ぶため、EventクラスにAbstractControllerクラスを継承させる必要がある、と考えました。
しかし、AbstractControllerクラスを継承させると次のようなエラー出て実行できません。
引用:
Cannot autowire service "Eccube\Event\TemplateEvent": argument "$view" of method "__construct()" has no type-hint, you should configure its value explicitly.
エラーについてはネットで調べたのですが、ヒントになりそうな内容は見つけられませんでした。
Eventクラス内でリクエストを取得し、既存ページに新規フォームを生成し、クエリを新たに発行するにはどうすればよいでしょうか。
やはり、ルーティングを上書きしてまったく新しいページとして開発するほうがよいのでしょうか・・・。