プラグインのフック

新しいAPIのメソッドを追加する

Kanboard は API 呼び出しのハンドルに JSON-RPC ライブラリを使用しています。

以下の要領で、あなたのプラグインから新しいメソッドを追加できます。

$this->api->getProcedureHandler()->withCallback('my_method', function() {
    return 'foobar';
});

$this->container['api'] か、 $this->api がインスタンスのオブジェクト JsonRPC\Server を示します。

さらなる情報はライブラリの文書を参照願います。

新しいコンソールのコマンドを追加

Kanboard は Symfony Console ライブラリをローカルのコマンドラインのハンドルに使用しています。

$this->cli 経由で インスタンスのオブジェクト Symfony\Component\Console\Application が Kanboard に示されます。プラグインから新しいコマンドを追加することができます:
$this->cli->add(new MyCommand());

さらなる情報はライブラリの文書を参照願います。

新しいタスクのフィルターを追加する

タスクの字句解析器が新しいインスタンスを都度返すので、 extend() メソッドか、pimpleによって taskLexer コンテナを拡張しなければなりません。

ここに例を示します:

public function initialize()
{
    $this->container->extend('taskLexer', function($taskLexer, $c) {
        $taskLexer->withFilter(TaskBoardDateFilter::getInstance($c)->setDateParser($c['dateParser']));
        return $taskLexer;
    });
}

いくつかのフィルタークラスの実装の例は、 Kanboard\Filter 名前空間の下のソースコードにあります。

アプリケーションのフック

フックは拡張、置き換えが可能で、デフォルトでの動作はデータのフィルタリングや変更です。 各々のフックは、例えば controller:calendar:user:events のように、ユニークな名前で識別されます。

イベントのフックのリッスン

initialize() メソッド内で、Kanboard\Core\Plugin\Hook クラス内の on() メソッドを呼ぶ必要があります:

$this->hook->on('hook_name', $callable);

最初の引数はフックの名前で、2つめはPHPのcallableです。

フックを一度だけ実行する

いくつかのフックは一つだけのリスナーを持つことができます: model:subtask-time-tracking:calculate:time-spent

  • サブタスクのタイマーが止まった時、消費時間の計算をオーバーライドする
  • 引数:
    • $user_id (integer)
    • $start (DateTime)
    • $end (DateTime)

フックのマージ

“フックのマージ” の挙動は array_merge 関数と同様です。フックのコールバックは配列を返す必要があります。この配列は最初の配列にマージされます。

ユーザーのカレンダーにイベントを追加する例:

class Plugin extends Base
{
    public function initialize()
    {
        $container = $this->container;

        $this->hook->on('controller:calendar:user:events', function($user_id, $start, $end) use ($container) {
            $model = new SubtaskForecast($container);
            return $model->getCalendarEvents($user_id, $end); // Return new events
        });
    }
}

タスクのフォームのデフォルト値をオーバーライドする例:

class Plugin extends Base
{
    public function initialize()
    {
        $this->hook->on('controller:task:form:default', function (array $default_values) {
            return empty($default_values['score']) ?array('score' => 4) : array();
        });
    }
}

マージしたフックのリスト:

controller:task:form:default

タスクのフォームのデフォルト値をオーバーライド - 引数:

  • $default_values: 実際のデフォルト値 (array)

controller:calendar:project:events

  • プロジェクトのカレンダーにイベントを追加する
  • 引数:
    • $project_id (integer)
    • $start カレンダーの開始日 (string, ISO-8601 書式)
    • $end カレンダーの終了日 (string, ISO-8601 書式)

controller:calendar:user:events

  • ユーザーのカレンダーに更にイベントを追加する場合
  • 引数:
    • $user_id (integer)
    • $start カレンダーの開始日 (string, ISO-8601 書式)
    • $end カレンダーの終了日 (string, ISO-8601 書式)

アセットのフック

アセットのフックは簡単に新しいスタイルシートを追加したり、レイアウトに新しくJavaScriptファイルを追加するのに利用されます。この特徴を利用すると、新しいテーマを作成して Kanboard のデフォルトのスタイルをオーバーライドすることができます。

新しいスタイルシートを追加する例:

<?php

namespace Kanboard\Plugin\Css;

use Kanboard\Core\Plugin\Base;

class Plugin extends Base
{
    public function initialize()
    {
        $this->hook->on('template:layout:css', array('template' => 'plugins/Css/skin.css'));
    }
}

アセットのフックのリスト:

  • template:layout:css
  • template:layout:js

フックの参照

フックの参照は、変数の参照はパスされます。

例:

$this->hook->on('formatter:board:query', function (\PicoDb\Table &query) {
    $query->eq(TaskModel::TABLE.'color_id', 'red');
});

上述のコードはボード上のタスクを赤のみで表示します。

フックのリストの参照:

フックのテンプレート

フックのテンプレートは既存のテンプレートに内容を追加することができます。

ダッシュボードのサイドバーに新しい内容を追加する例:

$this->template->hook->attach('template:dashboard:sidebar', 'myplugin:dashboard/sidebar');

テンプレートにローカル変数を付ける例:

$this->template->hook->attach('template:dashboard:sidebar', 'myplugin:dashboard/sidebar', [
    'variable' => 'foobar',
]);

テンプレートにcallableを付ける例:

$this->template->hook->attachCallable('template:dashboard:sidebar', 'myplugin:dashboard/sidebar', function($hook_param1, $hook_param2) {
    return ['new_template_variable' => 'foobar']; // Inject a new variable into the plugin template
});

この呼び出しは ``initialize()``メソッド内の定義に使われます。最初の引数はフックの名前で、2つ目の引数はテンプレート名です。

テンプレート名はプラグイン名の接頭辞で、コロン(:)でテンプレートの場所を示します。

myplugin:dashboard/sidebar を例にとります:

  • myplugin はあなたのプラグイン名 (小文字)
  • dashboard/sidebar はテンプレート名です
  • ファイルシステム上では、プラグインは以下にあります: plugins\Myplugin\Template\dashboard\sidebar.php
  • テンプレートは純粋なPHPで書かれています (エスケープのデータを忘れないでください)

テンプレート名はコアとなるテンプレートの接頭辞はありません.

フックのテンプレートのリスト: