はじめに
EC-CUBEで固定ページを作成するときに、管理画面経由で作成すると、user_data
というURLが付いちゃうのと、データベースの値に左右されてしまう点が気になったので、そもそもコントローラとか追加したらページ作成できるのではないかと思って試してみました。
(あと地味にURLの最後をスラッシュで終われない点も気になりました)
こちらでのメリットとしては、プログラム側に記述されているので、データベースの値を併せなくてもページ自体は表示できるので、Gitなどでファイルを共有すればページも閲覧できるようになる点かと思います。
注意点
下記の流れはEC-CUBE3のコアファイルを編集しています。「とりあえずページ追加したい」という方以外は下記の流れで作らない方が良いと思います。
ルーティング
ルーティングは、src/Eccube/ControllerProvider/FrontControllerProvicer.php
で操作しているようです。
中身はSilexのルーティングの記述ですね。
例えば、
-
/foo/
でアクセスできるページを -
src/Eccube/Controller/StaticPageController
の -
foo
メソッドから呼び出して -
foo
という名前でurl
関数から呼び出せる
様にする場合下記のような記述になります。
$c->match('/foo/', '\Eccube\Controller\StaticPageController::foo')->bind('foo');
特にこの記述がコアファイルに直接記入してしまっているのが問題です。他にいい方法がアレば…。
プラグインでも良いんですけど、結局インストールと有効化することでDBに依存してしまうのが気になる。
コントローラ
次にStaticPageController
を作ってみます。
今回は単純に静的なページを追加するイメージで考えていますので、単純にビューを呼び出すだけの記述になりますが、特定カテゴリーの商品の一覧とかを表示させたい場合は、ここから必要なRepositoryを呼べばよいはずです。
<?php
namespace Eccube\Controller;
use Eccube\Application;
class StaticPageController extends AbstractController
{
public function foo(Application $app)
{
return $app->render('Static/foo.twig');
}
}
これで、Static/foo.twig
が読み込まれるようになりました。
ちなみに、上記はコアファイル配下に設置していますが、composer.json
にautoloadされるディレクトリを追加して、別の場所にコントローラを追加してしまえば、コアファイルとの切り離しも可能だと思います。
ビュー
ビューファイルはコアファイルに含める必要はありません。
app/template/default/Static/foo.twig
を作成すれば、src
配下のファイルよりも優先されて読み込まれます。
なお、管理画面上から追加していないので、titleやmeta情報などは少し強引に設定する必要があります。
{# titleに値を入れれば<title>追加される #}
{% set title = 'ページタイトル' %}
{# レイアウトテンプレートを指定 #}
{% extends 'default_frame.twig' %}
{# メタ情報を挿入する #}
{% block meta_tags %}
<meta name="description" content="ページの説明ほげほげ">
{# OGP情報とか、canonicalとか #}
{% endblock %}
{# CSSを読み込む #}
{% block stylesheet %}
<link rel="stylesheet" href="{{ app.config.front_urlpath }}/path/to/foo.css" type="text/css" media="all">
{% endblock %}
{# JavaScriptを読み込む #}
{% block javascript %}
<script src="{{ app.config.front_urlpath }}/path/to/foo.js"></script>
{% endblock %}
{% block main %}
{# メインコンテンツエリア、ここに色々記述する #}
{% endblock %}
これで/foo/
にアクセスるとページが表示されるようになっているはずです。
終わりに
とりあえずは思ったとおりにページが作れて満足です。(他にもっといい方法がありそうですけども)
EC-CUBE4ではこういった要望も満たされてると良いんですが調べていません、どうなんでしょうね?