Upload
takeuchi-yuichi
View
893
Download
1
Embed Size (px)
Citation preview
{
プラグイン作者脳になろう
実案件で学ぶプラグイン開発フロー
@takeyuweb竹内雄一 Yuichi TakeuchiMTDDC Meetup TOKYO 2014
このセッションについて
• プログラマ向けの話をします。
• プラグイン作成”入門”的な内容ではありません。
• 実案件でプラグインを作ったときの作業フローについてお話しします。
自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
竹内雄一 @takeyuweb
タケユー・ウェブ(2008~) フリーWebエンジニア
Rails / MT / AngularJS / Linux / AWS etc…
MT東京
Ruby好き
Lancers認定ランサー
2014.4~さいたま市
↑週3ぐらいでいます。
竹内雄一 @takeyuweb
MTプラグイン開発経験
たぶん60個ぐらい
業務(非公開)
趣味
KetaiPost (2010)
初プラグイン
携帯メール投稿
息子の成長記録
自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
できること、種類からみた分類 ある処理に別の処理を挟む「コールバック」 管理画面を変更「トランスフォーマー」 テンプレートタグ バッチ処理 DataAPI拡張 MTフレームワーク独自アプリ
などなど…大抵のことはがんばればできます。
プラグインについて
学習資料①
Movable Type 開発者向けガイド
GitHubにある
詳しい
基本的なことはここで写経してればOK
学習資料②
Movable Typeプラグイン開発入門
MT4の本だけどMT6でも基本は同じ
私も買いました。
学習資料③
Movable Type Developer’s Guide Volume 1
MT4の本だけどMT6でも基本は同じ
私も買いました。
ソースコード
MT本体
今でもよく読む、今日も読む
公開されている他のプラグイン
学習資料④
自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
実際のご依頼
「メールマガジンをMTでやりたい」
レンタルサーバで動かしたい
できればHTMLメールでやりたい
購読者は6000人ぐらいで月1配信
「ではプラグイン作りましょう」
プラグイン作成の動機
自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
メールマガジンをMTでやりたい
配信先を管理
メールマガジンを管理
指定日時配信
HTMLメール
配信数は10000通程度
要件を洗い出す
メールマガジンをMTでやりたい
配信先を管理…MTユーザ&ロール
メールマガジンを管理
指定日時配信
HTMLメール
配信数は10000通程度
MTに落とし込む
配信先を管理
MTのユーザを配信先に メルマガ受信【権限】
【ロール】に権限設定
「メルマガ会員」ロール追加
配信時点のメルマガ受信ユーザへ!
メールマガジンをMTでやりたい
配信先を管理…MTユーザ&ロール
メールマガジンを管理…ブログ記事
指定日時配信…ブログ記事
HTMLメール
配信数は10000通程度
MTに落とし込む
メールマガジンを管理
ブログ記事=メールマガジン記事
記事からメール本文
公開時に配信
指定日時配信
記事の公開日時指定
標準機能でいけそう
メールマガジンをMTでやりたい
配信先を管理…MTユーザ&ロール
メールマガジンを管理…ブログ記事
指定日時配信…ブログ記事
HTMLメール…テンプレート処理&MTのメール
配信数は10000通程度
MTに落とし込む
HTMLメール
MTテンプレートで
<$MTEntryBody$>
本文作成用テンプレートを追加
本文を構築
MTのメール送信機能
通知メールなどのやつ
メールマガジンをMTでやりたい
配信先を管理…MTユーザ&ロール
メールマガジンを管理…ブログ記事
指定日時配信…ブログ記事
HTMLメール…テンプレート処理&MTのメール
配信数は10000通程度…非同期処理
MTに落とし込む
配信数は10000通程度
タイムアウトの危機
非同期処理
Ex)公開キュー
配信先リスト作成
生SQL
メールマガジンをMTでやりたい
配信先を管理…MTユーザ&ロール
メールマガジンを管理…ブログ記事
指定日時配信…ブログ記事
HTMLメール…テンプレート処理&MTのメール
配信数は10000通程度…非同期処理
できるかな?
自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
実装方法を調査
MTユーザ&ロール
ブログ記事「公開」時に処理
テンプレート処理
MTのメール
非同期処理
目処を立てる
知りたいこと
権限の追加方法
ロールの追加方法
メールアドレス一覧取得方法
MTユーザ&ロール
MTユーザ&ロール
(ソースコードを表示します) 権限の追加
tmpl/cms/edit_role.tmpl <mt:loop
name="loaded_permissions">
MT::CMS::User my $perms = $app-
>model('permission')->perms_from_registry;
MT::Permission::perms_from_registry
Permissionsレジストリに追加すればいけそう
MT::Core::load_core_permissions
MTユーザ&ロール
(ソースコードを表示)
プラグインインストール時に「メールマガジン会員」ロールをシステムに登録したい。
http://www.sixapart.jp/movabletype/manual/object_reference/archives/mt_plugin.html
upgrade_functionsを使うと明示している。できそう。 MT/Plugin.pm
upgrade_functions
MT/Upgrade.pm post_schema_upgrade
upgrade_functionsを追加してそこでやればよさそう upgrade_functionsの plugin にプラグインIDを設定する プラグイン新規インストール用… version_limitを設定
しない プラグインアップグレード用… version_limitを設定す
る
(ソースコードを表示)
権限を設定した(ロールを割り当てた)ユーザのメールアドレス一覧取得方法 ロール割り当てのDB構造
MT::CMS::User::grant_role MT::Association->link
MT::Associationモデル 中間テーブル`mt_association`にブログとユーザ、ロールが設定されている
MTユーザ&ロール
(試しに実行) 送信先ユーザIDの取得(SQL)
SELECT mt_association.author_idFROM mt_associationWHERE blog_id=<blog_id> AND role_id=<role_id>
送信先メールアドレスの取得(SQL) select mt_author.author_email
from mt_associationINNER JOIN mt_author ON mt_author.author_id =
mt_association.association_author_idWHERE association_blog_id=<blog_id> AND association_role_id=<role_id>
MTユーザ&ロール
MT上での実装方法を調査
MTユーザ&ロール
ブログ記事「公開」時に処理
テンプレート処理
MTのメール
非同期処理
実装の目処を立てる
知りたいこと
公開したときに処理を入れる「コールバック」
記事編集フォーム
一括編集
指定日時公開
ブログ記事公開時に処理
(ソースコードを表示) MT::CMS::core_methodsを見れば`__mode`と実装コードの対応がわかる
save_entry MT::CMS::Entry::save $app->run_callbacks( 'cms_post_save.' . $type, $app, $obj, $orig_obj );
save_entries MT::CMS::Entry::save_entries $app->run_callbacks( 'cms_post_bulk_save.' . ( $type eq 'entry' ?
'entries' : 'pages' ), $app, \@objects );
MT::Core::load_core_tasks MT->instance->publisher->publish_future_posts
MT->run_callbacks( 'scheduled_post_published', $mt, $entry );
ブログ記事公開時に処理
まとめ
記事保存時 cms_post_save.entry
一括編集 cms_post_bulk_save.entry
指定日時公開 scheduled_post_published
コールバックでいけそう。
ブログ記事公開時に処理
MT上での実装方法を調査
MTユーザ&ロール
ブログ記事「公開」時に処理
テンプレート処理
MTのメール
非同期処理
実装の目処を立てる
テンプレート処理
テーマ機能 メルマガブログテーマ
プラグインでテーマを追加する方法
システムテンプレートをテーマに含める方法
テンプレート処理 テンプレートの取りだし方
テンプレートとブログ記事から文字列を得る
(ソースコードを表示) プラグインによるテーマ追加
ブログ作成時のテーマ選択一覧 <select name="blog_theme“
tmpl/cms/edit_blog.tmpl theme_loopに入ってる
MT/App/CMS/Common.pm $param{theme_loop} = MT::Theme->load_theme_loop($type); …
MTのテーマディレクトリ(`MT_DIR/themes`)に加えて、themesレジストリを参照することがわかった
config.yamlで追加できる
テーマ機能
(ソースコードを表示) 取りだし
コメント完了時「コメント完了」システムテンプレートを処理
MT::App::CMS::post my $tmpl = MT::Template->load(
{ type => 'comment_response', blog_id => $entry->blog_id } );
文字列を得る my $ctx = MT::Template::Context->new;
$ctx->stash( 'comment', $comment ); MT::Template::Tags::Entry::_hdlr_entry_title my $html = $tmpl->build( $ctx, \%cond );
テンプレート処理
MT上での実装方法を調査
MTユーザ&ロール
ブログ記事「公開」時に処理
テンプレート処理
MTのメール
非同期処理
実装の目処を立てる
知りたいこと
MTのメール送信API
Multi-Partメール対応可能か
MTのメール
メール送信方法
管理者メールアドレス EmailAddressMain
MT::Mail->send( \%head, $body );
MT::Mail->send( \%head, $body );
Bodyはそのまま送信される
HTMLメールはMIME::Entity等で組み立てて渡せばOK
%head フィールド名をキーにした連想配列
MTのメール
MT上での実装方法を調査
MTユーザ&ロール
ブログ記事「公開」時に処理
テンプレート処理
MTのメール
非同期処理
実装の目処を立てる
知りたいこと
ジョブキュー
Amazon SQS / Resqueみたいなの
公開キューとかで使ってる
run-periodic-tasks
非同期処理
(ソースコードを表示) FUTURE() MT::WeblogPublisher
my $job = TheSchwartz::Job->new(); $job->funcname('MT::Worker::Publish'); MT::TheSchwartz->insert($job);
MT::Worker::Publish use base qw( TheSchwartz::Worker );
MT::Core task_workers
非同期処理
自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
ソースコード公開しますhttps://github.com/takeyuweb/mt-plugin-MailMug
自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
デモ
自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
非公開サブルーチンを外から利用
MT::Hoge::_fugaみたいなの
モンキーパッチ
バージョンアップで壊れるリスク
追従するコスト
やるべきでないこと
なんちゃってロール実装なのでちゃんと権限をみるように修正 宛先インポート
content_actions でインポート機能追加
空メール送信で登録 /etc/aliases でパイプ 受け取りスクリプトを作成
AmazonSES等のメール配信サービス利用 メルマガ送信用のSMTP設定は? 無理なら別途メール送信コードを書く
拡張用コールバック メールマガジン送信専用スクリプト
run-periodic-tasksを使用せず
TODO
以上