Contaoのクラスメソッドをオーバーライドする方法

ここでは、ナビゲーションモジュールを変更して、下位のページがなくてモジュールがまったく表示されない時でも、モジュールを常に表示するように変更することにします。その場合は、下位のベージが存在しないことをユーザーに知らせる表示をします。もちろん、元のクラスを可能な限りそのままにして、将来の更新で保守を不要とします。モジュールとコンテント要素のクラスはContaoのシステム構成で動的に割り当てられ、独自のバージョンと簡単に置き換えることができるようになっています。

カスタムクラスの作成

下位のページがない場合にgenerate()メソッドがモジュールを非表示にする点を除くと、デフォルトのナビゲーションのクラスは希望する殆どの動作を満たしています。したがって、この特定のメソッドだけを変更することが必要なので、元のクラスを拡張して単純にオーバーライドするのが最良のやり方です。これを実現するには、新しいxcustom/ModuleMyNavigation.phpファイルを作成して、カスタムクラスModuleMyNavigationを定義します:

// xcustom/ModuleMyNavigation.php
class ModuleMyNavigation extends ModuleNavigation
{
    public function generate()
    {
        // Execute the original method
        $buffer = parent::generate();

        if (empty($buffer))
        {
            $buffer = 'There are no subpages';
        }

        return $buffer;
    }
}

カスタムクラスを登録

モジュールとコンテント要素のクラスはContaoのシステム構成で動的に割り当てられ、独自のバージョンと簡単に置き換えることができるようになっています。モジュールのクラスの名前はグローバルなFE_MOD配列が保持しています。

// xcustom/config/config.php
$GLOBALS['FE_MOD']['navigationMenu']['navigation'] = 'ModuleMyNavigation';

動的な構成のおかげで、Contaoは次のリクエストから自動的に新しいクラスを読み込んで、ナビゲーションモジュールはまったく表示しない代わりに "There are no subpages"という通知を表示します。この変更はContaoの更新に対応していて、保守を必要としません。


コメントを追加

Lingによるコメント | 2009年9月25日

独自の種類のナビゲーションを追加したい場合は、デフォルトを置き換える代わりに独自のクラスを登録しなければなりません。

$GLOBALS['FE_MOD']['navigationMenu']['mynav'] = 'ModuleMyNavigation';

この場合、データコンテナ配列の"tl_module.php"も強化することを忘れないでください。

$GLOBALS['TL_DCA']['tl_module']['palettes']['extendednav'] = '{title_legend},name,headline,type;{nav_legend},levelOffset…

そして言語ファイルも忘れずに。;)