Skip to content

Japanese plugin dev 1 2

uehatsu edited this page May 10, 2011 · 11 revisions

レジストリ、YAMLについて

はじめに

今回は、プラグイン開発の中心となるMovable Typeのレジストリについてと、プラグインやテーマのレジストリ設定に利用するYAML形式のファイルについて解説します。

レジストリの解説

レジストリとはMovable Typeの内部構造を階層的に保持するための仕組みです。階層的に設定を保持するという意味でMS Windowsのレジストリと似ています。

MT::Core ($MT_DIR/lib/MT/Core.pm)にある"$core_registry"をご覧ください。設定項目や初期値が細かく記述されていることが解ります。現時点で内容を把握する必要はありませんが、プラグイン開発の際に迷った場合など参照する事で解決策が見つかる場合もあります。

BEGIN {
    $core_registry = {
        version        => MT->VERSION,
        schema_version => MT->schema_version,
        object_drivers => {
            'mysql' => {
                label          => 'MySQL Database (Recommended)',
                dbd_package    => 'DBD::mysql',
                config_package => 'DBI::mysql',
                display =>
                    [ 'dbserver', 'dbname', 'dbuser', 'dbpass', 'dbport', 'dbsocket' ],
            },
(中略)
        applications      => {
            'xmlrpc'   => { handler => 'MT::XMLRPCServer', },
            'atom'     => { handler => 'MT::AtomServer', },
            'feeds'    => { handler => 'MT::App::ActivityFeeds', },
            'view'     => { handler => 'MT::App::Viewer', },
            'notify'   => { handler => 'MT::App::NotifyList', },
            'tb'       => { handler => 'MT::App::Trackback', },
            'upgrade'  => { handler => 'MT::App::Upgrade', },
            'wizard'   => { handler => 'MT::App::Wizard', },
            'comments' => {
                handler => 'MT::App::Comments',
                tags => sub { MT->app->load_core_tags },
            },
            'search'   => {
                handler => 'MT::App::Search::Legacy',
                tags => sub { MT->app->load_core_tags },
            },

他にもたくさんのレジストリ情報が記載されています。たとえば、メニューに関連するレジストリの初期値はMT::App::CMS ($MT_DIR/lib/MT/App/CMS.pm)に記載されています(“&core_menus”, “&core_compose_menus”)。

sub core_menus {
    my $app = shift;
    return {
        'website' => {
            label => "Websites",
            order => 50,
        },
        'blog' => {
            label => "Blogs",
            order => 100,
        },
        'entry' => {
            label => "Entries",
            order => 200,
        },
(略)
        'tools:do_export_theme' => {
            order      => 10000,
            mode       => 'do_export_theme',
            view       => [ 'blog', 'website' ],
            display    => 0,
        },
        'tools:backup' => {
            order      => 10000,
            mode       => 'backup',
            view       => [ "blog", 'website', 'system' ],
            display    => 0,
        },
    };
}
sub core_compose_menus {
    my $app = shift;

    return {
        compose_menus => {
            label => 'Create New',
            order => 100,
            menus => {
                'entry' => {
                    label      => "Entry",
                    order      => 100,
                    mode       => 'view',
                    args       => { _type => 'entry' },
                    permission => 'create_post',
                    view       => "blog",
                },
(略)
                'blog:create' => {
                    label         => "Blog",
                    order         => 400,
                    mode          => 'view',
                    args          => { _type => 'blog' },
                    permit_action => 'use_blog:create_menu',
                    view          => "website",
                },
            },
        },
    };
}

プラグインにより設定や表示を変更する場合、レジストリへ項目を上書きや追加します。これによりMovable Typeをカスタマイズすることができます。

YAMLとは?YAMLの利便性

YAMLは"YAML Ain’t a Markup Language"の略で、HTMLのようなマークアップ言語ではありません。テキストで書かれデータ構造を記載するのに適した記法になっています。同じような理由でつかわれる言語としてXMLがありますが、YAMLの記載がシンプルであることより、設定やAPIからのデータ転送などにもYAMLが利用することが増えてきています。

XML

<xml version="1.0">
<address>
  <first_name>Taro</first_name>
  <last_name>YAMADA</last_name>
  <email>ytaro@example.com</email>
  <company>
    <name>Six Apart Ltd.</name>
    <street_address>
      5-2-39 Akasaka, Entsuji-Gadelius Bldg. 7F, Minato-ku, Tokyo, 107-0052, Japan
    </street_address>
  </company>
</address>
YAML

address:
    first_name: Taro
    last_name: YAMADA
    email: ytaro@example.com
    company:
        name: Six Apart Ltd.
        street_address: >
                        5-2-39 Akasaka, Entsuji-Gadelius Bldg. 7F,
                        Minato-ku, Tokyo, 107-0052, Japan

Movable Typeのプラグイン開発やテーマ作成でもYAMLは活用されています(config.yaml, theme.yaml, etc.)

id: MyPlugin01
name: Sample plugin registration
version: 1.0
description: Sample plugin registration
author_name: Plugin author
author_link: http://www.example.com/about/
doc_link: http://www.example.com/docs/

YAMLの文法

YAMLの記述方法はとてもシンプルです。インデントをきっちりそろえる必要があるのが注意点です。

インデント(スペース2個、もしくは4個が多い。TABは利用できません)

parent:
    child:
        grandchild: hoge
インデント 悪い例(childとfooが、grandchildとbarが同じインデントなっていない。
同じ階層なものはインデントを明示的に合わせる必要があります。)


parent:
    child:
        grandchild: hoge
  foo:
    bar: foobar
配列

- foo
- bar
ハッシュ

child01: foo
child02: bar
改行を保持したままの記述(設定内容 2行)

description: |
        StyleCatcher lets you easily browse through styles and
        then apply them to your blog in just a few clicks.


=>
StyleCatcher lets you easily browse through styles and
then apply them to your blog in just a few clicks.
改行を保持しない記述(設定内容 1行、改行をスペース一文字に置き換え)

description: >
        StyleCatcher lets you easily browse through styles and
        then apply them to your blog in just a few clicks.

=>
StyleCatcher lets you easily browse through styles and then apply them to your blog in just a few clicks.

まとめ

今回はプラグイン開発に必須なレジストリの概念と、YAMLの利用方法について解説しました。

レジストリについてはハードルが高いと思いますが、プラグイン開発を進めると徐々に解ってきますので次のステップに進みましょう。

プラグイン開発ガイド インデックス

  1. プラグイン開発のためのファーストステップ
  2. レジストリ、YAMLについて
  3. 環境変数について
  4. プラグインのローカライゼーションについて
  5. テストドリブンでのプラグインの開発について
  6. グローバル・モディファイアプラグインの開発について
  7. ファンクションタグ プラグインの開発について
  8. ブロックタグ プラグインの開発について
  9. コンディショナルタグ プラグインの開発について
  10. プラグインのデバッグ
  11. プラグインの設定方法
  12. コールバックとフックポイント
  13. スケジュールタスクの開発
  14. MTオブジェクトの利用方法
  15. 独自オブジェクトの作成
  16. 新規アプリケーションの作成
  17. Transformerプラグインの開発
  18. 管理画面のメニュー修正
  19. リストアクションの追加
  20. 動作モードの追加とモーダルウィンドウの表示
  21. 外部Web APIとの連携
  22. 権限とロール
Clone this wiki locally