Re: 既存Block(autonav)のController部の修正方法

2013年4月15日 at 10:38

せっかくなので、質問者は理解されて使っておられるようですが、バージョン5.6から可能になったコアクラスのオーバーライドについてまとめておきます。


コアクラスとは…
concrete5の主要な機能はcoreディレクトリーに置かれ、従来のクラスはコアクラスを継承するようになりました。このことにより、従来はクラス単位でのオーバーライドしか出来ませんでしたが、メソッド単位のオーバーライドが可能になりました。


コアクラスのブロックのコントローラー(例:オートナビブロックのコアクラス)
/concrete/core/controllers/blocks/autonav.php

オートナビの実際の処理が記載されているクラスになります。

class Concrete5_Controller_Block_Autonav extends BlockController {
// 色々なメソッドやプロパティが格納されています
}



ブロックのコントローラー(例:オートナビブロックのコントローラー)
/concrete/blocks/autonav/controller.php

concrete5はブロック単位でのMVCを実現していますが、そのコントローラーに当たるクラスです。中身はコアクラスを継承しているだけで、空になっています。

class AutonavBlockController extends Concrete5_Controller_Block_Autonav { }
class AutonavBlockItem extends Concrete5_Controller_Block_AutonavItem { }



ブロックのコントローラーのユーザー領域でのオーバーライド
/blocks/autonav/controller.php

concreteフォルダの上に並んでいる空の各フォルダはユーザー領域となっており、ここにconcreteフォルダ内と同階層、同名のファイルを置くことでconcreteフォルダ内のファイルをオーバーライド(上書き)することができます。

class AutonavBlockController extends Concrete5_Controller_Block_Autonav {
// たとえば、独自メソッドを追加したり
public function myGreatMethod() {
}
}
class AutonavBlockItem extends Concrete5_Controller_Block_AutonavItem { }


コアクラスにある同名のメソッドを用意すれば、メソッド単位でオーバーライド(上書き)することで、より細かく、柔軟にconcrete5の動作をカスタマイズすることが可能になります。


※ 注意点

1. オーバーライドキャッシュ
concrete5.6以降導入されたオーバーライドキャッシュにより、どのクラスをオーバーライドするかはキャッシュに保持されています。このことにより高速化を実現していますが、同時にキャッシュが保持されている期間はあたらしいオーバーライドが反映されません。管理画面からのキャッシュのクリアを行いましょう。
また、管理画面の環境設定から、オーバーライドファイルがconcrete5に認識されているかどうかを確認することができます。

2. クラス名はかならず同じにする

クラス名にスペルミスがあるといつまでたっても読み込まれませんのでご注意を。

Re: 既存Block(autonav)のController部の修正方法

2013年4月15日 at 23:17
詳細な説明ありがとうございます。

ご指摘の通りオーバーライドキャッシュをオフにしたところ、
controllerを認識することが出来ました。

お騒がせしまして申し訳ありませんでした。