concrete5.7でパッケージからコアクラスをオーバーライドする
Posted by admin at 20:47 日時 2014/12/23
concrete5.7で、多言語サイト制作時にグローバルエリアを言語ごとに切り替える方法について書きました。このコードがパッケージ化できないかなと思って調べてみたらできましたので、こちらもメモしておきます。
やりたいこと
コアクラスのエイリアス設定を書き換える
今回は、テーマなどで呼ばれている GlobalArea クラスを、パッケージからカスタマイズしてみます。GlobalArea クラスは名前空間のエイリアスが指定されており、単独で呼び出すと \Concrete\Core\Area\GlobalArea クラスに解決されて呼び出されます。このエイリアス設定をパッケージから変更可能です。もちろん、コード中で \Concrete\Core\Area\GlobalArea と名前空間付きで呼び出されている場合はオーバーライド不可能ですが、コアソースの中には少なくとも存在しないでしょう。
パッケージコントローラーの作例
<?php namespace Concrete\Package\MultilingualGlobalArea; use Concrete\Core\Foundation\ClassAliasList; class Controller extends \Concrete\Core\Package\Package { protected $pkgHandle = 'multilingual_global_area'; protected $appVersionRequired = '5.7.3'; protected $pkgVersion = '0.1'; public function getPackageDescription() { return t("Generate Global Areas for each language section on a multilingual site."); } public function getPackageName() { return t("Multilingual Global Area"); } public function on_start() { // クラスエイリアスリストの取得 $list = ClassAliasList::getInstance(); // クラスエイリアスの登録 $list->register('GlobalArea', '\Concrete\Package\MultilingualGlobalArea\Src\Area\GlobalArea'); } }
パッケージコントローラーの on_start() メソッドは、インストールされているパッケージをconcrete5 がロードする際に呼び出されます。ここで、クラスエイリアスを管理する ClassAliasList クラスのインスタンスを取得し、register() メソッドで GlobalArea クラスのエイリアスを登録し直しています。結構カンタンですね!このようにすることで、コアソースを直接書き換えること無く、安全にconcrete5の挙動を自由にカスタマイズすることが可能になります。