0
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

はじめに

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

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
Sign upLogin
0
Help us understand the problem. What are the problem?