LoginSignup
0

More than 3 years have passed since last update.

user_data/sample で独自処理をおこないたかったけど

Last updated at Posted at 2018-12-19

はじめに

EC-CUBE2.12.xからEC-CUBE4.xにバージョンアップしたいという依頼。
なるべく外見は変わらないようにという要望もあり/user_data/sample.phpを/user_dataの下に設置できないか検討。
ちなみにsample.phpはDBアクセスもありそれに従い表示しなければならない。

管理画面からページ追加

ページ追加

コンテンツ管理>ページ管理から新規ページ作成
URL:sample ファイル名:sample.twig

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編集

app/Customize/Controller/UserDataController.php
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の場合のコードあり

src/Eccube/EventListener/TwigInitializeListener.php
public function setFrontVariables(GetResponseEvent $event)
{
    :
    if ($route == 'user_data') {
        $routeParams = $attributes->get('_route_params', []);
        $route = isset($routeParams['route']) ? $routeParams['route'] : $attributes->get('route', '');
    }

正直何をやっているか分からなかったけど

src/Eccube/EventListener/TwigInitializeListener.php
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 でアクセスすることしようと思う。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0