concrete5でパッケージからシングルページをオーバーライドする(〜5.6.x)
Posted by admin at 11:28 日時 2014/05/08
通常、パッケージからシングルページを追加することはできても、コアのシングルページをオーバーライドする手段は用意されていません。該当するシングルページにパッケージIDを与えるという裏ワザで回避しています。ここまでしなくても普通にユーザー領域に置いてオーバーライドすればいいのですが、どうしてもパッケージからオーバーライドしたいと言うときはこれで何とかなります。アンインストールの際にパッケージIDを消しておかないと、コアのシングルページが消えてしまうので注意です。
パッケージの controller.php の install()
uninstall()
それぞれのメソッドで既存のシングルページに、このパッケージのIDを設定しています。
<?php defined('C5_EXECUTE') or die("Access Denied."); class OverrideSinglePagePackage extends Package { protected $pkgHandle = 'override_single_page'; protected $appVersionRequired = '5.6.3'; protected $pkgVersion = '0.1'; public function getPackageDescription() { return t("Override single page package"); } public function getPackageName() { return t("Override Single Page"); } public function install() { $db = Loader::db(); $pkg = parent::install(); $cID = Page::getByPath('/login')->getCollectionID(); $db->execute('update Pages set pkgID = ? where cID = ?', array($pkg->pkgID, $cID)); } public function uninstall() { $db = Loader::db(); $cID = Page::getByPath('/login')->getCollectionID(); $db->execute('update Pages set pkgID = 0 where cID = ?', array($cID)); parent::uninstall(); } }
このパッケージのハンドルは override_single_page
ですので、シングルページのコントローラーとビューを下記の位置に置くと、コアのログインの挙動を上書きすることができます。
packages/override_single_page/controllers/login.php
packages/override_single_page/single_oages/login.php
2014/6/1 追記
この方法でオーバーライドしても、/loginにアクセスした場合は問題ないのですが、例えば/page_forbiddenにアクセスした場合のログインフォームには適用されないということが分かりました。なので、あまりうまく行かない。シングルページは普通にユーザー領域に置いた方がいいということかもしれない。