はじめに
EC-CUBE2.12.xからEC-CUBE4.xにバージョンアップしたいという依頼。
なるべく外見は変わらないようにという要望もあり/user_data/sample.phpを/user_dataの下に設置できないか検討。
ちなみにsample.phpはDBアクセスもありそれに従い表示しなければならない。
管理画面からページ追加
ページ追加
コンテンツ管理>ページ管理から新規ページ作成
URL:sample ファイル名:sample.twig
{% extends 'default_frame.twig' %}
{% block main %}
サンプル
{% endblock %}
ブラウザよりアクセス
/user_data/sample でページ表示できた。
UserDataControlle編集
Customize
DBアクセスしたいのでuser_dataのControllerをCustomizeにコピー
src/Eccube/Controller/UserDataController.php → app/Customize/Controller/UserDataController.php
ルーティングを設定しfunction編集
namespace Customize\Controller;
use Eccube\Controller\AbstractController;
:
class UserDataController extends AbstractController
{
/**
* @Route("/%eccube_user_data_route%/{route}", name="user_data_sample", requirements={"route": "sample(?<!\/)"})
*/
public function sample(Request $request, $route)
{
$Page = $this->pageRepository->findOneBy(
[
'url' => $route,
'edit_type' => Page::EDIT_TYPE_USER,
]
);
if (null === $Page) {
throw new NotFoundHttpException();
}
$file = sprintf('@user_data/%s.twig', $Page->getFileName());
$event = new EventArgs(
[
'Page' => $Page,
'file' => $file,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_USER_DATA_INDEX_INITIALIZE, $event);
log_error('デバッグ:sample',[var_export($file,true)]);
return $this->render($file);
}
/**
* @Route("/%eccube_user_data_route%/{route}", name="user_data", requirements={"route": "([0-9a-zA-Z_\-]+\/?)+(?<!\/)"})
*/
public function index(Request $request, $route)
{
:
}
}
ブラウザよりアクセス
/user_data/sample でページ表示できたがヘッダ部/フッタ部が表示されない。
TwigInitializeListener.php 編集
追いかけていくと src/Eccube/EventListener/TwigInitializeListener.php に以下のようなuser_dataの場合のコードあり
public function setFrontVariables(GetResponseEvent $event)
{
:
if ($route == 'user_data') {
$routeParams = $attributes->get('_route_params', []);
$route = isset($routeParams['route']) ? $routeParams['route'] : $attributes->get('route', '');
}
正直何をやっているか分からなかったけど
public function setFrontVariables(GetResponseEvent $event)
{
:
if ($route == 'user_data' || $route == 'user_data_sample') { // user_data/sampleのときもここを通るように追加
$routeParams = $attributes->get('_route_params', []);
$route = isset($routeParams['route']) ? $routeParams['route'] : $attributes->get('route', '');
}
と変更。
ブラウザよりアクセス
/user_data/sample でページ表示できたしヘッダ部/フッタ部も表示された。
#まとめ
EC-CUBEコア部分である TwigInitializeListener.php を編集しないといけないので /user_data/ の下は静的ページ(Javaスクリプトで書き換えるのは可)だけ設置するようにしてコア部分を触らないようにすることにした。
(もっとやり方があるかもしれないけどとりあえず前に進まないといけないので) /user_data/sample ではなく /sample でアクセスすることしようと思う。