baserCMSプラグイン開発要約

2017/01/26 | 開発記録 | hideichi

http://basercms.net/manuals/3/programmers/4.html
上記URLに書いてあることを短く要約しただけの内容です。詳しくは上記サイトへ。

1, データベース、テーブル
2, お約束、インストール設定他
3, コントローラー、モデル
4, イベントリスナ

1, データベース、テーブル

純粋なテーブル名が「pens」、インストール時のプレフィックスを仮に「bc_」とした場合、プラグイン用プレフィックス「pg_」をはさんで、

bc_pg_pens

これをデータベースに直接登録。

スキーマファイルと初期DBファイル

管理画面(admin) → システム管理 → データメンテナンス
バックアップのダウンロードを行う。
この中に入っている.phpがスキーマファイル。
.csvが初期データのファイルになる。

※自分で作ったプラグインのスキーマファイルが取り出せない場合
http://forum.basercms.net/modules/newbb/viewtopic.php?topic_id=2006&forum=7&post_id=7464

.csvはクリーニングする。
id / created / modified の値を空にして保存。
その他要らないテストデータなんかも消す。
.csv仕様
・文字コードは、Shift-JIS
・各フィールドをカンマで区切る
・各フィールドをダブルコーテーション(”)で囲む
・フィールド内のダブルコーテーションは、ダブルコーテーションでエスケープする
・1行目は、フィールド名の定義とする
・id / created / modified の値は空にする

スキーマの設置

{baserCMSの設置フォルダ}/app/Plugin/{プラグイン名}/Config/Schema/{プレフィックスなしのテーブル名}.php

初期データの設置

{baserCMSの設置フォルダ}/app/Plugin/{プラグイン名}/Config/data/default/{プレフィックスなしのテーブル名}.csv

2,お約束、インストール設定他

インストール用設定ファイルを設置

{baserCMSの設置フォルダ}/app/Plugin/{プラグイン名}/config/config.php

config.phpの内容

<?php
$title = '{プラグイン名(日本語可)}';
$description = '{プラグインの説明文}';
$adminLink = '/admin/{プラグイン名のスネークケース}/{コントローラー名}/index’;
$installMessage = ‘{インストール時に表示するメッセージ}';
$author = '{プラグインの作成者名}';
$url = '{プラグイン作成者のホームページURL}';

インストールスクリプトを設置

{baserCMSの設置フォルダ}/app/Plugin/{プラグイン名}/Config/init.php

init.phpの内容
スキーマファイルと初期DBファイルを読み込む

<?php
$this->Plugin->initDb('plugin', '{プラグイン名}');

バージョンファイルを設置

{baserCMSの設置フォルダ}/app/Plugin/{プラグイン名}/VERSION.txt

VERSION.txtの内容

(例)1.2.3・・・{メジャーバージョン}.{マイナーバージョン}.{パッチ}

3,コントローラー、モデル

プラグインのコントローラーは、BcPluginAppController を継承する。

App::uses('BcPluginAppController', 'Controller');
class DemoController extends BcPluginAppController{
}

モデルは、BcPluginAppModel を継承する。

App::import('Model', 'BcPluginAppModel');
class Demo extends BcPluginAppModel {
}

4,イベントリスナ

BaserEvent : イベントリスナ
本体、または他のプラグインに対して、処理を割り込ませることができる。処理をインターセプトできる。
作れるイベントリスナは以下4つ。

・コントローラーイベントリスナ
・モデルイベントリスナ
・ビューイベントリスナ
・ヘルパイベントリスナ

コールバックメソッド名
$eventsに設定したイベント名から、ドットを外してロワーキャメルケースに変換。
プラグインイベントの場合は、頭にプラグイン名を付ける。

例)Mail.Mail.beforeSendEmail → mailMailBeforeSendEmail

コールバックメソッド内でのデータの参照方法
コールバックメソッドでは、引数に CakeEvent を定義します。
引数名を $event とした場合、イベント固有のデータは、$event->data で参照する事ができます。
また、イベントの発動元のオブジェクトを、$event->subject で参照する事ができます。

コントローラーイベントリスナ
● {プラグイン名}ControllerEventListener
{baserCMSの設置フォルダ}/app/Plugin/{プラグイン名}/Event/{プラグイン名}ControllerEventListener.php

