Blog

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の挙動を自由にカスタマイズすることが可能になります。

パッケージ全体のソースコードはこちら

GitHubにて公開しています


Share this entry

Blog Entry Topics