Eccube4 twig: 任意のディレクトリのテンプレートを読み込むには、loaderでパスを指定すればOK。
相対パス指定も絶対パス指定もできずとても困っていた・・・が、これで解決。
イベントで書いた場合:
class HogehogeEvent implements EventSubscriberInterface
{
/**
* @var EccubeConfig
*/
protected $eccubeConfig;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var AuthorizationCheckerInterface
*/
protected $authorizationChecker;
/**
* @var TokenStorageInterface
*/
protected $tokenStorage;
/**
* @var Router
*/
private $router;
/**
* ContactChatEvent constructor.
*/
public function __construct(
EccubeConfig $eccubeConfig,
EntityManagerInterface $entityManager,
AuthorizationCheckerInterface $authorizationChecker,
TokenStorageInterface $tokenStorage,
CampaignRepository $campaignRepository,
OrderReferRepository $orderReferRepository,
Router $router,
\Twig_Environment $twig
)
{
$this->eccubeConfig = $eccubeConfig;
$this->entityManager = $entityManager;
$this->authorizationChecker = $authorizationChecker;
$this->tokenStorage = $tokenStorage;
$this->router = $router;
$this->twig = $twig;
// hogehogeテンプレートのパスを設定する
$this->twig->getLoader()->addPath('app/template/hogehoge', 'hogehoge_template');
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
//hogehoge下のファイルを指定できる
'@hogehoge/Admin/Order/edit.twig' => ['AdminOrderEdit', 99],
];
}
public function AdminOrderEdit(TemplateEvent $event) {
$source = $this->twig->getLoader()
// hogehoge 下のファイル
->getSourceContext("@hogehoge/Admin/Order/edit.twig")
->getCode();
$source = $this->twig->getLoader()
// ★Eccubeで指定したデフォルトテンプレート
->getSourceContext("@__main__/Admin/Order/edit.twig")
->getCode();
$event->setSource($source);
}
@__main__ は★Eccubeで指定したデフォルトテンプレート。(正確には優先順の配列となっていて、先頭が指定したもの。)
ちなみに上記コードは、特定テンプレートの内容でごそっと入れ替えている。