Weitere ähnliche Inhalte Ähnlich wie プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~ (20) Mehr von Takeuchi Yuichi (8) プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~1. プラグイン作者脳に
なろう
{
実案件で学ぶプラグイン開発フロー
@takeyuweb
竹内雄一Yuichi Takeuchi
MTDDC Meetup TOKYO 2014
2. • プログラマ向けの話をし
ます。
• プラグイン作成”入門”的
な内容ではありません。
• 実案件でプラグインを
作ったときの作業フロー
についてお話しします。
このセッションについて
3. 自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
4. 自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
5. タケユー・ウェブ(2008~)
フリーWebエンジニア
Rails / MT / AngularJS / Linux /
AWS etc…
MT東京
Ruby好き
Lancers認定ランサー
2014.4~さいたま市
↑週3ぐらいでいます。
竹内雄一@takeyuweb
6. MTプラグイン開発経験
たぶん60個ぐらい
業務(非公開)
趣味
KetaiPost (2010)
初プラグイン
携帯メール投稿
息子の成長記録
竹内雄一@takeyuweb
7. 自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
8. できること、種類からみた分類
ある処理に別の処理を挟む「コールバック」
管理画面を変更「トランスフォーマー」
テンプレートタグ
バッチ処理
DataAPI拡張
MTフレームワーク独自アプリ
などなど…
大抵のことはがんばればできます。
プラグインについて
11. 学習資料③
Movable Type
Developer’s Guide
Volume 1
MT4の本だけどMT6で
も基本は同じ
私も買いました。
12. ソースコード
MT本体
今でもよく読む、今日も読む
公開されている他のプラグイン
学習資料④
13. 自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
14. 実際のご依頼
「メールマガジンをMTでやりたい」
レンタルサーバで動かしたい
できればHTMLメールでやりたい
購読者は6000人ぐらいで月1配信
「ではプラグイン作りましょう」
プラグイン作成の動機
15. 自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
17. メールマガジンをMTでやりたい
配信先を管理…MTユーザ&ロール
メールマガジンを管理
指定日時配信
HTMLメール
配信数は10000通程度
MTに落とし込む
19. メールマガジンをMTでやりたい
配信先を管理…MTユーザ&ロール
メールマガジンを管理…ブログ記事
指定日時配信…ブログ記事
HTMLメール
配信数は10000通程度
MTに落とし込む
22. メールマガジンをMTでやりたい
配信先を管理…MTユーザ&ロール
メールマガジンを管理…ブログ記事
指定日時配信…ブログ記事
HTMLメール…テンプレート処理&MTのメール
配信数は10000通程度
MTに落とし込む
24. メールマガジンをMTでやりたい
配信先を管理…MTユーザ&ロール
メールマガジンを管理…ブログ記事
指定日時配信…ブログ記事
HTMLメール…テンプレート処理&MTのメール
配信数は10000通程度…非同期処理
MTに落とし込む
25. タイムアウトの危機
非同期処理
Ex)公開キュー
配信先リスト作成
生SQL
配信数は10000通程度
26. メールマガジンをMTでやりたい
配信先を管理…MTユーザ&ロール
メールマガジンを管理…ブログ記事
指定日時配信…ブログ記事
HTMLメール…テンプレート処理&MTのメール
配信数は10000通程度…非同期処理
できるかな?
27. 自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
28. 実装方法を調査
MTユーザ&ロール
ブログ記事「公開」時に処理
テンプレート処理
MTのメール
非同期処理
目処を立てる
29. 知りたいこと
権限の追加方法
ロールの追加方法
メールアドレス一覧取得方法
MTユーザ&ロール
30. (ソースコードを表示します)
権限の追加
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_regist
ry
Permissionsレジストリに追加すれ
ばいけそう
MT::Core::load_core_permissions
MTユーザ&ロール
31. (ソースコードを表示)
プラグインインストール時に「メールマガジン会
員」ロールをシステムに登録したい。
http://www.sixapart.jp/movabletype/manual/object_r
eference/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 を設定す
る
MTユーザ&ロール
32. (ソースコードを表示)
権限を設定した(ロールを割り当てた)ユーザ
のメールアドレス一覧取得方法
ロール割り当てのDB構造
MT::CMS::User::grant_role
MT::Association->link
MT::Associationモデル
中間テーブル`mt_association`にブログとユーザ、
ロールが設定されている
MTユーザ&ロール
33. (試しに実行)
送信先ユーザIDの取得(SQL)
SELECT mt_association.author_id
FROM mt_association
WHERE blog_id=<blog_id> AND role_id=<role_id>
送信先メールアドレスの取得(SQL)
select mt_author.author_email
from mt_association
INNER JOIN mt_author ON mt_author.author_id =
mt_association.association_author_id
WHERE association_blog_id=<blog_id> AND
association_role_id=<role_id>
MTユーザ&ロール
34. MT上での実装方法を調査
MTユーザ&ロール
ブログ記事「公開」時に処理
テンプレート処理
MTのメール
非同期処理
実装の目処を立てる
35. 知りたいこと
公開したときに処理を入れる「コールバック」
記事編集フォーム
一括編集
指定日時公開
ブログ記事公開時に処理
36. (ソースコードを表示)
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 );
ブログ記事公開時に処理
37. まとめ
記事保存時cms_post_save.entry
一括編集cms_post_bulk_save.entry
指定日時公開scheduled_post_published
コールバックでいけそう。
ブログ記事公開時に処理
38. MT上での実装方法を調査
MTユーザ&ロール
ブログ記事「公開」時に処理
テンプレート処理
MTのメール
非同期処理
実装の目処を立てる
39. テーマ機能
メルマガブログテーマ
テンプレート処理
プラグインでテーマを追
加する方法
システムテンプレートを
テーマに含める方法
テンプレート処理
テンプレートの取りだし方
テンプレートとブログ記事
から文字列を得る
40. (ソースコードを表示)
プラグインによるテーマ追加
ブログ作成時のテーマ選択一覧
<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 で追加できる
テーマ機能
41. (ソースコードを表示)
取りだし
コメント完了時「コメント完了」システムテンプレートを処
理
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 );
テンプレート処理
42. MT上での実装方法を調査
MTユーザ&ロール
ブログ記事「公開」時に処理
テンプレート処理
MTのメール
非同期処理
実装の目処を立てる
43. 知りたいこと
MTのメール送信API
Multi-Partメール対応可能か
MTのメール
44. メール送信方法
管理者メールアドレスEmailAddressMain
MT::Mail->send( %head, $body );
MT::Mail->send( %head, $body );
Bodyはそのまま送信される
HTMLメールはMIME::Entity等で組み立てて渡せ
ばOK
%head フィールド名をキーにした連想配列
MTのメール
45. MT上での実装方法を調査
MTユーザ&ロール
ブログ記事「公開」時に処理
テンプレート処理
MTのメール
非同期処理
実装の目処を立てる
46. 知りたいこと
ジョブキュー
Amazon SQS / Resqueみたいなの
公開キューとかで使ってる
run-periodic-tasks
非同期処理
47. (ソースコードを表示)
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
非同期処理
48. 自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
50. 自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
52. 自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
目処を立てる
実装する
デモ
TODO(時間があれば)
Agenda
54. なんちゃってロール実装なのでちゃんと権限をみるように修正
宛先インポート
content_actions でインポート機能追加
空メール送信で登録
/etc/aliases でパイプ
受け取りスクリプトを作成
AmazonSES等のメール配信サービス利用
メルマガ送信用のSMTP設定は?
無理なら別途メール送信コードを書く
拡張用コールバック
メールマガジン送信専用スクリプト
run-periodic-tasksを使用せず
TODO
Hinweis der Redaktion 自己紹介
プラグインについて
プラグイン作成の動機
要件を固める
20分
ソースコードリーディング
20分
デモ5分