<?php
class PluginNameControllerEventListener extends BcControllerEventListener {
public $events = array();
}

$eventsの配列
{CakePHP標準イベント名}(例:beforeRender)
{ControllerName}.{CakePHP標準イベント名}(例:Users.beforeRender)
本体イベント:Mail.Mail.beforeSendEmail / Mail.Mail.afterSendEmail / Blog.BlogPosts.afterAdd / Blog.BlogPosts.afterEdit / Users.afterAdd / Users.afterEdit / Pages.afterAdd / Pages.afterEdit

モデルイベントリスナ
● {プラグイン名}ModelEventListener
{baserCMSの設置フォルダ}/app/Plugin/{プラグイン名}/Event/{プラグイン名}ModelEventListener.php

<?php
class PluginNameModelEventListener extends BcModelEventListener {
public $events = array();
}

$eventsの配列
{CakePHP標準イベント名}(例:beforeFind)
{ModelName}.{CakePHP標準イベント名}(例:User.beforeFind)

ビューイベントリスナ
● {プラグイン名}ViewEventListener
{baserCMSの設置フォルダ}/app/Plugin/{プラグイン名}/Event/{プラグイン名}ViewEventListener.php

<?php
class PluginNameViewEventListener extends BcViewEventListener {
public $events = array();
}

{CakePHPの標準イベント名}(例:beforeLayout)
{ControllerName}.{CakePHPの標準イベント名}(例:Users.beforeLayout)
本体イベント:beforeElement / afterElement / header / footer
{ControllerName}.{EventName}(コントローラー毎に分けたい場合はこんな感じで)

ヘルパイベントリスナ
● {プラグイン名}HelperEventListener
{baserCMSの設置フォルダ}/app/Plugin/{プラグイン名}/Event/{プラグイン名}HelperEventListener.php

<?php
class PluginNameHelperEventListener extends BcHelperEventListener {
public $events = array();
}

本体イベント:Html.beforeGetLink / Html.afterGetLink / Form.beforeCreate / Form.afterCreate / Form.beforeEnd / Form.afterEnd / Form.beforeInput / Form.afterInput / Form.afterForm / Form.afterOptionForm

イベントリスナ、コード例

/Sample/Event/SampleControllerEventListner.php
---
class SampleControllerEventListener extends BcControllerEventListener {
    // 登録先イベントの定義
    public $events = array(
        'Users.beforeRender',
        'Users.afterEdit',
        'initialize'
    );
    // ユーザーコントローラーにおいてレンダリング直前に呼び出される
    public function usersBeforeRender(CakeEvent $event) {
        // ビューにサンプルという文字列を引き渡す
        $Controller = $event->subject();
        $Controller->set('sample', 'sample');
    }
    // ユーザーコントローラーにおいてユーザー情報更新直後に呼び出される
    public function usersAfterEdit(CakeEvent $event) {
        // ユーザー情報変更後のデータを参照
        var_dump($event->data);
    }
    // ユーザーコントローラーにおいてアクションが実行される直前に呼び出される
    public function initialize(CakeEvent $event) {
        // サンプルヘルパーをコントローラーに追加
        $Controller = $event->subject();
        $Controller->helpers[] = 'Sample';
    }

}

前の記事:

次の記事:

2017/01/26 | 開発記録

コメント/トラックバック

トラックバック用URL:

この投稿のコメント・トラックバックRSS




管理人にのみ公開されます

前の記事:

次の記事:

【二種免許】深視力検査合格のコツや裏技
【二種免許】深視力検査合格のコツや裏技

東京では免許更新の際、ゴールド免許の方や島嶼にお住まいの方以外は、鮫洲...

no image
[cakephp4] dirtyとoriginal

patchEntityすると、変更したところと、変更前の内容が取れる。...

BaserTestCaseで特定プラグインの有無でfixturesを振り分ける
BaserTestCaseで特定プラグインの有無でfixturesを振り分ける

baserCMSのTestCaseで、特定のプラグインの有無を調べて、...

kusanagi で letsencryptが更新されない
kusanagi で letsencryptが更新されない

結論から、アパッチを直接再起動すると直るかも。 systemctl r...

baserCMS プラグインのアップデートスクリプト
baserCMS プラグインのアップデートスクリプト

(参考) http://project.e-catchup.jp/pr...

→もっと見る

PAGE TOP ↑