2014年12月25日
Movable Type 開発者向けツール MT Studio の提供を開始します
※ こちらのプラグインは PowerStudio という新たな名前で PowerCMS 5 よりオプションプラグインとして同梱・提供しております。
この記事は Movable Type Advent Calendar 2014 の最終日の記事ではありません!
MT Studio は Movable Type のプラグイン、定期バッチ、ウェブアプリケーション(MT::App)、代替テンプレート、テーブル定義と対応したリスティング画面、Data APIエンドポイント等を管理画面から作成し、リアルタイムにデバッグ、完成後にプラグインや代替テンプレートとしてエクスポートできるツールです。Perl、PHPでコードを書くこともできますが、MTタグ(MTML)を使って処理を定義することもできます。
ライセンス
GPL v2.0 又はコマーシャルライセンス(デュアルライセンス)
Movable Type Open Source (MTOS)と組み合わせて利用する場合、GPL v2.0。Movable Typeと組み合わせて利用する場合、コマーシャルライセンスとなります。MTOSと組み合わせて利用した場合、エクスポートしたプラグインと StudioPlayer(後述)のライセンスもコピーレフトの対象となります。コマーシャルライセンス(開発者向けライセンス)についてはただいま準備中です。コマーシャルライセンスのリリース以前に Movable Type 上で利用される場合は、オープンβ版となり、コマーシャルライセンスの正式リリースまではご自由に無償でお使いいただけます。
ダウンロード
alfasado/mt-plugin-mt-studio ~It extends the capabilities of Movable Type developers.~
概要
プラグインの開発、ひな形づくり、管理画面カスタマイズに有用な開発環境です。以下のことが行えます。
- プラグインの開発
- 定期バッチ処理の作成(毎時*分等の指定が可能)
- ウェブアプリケーション(MT::App)の開発
- 独自メソッドの作成
- コールバックプラグインの作成
- config.yamlの作成
- テーブル定義と対応したリスティング画面の作成
- 代替テンプレートの作成
- Data APIエンドポイントの作成
テーブル定義とリスティング画面以外はすべてリアルタイムに動作を確認でき、完成後にエクスポートできます。コードのエディタには JavaScript製のウェブベースエディタ「Ace」を採用しています。また、更新履歴でDiffを確認することが可能です。また、ユニークなのは、PerlやPHPを使わずに簡単な処理であれば MTML(MTタグ)だけで書けてしまうことです。MT Studio では MTSendMail、MTCreateObject、MTWriteToFileといったテンプレートタグ(コマンド・タグ)が利用できるようになります。もちろん、PerlやPHPで通常のプラグインを作成することも可能ですが、最初に簡単なサンプルとして、コードを書かずにテンプレートタグだけでいくつかのプラグインを作成してみましょう。
プラグインのインストール
以下のページからプラグインをダウンロードします。addons/ plugins/ mt-static/ それぞれにファイルをアップロードします(あわせてDynamicMTMLのインストールが必要です)。
管理画面にアクセスし、データベースのアップグレードを実行してください。これでインストールは完了です。
チュートリアル1 : メールフォームを作る
システムメニューへ移動します。左メニュー「カスタムハンドラ」から「新規」を選択します。
実行タイプラジオボタンで、「アプリケーション」を選択し、デフォルトハンドラにチェックを入れます。
次に、スクリプトを実行するチェックボックスのチェックを外します。このチェックを外すことで、MTMLによって動作を定義できるようになります。
メールフォームには以下の2つのタグを使います。
MTSendMail
以下のように引数を指定してMTからメールを送信します。
<MTSendMail to="foo@example.com" subject="Subject" body="Body">
又は、
<MTSetVar name="options{To}" value="foo@example.com">
<MTSetVar name="Bcc[0]" value="bar@example.com">
<MTSetVar name="Bcc[1]" value="baz@alfasado.jp">
<MTSetVar name="options{Bcc}" value="$Bcc">
<MTSendMail subject="Subject" body="Body" options="$options">
MTRedirect
urlモディファイアに指定したURLへリダイレクトします。
はじめに、お名前(input type="text" name="name"),問合せ(textarea name="text"),メール(input type="text" name="mail") からなるフォームを作成します。
<form method="post" action="http://www.example/com/cgi-bin/mt/mt-post2mail.cgi">
<label>お名前 <input type="text" name="name" value="" /></label><br />
<label>メール <input type="text" name="mail" value="" /></label><br />
<label><textarea name="text">
</textarea>
</label>
</form>
このフォームから値を受け取って、メール送信するMTMLテンプレートは下記のようになります。
<mt:SetVarBlock name="subject"><mt:Var name="request.name"> さんからお問い合わせフォームへの投稿がありました</mt:SetVarBlock>
<mt:SetVarBlock name="body">
お名前:<mt:Var name="request.name">
問合せ:<mt:Var name="request.text">
メール:<mt:Var name="request.mail">
</mt:SetVarBlock>
<mt:SendMail To="contact@alfasado.jp" subject="$subject" body="$body">
<mt:Redirect url="https://alfasado.net/">
右側のウィジェットの「プラグインのエクスポート」欄にプラグインの名前を入力し、エクスポートするとプラグインとcgiがダウンロードできます。
プラグインとcgiを設置して、cgiには実行権限を付与します。フォームからポストしてメールが送信されること、指定したURLにリダイレクトされることを確認してください(MTSendMail、MTRedirectは MT Studioが提供するテンプレート・タグなので、MT Studioがインストールされている環境で確認してください)。
このメールフォームに確認画面はありませんが、以下のようにして確認画面を作成することも可能です。
HTMLのフォーム側に以下を埋め込んで、
<input type="text" name="__mode" value="confirm" />
MTMLの側で以下のように分岐します。
<mt:If name="request.__mode" eq="confirm">
<!--確認画面を表示-->
<mt:Else>
<!--送信処理-->
</mt:If>
ユーザーの入力情報を画面に表示させたり、hiddenフィールドのvalueに含める場合は、以下のようにエスケープを忘れないようにしてください。
<mt:Var name="request.name" escape="html">
作成したメールフォームプラグインを MT Studio なしで動かす
MTSendMail、MTRedirectは MT Studioが提供するテンプレート・タグなので、MT Studioがインストールされていない環境ではこのメールフォームは動作しませんが、次の方法で MT Studio のない環境でメールフォームを動かすことができるようになります。
システムプラグイン設定 >MT Studio > ヘルパープラグイン の「StudioPlayerをエクスポート」リンクをクリックしてプラグインをダウンロードします。StudioPlayerプラグインをメールフォームを動かすMTの環境にインストールしてください。
StudioPlayer は MT Studio の機能のうち、テンプレートタグだけを切り出したものです。
チュートリアル2 : 記事投稿時にメール通知するプラグインを作成する
メールフォームと良く似ていますが、今度はMTのコールバックをトリガーにメールを送信するプラグインを作成してみます。
それでは作成していきます。システムメニューへ移動します。左メニュー「カスタムハンドラ」から「新規」を選択します。 実行タイプラジオボタンで、「コールバック」を選択します。 詳細欄にコールバック名「cms_post_save.entry」と入力します(記事が保存された時にコールされます)。
次に、スクリプトを実行するチェックボックスのチェックを外します。このチェックを外すことで、MTMLによって動作を定義できるようになります。
優先度は、コールバックプラグインの実行順を定義するものです。今回は「10」を指定します(他のプラグインによって記事がカスタマイズされているケース等を見越して、10=最後を指定しておきます)。
MTMLテンプレートは以下のようになります。MTSendMailタグ以外はすべてMT標準のテンプレートタグです。MTEntryStatusタグを使って、記事が「公開」の時のみ送信されるようにしています。
<mt:EntryStatus setvar="entry_status">
<mt:If name="entry_status" eq="Publish">
<mt:SetVarBlock name="subject">記事「<mt:EntryTitle>」が<mt:BlogName>に投稿されました。</mt:SetVarBlock>
<mt:SetVarBlock name="body">
タイトル:<mt:EntryTitle>
投稿者 :<mt:EntryAuthorDisplayName>
概要 :<mt:EntryExcerpt>
</mt:SetVarBlock>
<mt:SendMail To="contact@alfasado.jp" subject="$subject" body="$body">
</mt:If>
このカスタムハンドラを(ステータスを「有効」にして)保存すると、このテンプレートが記事の保存時に評価されるようになります。試しに記事をひとつ作成し、公開状態で保存してみてください。このようなメールが送信されたと思います。
チュートリアル3 : アクセスカウンタを作る
次にダイナミックパブリッシングまたはDynamicMTMLで動作するアクセスカウンタを作ってみます。これもPerlやPHPのコードは一切書きません。MTMLのみで作成することができます。
アクセスカウンタを作成するのに使うタグは以下の2つです。
MTSetProperty
MTSetVarタグと同じような働きをします。nameモディファイアで指定した変数に、value属性で指定した値をセットします。MTSetVarタグとの違いは一点、変数はテンプレートが評価された後も保持されるという点です。MTSetVarBlock 相当の MTSetPropertyBlock タグもあります。
MTGetProperty
MTSetProperty タグで設定された値を name属性を指定して取り出すことができます。
それでは作成していきます。今回は、新しいMTタグ「MTAccessCount」を作成してそれをダイナミックパブリッシング又はDynamicMTMLでカウンタ表示させるようにします。 システムメニューへ移動します。左メニュー「カスタムハンドラ」から「新規」を選択します。 実行タイプラジオボタンで、「MTタグ」を選択します。 タグ種別選択ラジオボタンで、ファンクションタグを選択します。詳細欄にタグ名(冒頭のMTは不要です) 「AccessCount」と入力します。
次に、スクリプトを実行するチェックボックスのチェックを外します。このチェックを外すことで、MTMLによって動作を定義できるようになります。
MTMLテンプレート欄に、以下のように記述します。カウントアップには opモディファイアを利用します。
<mt:GetProperty name="current_count" setvar="counter_count">
<mt:SetVar name="counter_count" op="++" value="1">
<mt:GetVar name="counter_count">
<mt:SetProperty name="current_count" value="$counter_count">
テスト用MTMLには以下のように記述します。
現在のアクセス数 : <mt:AccessCount>
一旦保存したら「プレビュー」ボタンをクリックして動作を確認してください。 正しく動作することが確認できたら、右側のウィジェットの「プラグインのエクスポート」欄にプラグインの名前を「AccessCounter」を入力してエクスポートしてください。プラグインを設置し、ダイナミックパブリッシングもしくは DynamicMTML 内で MTAccessCountタグが利用できるようになります。
※このメールフォームを動作させる場合は、StudioPlayerの他に、DynamicMTMLがあわせて必要です。DynamicMTMLなしで動作させる場合は、plugins/StudioPlayer/php/tags/以下のファイルをすべて plugins/StudioPlayer/php/ に移動してください。
チュートリアル4 : ログイン画面をカスタマイズする
Movable Type の管理画面は、MTディレクトリ以下の tmpl/以下にあります。MTディレクトリ以下の alt-tmpl 以下にテンプレートをコピーし(代替テンプレート)、そのファイルをカスタマイズすることで、オリジナルのテンプレートに手を加えずにカスタマイズをすることができます。
MT Studio では、管理画面からこの「代替テンプレート」を管理画面上で作成し、動作確認後、ファイルへエクスポートする機能があります。
ここでは、ログイン画面をカスタマイズする例を取り上げます。
システムメニューへ移動します。左メニュー「デザイン」から「代替テンプレート」を選択します。新規作成ボタンをクリックします。
「テンプレート」フィールドに「chromeless_header」と入力し、MTディレクトリ以下の tmpl/include/chromeless_header.tmpl の中身をテンプレートテキストエリアにコピー&ペーストします(ログイン画面のテンプレートは cms/login.tmpl ですが、この中で tmpl/include/chromeless_header.tmpl をインクルードしているため)。 また、アプリケーションについては MT::App::CMS を選択します。
Movable Type のロゴを表示している以下の箇所をカスタマイズします。
<div id="brand">
<img alt="Movable Type" src="<mt:var name="static_uri">images/chromeless/mt_logo.png" />
</div>
mt-static/plugins/Alfasado/images/alfasado_logo.jpg をアップロードした上で、この箇所を以下のようにカスタマイズします。
<$MTTemplateNote value="カスタマイズ開始"$>
<div style="text-align:center">
<img alt="Movable Type" src="<mt:var name="static_uri">plugins/Alfasado/images/alfasado_logo.jpg" />
</div>
<$MTTemplateNote value="カスタマイズ終了"$>
代替テンプレートについては、バージョンアップ時に再カスタマイズが必要となるため、MTTemplateNoteタグなどで明確にカスタマイズ箇所がわかるようにしておいたほうが良いでしょう。
この代替テンプレートをステータス「有効」で保存して、ログインしていない他のブラウザなどでログイン画面にアクセスします。
代替テンプレートのエクスポート
代替テンプレートのエクスポートは、代替テンプレートの一覧画面から行います。エクスポートするテンプレートを選択して、プラグインアクションから「エクスポート」を選択して、Goボタンをクリックしてください。エクスポートされた chromeless_header.tmpl を MTディレクトリ以下の alt-tmpl/include/chromeless_header.tmpl に設置してください。
※カスタムハンドラや代替テンプレートをエクスポートして、これらを開発しているMTの環境に設置した時は、そのカスタムハンドラや代替テンプレートのステータスを「無効」にしてください。無効にしない場合、設置したプラグインやテンプレートではなく、データベースに保存されている方が優先されてしまいます(コールバックプラグインでは重複実行されます)。
チュートリアル5 : テーブルを追加してリスト画面を作成する
MT Studio ではMTのデータベースにテーブルを追加し、管理画面で一覧表示、データメンテナンスを行うプラグインを作成することができます。
システムメニューへ移動します。左メニュー「拡張スキーマ」から「新規」を選択します。ここでは、name(名前)、maker(メーカー)、text(説明文)からなる、Guitar(Instrument:: Guitar)という拡張スキーマを作成してみます(mt_guitarというテーブルを作成し、id(自動生成)、name、maker、textというカラムを作成するイメージです。
プラグイン名、モジュール名に「Instrument」「Guitar」とそれぞれ入力し、カラムの定義をしていきます。+でカラムの追加、-で削除、↑↓でカラムの順序入れ替えができます。メタ情報とオプションを指定します。
audit にチェックを入れると、オブジェクトの作成日時と変更日時を自動的に登録するようにします。created_on, created_by, modified_on, modified_byの4つのカラムが自動的に追加されます。
保存をクリックしてください。
拡張スキーマについては、保存しただけでは有効になりません(カスタムハンドラや代替テンプレートは保存しただけで有効になります)。
プラグインのエクスポート
「エクスポート」ボタンをクリックするか、拡張スキーマの一覧画面のプラグインアクションから、プラグインをエクスポートできます。エクスポートしたプラグインを設置し、管理画面からデータベースをアップグレードします。
システムメニューの左メニューに「ギター」メニューが作成され、一覧、新規の2つのメニューが追加されていることを確認してください。
※一覧画面、編集(作成)画面にアクセスできるのはシステム管理者権限を持ったユーザーとなります。作成したオブジェクトを MTタグで出力したい、また個別アーカイブにしたい、専用の権限を用意したい、ブログ、ウェブサイトスコープでオブジェクトを管理したい、等の場合は、PowerCMSのカスタムオブジェクト(カスタム項目)をご利用ください。
チュートリアル6 : Data APIエンドポイントの作成
Movable Type 6から実装された Data APIのエンドポイントを追加することができます。ここでは、MTのバージョンを返すだけの簡単なエンドポイントをMTタグだけで実装してみます。/mt-data-api.cgi/v1/mt_version というリクエストを送ると、以下のようなデータを返すエンドポイントを作成します。
{version":"6.0.5"}
システムメニューへ移動します。左メニュー「カスタムハンドラ」から「新規」を選択します。
実行タイプラジオボタンで、「Data API エンドポイント」を選択します。
詳細欄にはリクエストメソッドとエンドポイントのパスを指定します(複数指定はできません)。例: GET /v1/sites/1/hello → 'GET,/sites/:site_id/hello' など。ここでは、「GET,/mt_version」と入力します(Data APIのバージョンはシステムプラグイン設定で変更可能です)。
次に、スクリプトを実行するチェックボックスのチェックを外します。このチェックを外すことで、MTMLによって動作を定義できるようになります。
MTMLテンプレートに以下のように入力します。
{version":"<mt:Version>"}
動作確認はプレビュー以外に右カラムの「リンク」ウィジェットからも行うことができます。
動作確認できたらプラグインをエクスポートしてください。Data API エンドポイントの実行には、StudioPlayerプラグイン及びDynamicMTMLは必要ありません。
チュートリアル7 : Perl、PHPでMTタグ(ファンクションタグ)を作る
これまでは、PerlやPHPを書かずにMTタグだけでプラグイン等を作成する方法についてご紹介しましたが、もちろんPerlやPHPを直接記述してプラグインを作成することも可能です。 例として、簡単なファンクションタグを作成する方法をご紹介します。システムスコープへ移動し、左メニューの「カスタムハンドラ」「新規」を選択します。実行タイプラジオボタンで、「MTタグ」を選択します(この時点で、引数などのひな形が自動挿入され、コードを入力できるようになります)。
Perl
sub _hdlr_function {
my ( $ctx, $args, $cond ) = @_;
}
PHP
<?php
function smarty_function_mtfunction ( $args, &$ctx ) {
}
Perl、PHPともに、以下のコードを挿入します。
return 'Hello Movable Type!';
テスト用MTMLには、以下を入力します。
<MTHello>
「詳細」欄にタグ名「Hello」を入力します。
「プレビュー」「プレビュー(PHP)」をクリックします。別ウィンドウが表示され、テスト用MTMLがビルドされます。
「保存」をクリックすると、MTHelloタグが利用可能になります。
複数のカスタムハンドラを一つのプラグインにマージする
各々のカスタムハンドラの画面の右カラムウィジェットからエクスポートした場合、一つの処理が一つのプラグインとしてエクスポートされますが、一覧画面から複数のカスタムハンドラを一つのプラグインとしてエクスポートすることができます。代替テンプレートや拡張スキーマも同様に一覧画面から纏めて一つのプラグインとしてエクスポートが可能です。
可能性は無限大!
この記事では、ウェブアプリケーション、コールバックプラグイン、テンプレートタグ、代替テンプレート、拡張スキーマ、Data APIエンドポイントを作成する例を取り上げました。
PerlやPHPのコードを書けば、MTのプラグインでできることをリアルタイムにデバッグしながら開発することができます。MTのリビジョン機能を使っており、更新履歴や差分表示など、開発のための機能も実装されています。
これまでプラグインを作成したことのない人は、まずはMTタグで小さな作品を作ってみてください。これまでプラグインをガリガリ書いていた人はリアルタイムデバッグの便利さを是非体感してみてください。
それでは、よいクリスマスをお過ごしください!
コメントを投稿する