MODx Evolutionのウィジェットを拡張する方法

MODxのウィジェットは、テンプレート変数(他のCMSで言うところのカスタムフィールド)の値を出力する際にテンプレート変数タグさえ書いておけば、自動的に好みの形に整形して出力してくれる便利な機能です。しかし、標準で搭載されているウィジェットが微妙なことやウィジェットの拡張がしにくいこともあって、あまり利用されていない機能の一つかもしれません。

そこで、ウィジェットを簡単に拡張・再利用できるように、ウィジェットの機能を外部ファイル化してみました。

今回の方法はコアの修正が必要になります。プラグインでの拡張も検討しましたが、ウィジェット用の関数が他のスニペットやプラグインから呼び出されることがあるため、コアを修正することにしました。

導入方法

以下のファイルをダウンロードして、MODxのルートディレクトリに上書きするだけです。

ウィジェットをクラス化するに当たって、ウィジェットのコードを一部修正していますが、基本的な動作は標準のものと同じです。

ウィジェットの拡張方法

ウィジェットを追加するには、MODxWidgetクラスを継承したクラスを作成し、ファイルを/assets/widgets/へ転送するだけです。追加したウィジェットは、テンプレート変数の編集画面に自動的に表示されます。

以下、標準搭載されているDelimited Listウィジェットを例に説明します。

ウィジェットファイルの作成

ウィジェット名.class.inc.phpという名前でファイルを作成します。ウィジェット名は、以降で作成するウィジェットクラスのクラス名の一部になります。

ウィジェットクラスの作成

MODxWidgetクラスを継承したクラスを作成します。

クラス名はMODxWidgetウィジェット名(先頭1文字を大文字化)とします。ウィジェット名は、ファイルのウィジェット名と一致していなければなりません。

<?php
class MODxWidgetDelim extends MODxWidget
{
}

ウィジェットの設定

ウィジェットクラスにプロパティを追加して、ウィジェットのカテゴリー、表示名、プロパティを定義します。

<?php
class MODxWidgetDelim extends MODxWidget
{
    var $category = 'Formats';  // カテゴリー
    var $name = 'Delimited List';  // 表示名
    var $properties = '&format=Delimiter;string;,';  // プロパティ
}
 

ここで定義したカテゴリーと表示名はテンプレート変数の編集画面に表示されます。また、ウィジェットのプロパティはテンプレート変数の編集画面で展開され、ウィジェットの設定用フォームとして表示されます。

フォームによるウィジェットの設定が不要な場合はvar $properties = null;とするか、$properties自体を省略できます。

ウィジェットの処理

ウィジェットの処理をgetTVDisplayFormatメソッドに記述します。

<?php
class MODxWidgetDelim extends MODxWidget
{
    var $category = 'Formats';  // カテゴリー
    var $name = 'Delimited List';  // 表示名
    var $properties = '&format=Delimiter;string;,';  // プロパティ

    function getTVDisplayFormat($name, $value, $params = array(), $tvtype = '', $docid = '', $sep ='')
    {
        $value = $this->parseInput($value, '||');
        $p = $params['format'] ? $params['format'] : ',';
        if ($p == "\\n") $p = "\n";
        $o = str_replace('||', $p, $value);

        return $o;
    }
}

$nameにテンプレート変数名、$valueにテンプレート変数の値、$paramsにウィジェットの設定(連想配列)、$tvtypeにテンプレート変数の入力タイプ、$docidにドキュメントID、$seqにセパレーター文字列が渡されます。

処理の流れとしては、(必要であれば)parseInputメソッドでテンプレート変数の値をパースし、整形・出力結果を戻り値として返すだけです。

ウィジェットファイルの転送

作成したウィジェットファイルを/assets/widgets/に転送します。テンプレート変数の編集画面を開くと、追加したウィジェットが表示されます。

テンプレート変数の整形にはスニペットを利用する場合も多いかと思いますが、ウィジェット化することでスニペットコールを書く必要がなくなり、修正などの手間も軽減され、再利用がしやすくなります。特に、常に同じ形でテンプレート変数を出力しているのならウィジェットを利用した方が便利でしょう。反対に、状況に応じて出力結果を変えたい場合にはスニペットを利用した方が便利かもしれません。

ちなみに、MODx Revolutionでは、Evolutionで言うところのテンプレート変数の入力タイプやウィジェットの拡張も簡単にできるようになります。リリース候補版が出ていますので、興味のある方はそちらも試してみると良いでしょう。きっと、MODx Revolutionの正式リリースが楽しみになると思いますよ。

M子