EC-CUBE4では、管理画面の[コンテンツ管理] – [ページ管理]から、独自のページを追加作成することができます。
追加したページのURLは「example.com/user_data/sample」のように、URL内に”user_data”という階層が含まれます。”sample”の部分は自由に変更可能ですが、”user_data”は必ず固定で入ります。
そのままでも全く問題ありませんが、移行元のサイトとURL構造を合わせたいとか、何らかの理由でURLから”user_data”を削除したいケースもあると思います。
そこで今回は、この”user_data”を追加ページのURLから削除して、「example.com/sample」でアクセスできるようにする方法をご紹介いたします。また、”user_data”を削除するのではなく、他の文字列に変更する方法も後述します。
EC-CUBE4で追加したページのURLから「user_data」を削除する方法
“user_data”を削除する方法は、AmidaikeBlogさんの「EC-CUBE4でページ管理から画面作成時にURLからuser_dataを無くす方法」を参考にさせていただきました。AmidaikeBlogさんの記事はEC-CUBE4.0.1で解説されていますが、今回はEC-CUBE4.0.3で検証したので若干異なる箇所があります。
URLからuser_dataを削除する
追加ページのURLから”user_data”を削除するには、「/src/Eccube/Controller/UserDataController.php」を変更します。UserDataController.php内の51行目付近に以下のような記述があります。
/**
* @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).*$"})
*/
UserDataController.phpを変更したら、[コンテンツ管理] – [キャッシュ管理]でキャッシュをクリアします。
これで、「example.com/user_data/sample」は404で開けなくなり、「example.com/sample」でページが表示できるようになります。
また、Twig内に記述した以下URL出力用の関数も「example.com/sample」が出力されるようになります。
{{ url('user_data', {'route': 'sample'}) }}
管理画面のページ管理でもuser_dataを削除する
とりあえず、UserDataController.phpを変更したらURLから”user_data”を除外できますが、管理画面上の表記はそのままです。
管理画面の表記も変更するには、「/src/Eccube/Resource/template/admin/Content/page_edit.twig」を変更します。page_edit.twigの108行目付近に以下のような記述があります。
<div class="col-3 pr-0"><span class="align-middle">{{ url('homepage') }}{{ eccube_config.eccube_user_data_route }}/</span></div>
これを以下のように変更します。
<div class="col-3 pr-0"><span class="align-middle">{{ url('homepage') }}</span></div>
page_edit.twigを変更したら、[コンテンツ管理] – [キャッシュ管理]でキャッシュをクリアします。これで、管理画面上のURL表記からも”user_data”が削除されます。
プラグインへの対応
上記変更を加えた場合、プラグイン側でURLの設定(ルーティング)が定義されていた場合、変更したUserDataControllerの内容が参照されて正常動作しなくなる可能性があります。
そのため、「/src/Eccube/Kernel.php」も変更しておく必要があります。Kernel.phpの158行目付近に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);
}
$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);
// 有効なプラグインのルーティングをインポートする.
$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);
}
if (file_exists($pluginDir.'/'.$plugin.'/Resource/config')) {
$builder = $routes->import($pluginDir.'/'.$plugin.'/Resource/config/routes'.self::CONFIG_EXTS, '/', 'glob');
$builder->setSchemes($scheme);
}
}
}
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);
}
if (file_exists($pluginDir.'/'.$plugin.'/Resource/config')) {
$builder = $routes->import($pluginDir.'/'.$plugin.'/Resource/config/routes'.self::CONFIG_EXTS, '/', 'glob');
$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);
}
以下部分を「有効なプラグインのルーティングをインポートする」の処理の下に移動しています。これにより、プラグイン側で定義されたURL設定を優先するようにしています。
$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);
追加したページのURL内の「user_data」を変更する方法
追加ページのURLから”user_data”を削除するのではなく、他の文字列に変更したい場合は、EC-CUBEインストールディレクトリ直下にある.envファイルを変更するだけでOKです。
.envの40行目付近に以下のような記述があります。
#ECCUBE_USER_DATA_ROUTE=user_data
例えば、user_data → testに変更したい場合は、.envを以下のように変更します。
ECCUBE_USER_DATA_ROUTE=test
[コンテンツ管理] – [キャッシュ管理]でキャッシュをクリアすれば、”user_data”の部分が”test”に変わります。
また、Twig内の「{{ url(‘user_data’, {‘route’: ‘sample’}) }}」は、「example.com/test/sample」が出力されるようになります。
あとがき
追加ページURL内のuser_dataを削除したいとか、変更したいといった場合は、上述した手順で対応することができます。user_dataの変更は簡単ですが、削除するとなると結構大変ですね。とはいえ、ファイルを3つ変更すれば良いので、そんなに時間はかかりません。
なお、検証した限りでは他の箇所への影響はなさそうでしたが、他のページが表示できなくなったりプラグインが正常動作しなくなった場合は、デフォルトの状態に戻すようにしてください。作業前は必ずバックアップを取っておきましょう。