Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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 でアクセスすることしようと思う。

ma33588
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away