デザイン開発部の大嶽です。
今日は路線変更で、EC-CUBEネタに迫ってみたいと思います!
題材はEC-CUBE3。
弊社でも、基本的な商品登録機能がそろっているので、一部のサイトで利用したりしています。
ちょっと調べると出てきそうな内容ですが、レアなTIPSでまとめてみました!
- HTTPS強制なカスタムURLを作ってみる
- 商品登録日を編集する
- 問合せフォームの通知をメールテンプレ化してみる
- 無理やり$app[‘config’]を書き換える
- 無理やりSession取出す
- DynamicServingしてみる
この記事はEC-CUBE3.0.12を元に記載しています。
なおEC-CUBE3本体をカスタマイズする内容も含むため、利用する際には十分な検証の上、自己責任にてお願いします。
1.HTTPS強制のカスタムURLをつくる
EC-CUBE3ですが、基本的なURLは本体側で用意されているものがあり固定になっています。
ユーザーページ定義で作成したページなどのURLを変えたいことはあると思います。
Pluginなどのソースをいみると、ServiceProviderのregisterメソッドに下記のような記述があります。
1 | $app->match('/hogehoge/fuga','\Plugin\Controller::index')->bind('hogehoge'); |
プラグイン側で適当なコントローラを割当てて、bindにユーザーページ定義で設定したページURLを割当てると表示されるようにはなります。
ただ、この方法だとhttpでアクセスしたときにhttpsへ強制リダイレクトが動作しません。
EC-CUBEのソースをみるとrequireHttps()を設定してSSLを強制するよう実装しています。
requireHttps()は何かと調べてみると、・・・silexのrouting設定で用意されているメソッドのようですね。
http://silex-users-jp.phper.jp/doc/html/usage.html
最終的に以下のように記述すると強制的にhttpsへリダイレクトかかることになります。
1 2 3 | $app->match('/hogehoge/fuga','\Plugin\Controller::index') ->bind('hogehoge') ->requireHttps(); |
補足ですが、EC-CUBE3のソース上ではContorllerProviderを用意して一括で割当てる実装をしているため書き方が若干異なっています。
EC-CUBE3は、Symfonyのリファレンスも眺めつつ、silexのリファレンスも見る必要があるので、中々骨がおれます。
2.商品登録日を編集する
EC-CUBE3の商品ソート、登録日でソートされてますよね?
登録日を変えたいと思うことはしばしばあると思います。
そんな時は下記2ファイルをカスタマイズしてしまいましょう。
src/Eccube/Form/Type/Admin/ProductType.php
# builderで項目を追加している部分に以下の実装を加えます。
1 2 3 4 5 | + ->add('create_date', 'date', array( + 'label' => '登録日', + 'required' => false, + 'mapped' => true, + )) |
src/Eccube/Resource/template/admin/Product/product.twig
# 管理画面のテンプレートで表示したい場所に以下の実装を加えます。
1 | + {{ form_row(form.create_date) }} |
どうですか上手くいきましたか?
mappedを指定しておくとformとdoctrineの処理がいい感じでごにょごにょしてくれるので特に登録処理に手を加えることもなく変更ができるようになります。
formとdoctrineのマッピングが便利な一面ですね。
ただ、少し複雑なことをしようとするとグぐっと難易度が上がってくので困りものです。
3.問合せフォームの通知をメールテンプレ化してみる
注文メールの通知はメール設定のテンプレートが使われているのですが、問合せの通知メールは何故か固定テンプレートになっています。
テンプレートを参照するように書き換えてみましょう。
src/Eccube/Service/MailService.php
このソースのsendContactMailメソッドを修正します。
https://github.com/EC-CUBE/ec-cube/blob/master/src/Eccube/Service/MailService.php#L174-L192
注文メールの処理にテンプレートを読込むように記述してあるので、参考にします。下記のような修正を追加します。
1 2 3 4 5 6 | $MailTemplate = $this->app['eccube.repository.mail_template']->find(5); $body = $this->app->renderView('Mail/contact_mail.twig', array( 'header' => $MailTemplate->getHeader(), 'footer' => $MailTemplate->getFooter(), 'data' => $formData, |
テンプレートのIDは、直接DBを参照するか、メール設定の編集を開いたときのURLで確認します。
4.無理やり$app[‘config’]を書き換える
リクエストが発生するとindex.phpに書かれている$app->run()が走るので結果的にsrc/Eccube/Application.phpが一通り実行されてPluginやら何やらと呼び出されます。
configもパースされてセットされてしまいます。
https://github.com/EC-CUBE/ec-cube/blob/master/src/Eccube/Application.php#L93-L112
https://github.com/EC-CUBE/ec-cube/blob/master/src/Eccube/Application.php#L1028-L1033
テンプレートを読込むパスも初期化されるので、Controller側のEventフックで書き換えても時すでに遅しなんですね。
といった訳で本体のソースを眺めてみる限り下記のイベントを定義してあるので、このタイミングで書き換えてみることに。
https://github.com/EC-CUBE/ec-cube/blob/master/src/Eccube/Application.php#L649-L666
これは、Applicationインスタンスが実行する前に発生するイベントになります。
適当なPluginを用意して、フックするイベントを定義します。
eccube.event.app.before:
– [onAppBefore, NORMAL]
このイベント時に$app[‘config’]を取得して書換えたもので上書きしてあげるとうまくいきます。
1 2 3 | $config = $this->app['config']; $config['template_code'] = 'hoge'; $this->app['config'] = $config; |
5.無理やりSessionを取出す
前述のconfigの書換えを行う際に判断条件としてSessionの情報を元に判定したかったのですが、そんな簡単にはいかず落とし穴が・・。
- Sessionの情報がない!?
前述のconfig書換えのEventでapp.beforeでRequestからSessionを取得すると中身がありません。
Applicationインスタンスの初期化が始まる前に発生しているイベントになるので、リクエストの管理を制御しているSymfonyの挙動に依存します。
1 2 3 4 5 6 7 8 | $ss = new Session(); if($app['request']->cookies->get('eccube')){ $ss->setId($app['request']->cookies->get('eccube')); } if(!$ss->isStarted()){ $ss->start(); } |
こんな感じになります。
cookieにセッションIDが格納されているので、SymfonyのSessionオブジェクトにセットしてstartするとSessionの情報が格納されます。
6.DynamicServingしてみる
最近はレスポンシブでサイトを制作することが多くなっていると思います。
EC-CUBE3の場合、標準動作がレスポンシブ仕様となっているため、テンプレートは1パターンのみになっていたりします。
ただ、デザインのコンテンツ構成を決める際、PCとSPでコンテンツを別々にしたいといった話もチラホラ。
早速、ぐグってみました。
どうやらWeb制作の用語としてダイナミックサーブと呼ばれているらいですね。
そんな訳で、EC-CUBE3をEC-CUBE2の時のようにダイナミックサーブ化できないか検証してみたのがこちら。
色々調べてみること数週間・・。
- テンプレートを動的に変えれれば完成ぢゃ?
- どうやって動的にかえるか・・・?
- 管理画面どうする?
- ユーザー定義ページどうなる?
- キャッシュどうする?
調べること盛りだくさんですね。
EC-CUBE2から判定用のクラスをもってきて、ごにょごみょと本体に手を加える色々。
動的に切替わる部分だけプラグインにのっけてみた差分がこちら
実際に動いているサイトがこちら。
長くなりましたが全然レアなTIPSではなかったですね。
どちらかといえば少し小難しいTIPSかもしれません。
興味のある方は、是非カスタマイズしてみてください!
それでは、また-。