EC-CUBE4でページ管理から画面作成時にURLからuser_dataを無くす方法

EC-CUBE Advent Calendar 2018 18日目の記事です。

EC-CUBE4にあるページ管理より新しいページを作成した場合、URLには必ずuser_dataが含まれます。

http://example.com/user_data/hoge

というようになります。

user_dataは別にあっても問題はありませんが、今までカスタマイズしてきた要望の一つとしてuser_dataを無くしたいという方もいました。 そこでこのuser_dataをなくす方法を説明します。

EC-CUBE4.0.1を対象にします。

EC-CUBE4からはEC-CUBE3と異なり、URL定義はアノテーションへと変更されました。そのため、対象となるアノテーションを変更します。

まず、UserDataControllerにあるuser_dataを定義しているルーティングの箇所を変更します。

  • src/Eccube/Controller/UserDataController.php
/**
 * @Route("/%eccube_user_data_route%/{route}", name="user_data", requirements={"route": "([0-9a-zA-Z_\-]+\/?)+(?<!\/)"})
 */

から

/**
 * @Route("/{route}", name="user_data", requirements={"route": "^(?=([0-9a-zA-Z_\-]+\/?)+(?<!\/))(?!logout|%eccube_admin_route%/logout|install).*$"})
 */

%eccube_user_data_route% を無くし、ログアウトも除外できるように追加します。

また、管理画面でのURL表記を変更するため、page_edit.twigも修正します。

  • Resource/template/admin/Content/page_edit.twig
・91行目
{{ url('homepage') }}{{ eccube_config.eccube_user_data_route }}/
↓
{{ url('homepage') }}

こちらはuser_dataを表示上からなくしているだけです。 以上の作業を行うことで、ページ管理から新たなページを作成した場合、URLからuser_dataはなくなります。

[追記] もう一箇所修正する箇所がありました。プラグイン利用時にプラグイン側でルーティングの定義をされていた場合、 先にUserDataControllerが参照されてしまい正常に動作しません。

そのため、Kernel.phpにあるconfigureRoutes関数の内容を一部変更します。

  • src/Eccube/Kernel.php
// 有効なプラグインのルーティングをインポートする.
$plugins = $container->getParameter('eccube.plugins.enabled');
$pluginDir = $this->getProjectDir().'/app/Plugin';
foreach ($plugins as $plugin) {
    $dir = $pluginDir.'/'.$plugin.'/Controller';
    if (file_exists($dir)) {
        $builder = $routes->import($dir, '/', 'annotation');
        $builder->setSchemes($scheme);
    }
}

と記述されている箇所を152行目に移動させて以下の様にします。

  • src/Eccube/Kernel.phpのconfigureRoutes変更後
protected function configureRoutes(RouteCollectionBuilder $routes)
{
    $container = $this->getContainer();

    $scheme = ['https', 'http'];
    $forceSSL = $container->getParameter('eccube_force_ssl');
    if ($forceSSL) {
        $scheme = 'https';
    }
    $routes->setSchemes($scheme);

    $confDir = $this->getProjectDir().'/app/config/eccube';
    if (is_dir($confDir.'/routes/')) {
        $builder = $routes->import($confDir.'/routes/*'.self::CONFIG_EXTS, '/', 'glob');
        $builder->setSchemes($scheme);
    }
    if (is_dir($confDir.'/routes/'.$this->environment)) {
        $builder = $routes->import($confDir.'/routes/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob');
        $builder->setSchemes($scheme);
    }

    // 有効なプラグインのルーティングをインポートする.
    $plugins = $container->getParameter('eccube.plugins.enabled');
    $pluginDir = $this->getProjectDir().'/app/Plugin';
    foreach ($plugins as $plugin) {
        $dir = $pluginDir.'/'.$plugin.'/Controller';
        if (file_exists($dir)) {
            $builder = $routes->import($dir, '/', 'annotation');
            $builder->setSchemes($scheme);
        }
    }

    $builder = $routes->import($confDir.'/routes'.self::CONFIG_EXTS, '/', 'glob');
    $builder->setSchemes($scheme);
    $builder = $routes->import($confDir.'/routes_'.$this->environment.self::CONFIG_EXTS, '/', 'glob');
    $builder->setSchemes($scheme);

}

上記のようにルーティングの読み出す順序を変更することで対応可能です。

EC-CUBE3の時は色々とめんどくさいことをしなければいけませんでしたが、EC-CUBE4では簡単にできます。

amidaike.hatenablog.com

上記対応を行っても反映されないなどがあれば、[ECCUBEROOT]/var/cache ディレクトリを削除してからお試しください。

必要な方には必要なカスタマイズだと思いますので、user_dataをURLから無くしてしまいたい!という方は是非ご利用ください。