Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
MT meets PHPPHP Extension for Movable TypeJunnama Noda @ Alfasado, Inc.
About  Me  (野⽥田  純⽣生)•アルファサード株式会社  代表取締役•CMS/受託開発を通じてクライアントを爆速化•Movable  Type  エバンジェリスト•http://junnama.alfasado.net/online...
http://alfasado.net/
http://powercms.jp/
どのくらいMTが好きか
http://www.amazon.co.jp/dp/4774147109
http://www.amazon.co.jp/dp/4839927537
https://github.com/alfasado
http://2012.osaka.wordcamp.org/
http://2012.osaka.wordcamp.org/
http://2012.osaka.wordcamp.org/speakers/sumio-noda/
エイプリルフールのネタではない!http://powercms.alfasado.net/blog/2011/04/wordpressmovable_type.html
Movable  Typeについて
http://movabletype.org
https://github.com/movabletype
http://movabletype.fogbugz.com
http://communities.movabletype.jp
Movable  Type•2001年年リリース(現在12年年⽬目)• ブログエンジン→Web  CMSへ• 現在バージョン5.2• GPL版と商⽤用版のデュアルライセンス• 2011年年から⽇日本の法⼈人へ売却、⽇日本製• ⽇日本で最も使われ...
Movable  Type• マルチサイトの管理理機能• 強⼒力力なテンプレートエンジン(MTML)• プラグインによる拡張• テーマの作成• パートナー企業によるサードパーティ製品• 開発⾔言語はPerl
開発⾔言語はPerl
Perl
Perl
MT  meets  PHP
MT  meets  PHP•Ver.3.1でダイナミックパブリッシングサポート• class  MT• class  MTDatabase• class  BaseObject  extends  ADOdb_̲Active_̲Record•...
Example  1<?php$blog_id = 2;include(/path/to/mt/php/mt.php);$mt = MT::get_instance($blog_id,/path/to/mt/mt-config.cgi);$bl...
Example  2<?phprequire_once( class.mt_entry.php );$_entry = new Entry;$where = "entry_status=2 andentry_blog_id=2";$where ...
Example  3<?php //class.mt_log.phprequire_once( "class.baseobject.php" );class Log extends BaseObject {public $_table = mt...
MTMLMovable  Type  Markup  Language
MTML=Movable  Type  Markup  Language•MTML=Viewを担当するもの•MTIf  MTElse  MTLoopなど、実はロジックも書ける•テンプレートにプログラムは書けない(完全に分離離している)=>デザイ...
<ul><?php$myposts =get_posts(posts_per_page=10);foreach($myposts as $post) :setup_postdata($post);?><li><a href="<?php the...
<ul><MT:Entries limit="10"><li><a href="<MT:EntryPermalink>"><MT:EntryTitle></a></li></MT:Entries></ul>Template  for  Mova...
MTMLの拡張• ダイナミックパブリッシングのタグはPHPで書く• mt_̲dir/plugins/PluginName/php/以下に設置• block.mtfoo.php,  function.mtloop.php(命名規則)• Smart...
モディファイア<?php// modifier.addstring.phpfunction smarty_modifier_addstring( $text, $arg ) {return "{$text}{$arg}";}//<mt:foo ...
ファンクションタグ<?php//function.mtrand.phpfunction smarty_function_mtrand( $args, &$ctx ) {$min = $args[min];$max = $args[max];re...
条件タグ<?php//block.mtifrand.phpfunction smarty_block_mtifrand($args, $content, &$ctx, &$repeat) {$rand = (rand(0, 1)) ? TRUE...
ブロックタグ(1)<?php//block.mtsampleblock.phpfunction smarty_block_mtsampleblock( $args, $content, &$ctx, &$repeat ) {! $from = ...
ブロックタグ(2)! } else {! ! $out = $ctx->stash(__out);! ! $counter = $ctx->__stash[vars][__counter__] + 1;! ! if ( $glue && $co...
ブロックタグ(3)<mt:SampleBlock from="1" to="10" glue=","></mt:SampleBlock>! 1,2,3,4,5,6,7,8,9,10
DynamicMTMLPHP  Extension  for  MT
DynamicMTML• MTのダイナミックパブリッシングの拡張• 静的ファイル内のMTMLをPHPによって実⾏行行• SmartyのテンプレートがMTタグで書ける!• ORマッパ、Worker、静的パブリッシュ,etc• Class  MTP...
DynamicMTML-‐‑‒  Demo  -‐‑‒
drwxrwxrwx 32 alfasado admin 1088 3 10 15:17 .drwxr-xr-x 11 alfasado admin 374 3 8 13:40 ..-rw-rw-rw- 1 alfasado admin 935...
Example  1<MTIfFacebookLoggedIn><$MTFacebookGetProfiletarget="gender" setvar="__gender__"$><MTIf name="__gender__" eq="mal...
Example  2<MTSalesforceGetSObjectsobject=”Case” limit=”10”><h2><$MTSalesforceObjectTitle$></h2><p><$MTSalesforceObjectBody...
Example  3<MT:IfUserAgent wants="smartphone">        スマホでしょ?<MTElse>        スマホじゃないでしょ?</MT:IfUserAgent><MT:IfUserAgent wa...
Example  4<MT:IfUserAgent wants="keitai"><MT:IfUserAgent like="DoCoMo">DoCoMo?<MTElse><MT:IfUserAgent like="UP.Browser">AU...
Example  5<MT:IfLogin><MTAuthorDisplayName escape="html">            さん、ようこそ<MTElse>        ここから先はユーザー登録してください。</MT:IfLogin>
Example  6<MT:IfIE lt=”7”>Internet Exproler ver.7以上?<MTElse>Internet Exproler ver.6以下?</MT:IfIE>
Example  7$terms = array(‘status’ => 2,‘blog_id’ => 2,‘class’=>‘entry’);$args = array(‘sort’ => ‘authored_on’,‘direcrtion’...
Example  8class ExamplePlugin extends MTPlugin {config_settings => array( // mt-config.cgiDynamicForceCompile => array( de...
<ul><?php$myposts =get_posts(posts_per_page=10);foreach($myposts as $post) :setup_postdata($post);?><li><a href="<?php the...
<ul><MT:Entries limit="10"><li><a href="<MT:EntryPermalink>"><MT:EntryTitle></a></li></MT:Entries></ul>Template  for  Mova...
<ul><MT:WP:Entries limit="10"><li><a href="<MT:WP:EntryPermalink>"><MT:WP:EntryTitle></a></li></MT:WP:Entries></ul>Using  ...
<!-- File: /app/controllers/posts_controller.php --><?phpclass PostsController extends AppController {var $name = Posts;fu...
<!-- File: /app/views/posts/index.ctp --><h1>Blog posts</h1><table><tr><th>Id</th><th>Title</th><th>Created</th></tr><?php...
<!-- File: /app/controllers/posts_controller.php --><?phpclass PostsController extends AppController {var $name = Posts;fu...
<!-- File: /app/views/posts/index.ctp --><h1><mt:var name="page_title" escape="html"></h1><mt:cake:loop model="Post"><mt:i...
まとめ• MVCきれいに分けられるよ分業できるよ• MT実はPHPで拡張できるよ便便利利だよ• GPLライセンス版もあるよ• アルファサードではPHP/Perlエンジニア募集中• アルファサードではスマホアプリエンジニア募集中
Thank  you!
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013
Upcoming SlideShare
Loading in …5
×

MT meets PHP - PHP conference Kansai 2013

17,855 views

Published on

Published in: Technology
  • Be the first to comment

MT meets PHP - PHP conference Kansai 2013

  1. 1. MT meets PHPPHP Extension for Movable TypeJunnama Noda @ Alfasado, Inc.
  2. 2. About  Me  (野⽥田  純⽣生)•アルファサード株式会社  代表取締役•CMS/受託開発を通じてクライアントを爆速化•Movable  Type  エバンジェリスト•http://junnama.alfasado.net/online/•http://twitter.com/junnama• https://www.facebook.com/junnama.noda
  3. 3. http://alfasado.net/
  4. 4. http://powercms.jp/
  5. 5. どのくらいMTが好きか
  6. 6. http://www.amazon.co.jp/dp/4774147109
  7. 7. http://www.amazon.co.jp/dp/4839927537
  8. 8. https://github.com/alfasado
  9. 9. http://2012.osaka.wordcamp.org/
  10. 10. http://2012.osaka.wordcamp.org/
  11. 11. http://2012.osaka.wordcamp.org/speakers/sumio-noda/
  12. 12. エイプリルフールのネタではない!http://powercms.alfasado.net/blog/2011/04/wordpressmovable_type.html
  13. 13. Movable  Typeについて
  14. 14. http://movabletype.org
  15. 15. https://github.com/movabletype
  16. 16. http://movabletype.fogbugz.com
  17. 17. http://communities.movabletype.jp
  18. 18. Movable  Type•2001年年リリース(現在12年年⽬目)• ブログエンジン→Web  CMSへ• 現在バージョン5.2• GPL版と商⽤用版のデュアルライセンス• 2011年年から⽇日本の法⼈人へ売却、⽇日本製• ⽇日本で最も使われている商⽤用CMS
  19. 19. Movable  Type• マルチサイトの管理理機能• 強⼒力力なテンプレートエンジン(MTML)• プラグインによる拡張• テーマの作成• パートナー企業によるサードパーティ製品• 開発⾔言語はPerl
  20. 20. 開発⾔言語はPerl
  21. 21. Perl
  22. 22. Perl
  23. 23. MT  meets  PHP
  24. 24. MT  meets  PHP•Ver.3.1でダイナミックパブリッシングサポート• class  MT• class  MTDatabase• class  BaseObject  extends  ADOdb_̲Active_̲Record• class  MTViewer  extends  Smarty• PHPでプラグインによる拡張が可能
  25. 25. Example  1<?php$blog_id = 2;include(/path/to/mt/php/mt.php);$mt = MT::get_instance($blog_id,/path/to/mt/mt-config.cgi);$blog = $mt->db()->fetch_blog($blog_id);echo $blog->name . "n";?>
  26. 26. Example  2<?phprequire_once( class.mt_entry.php );$_entry = new Entry;$where = "entry_status=2 andentry_blog_id=2";$where .= " order by entry_authored_onDESC ";$extra[limit] = 10;$entries = $_entry->Find( $where, FALSE,FALSE, $extra );foreach ( $entries as $entry ) {echo $entry->title . "n";}?>
  27. 27. Example  3<?php //class.mt_log.phprequire_once( "class.baseobject.php" );class Log extends BaseObject {public $_table = mt_log;protected $_prefix = "log_";}?><?phprequire_once( class.mt_log.php );$_log = new Log;$_log->message = “This is test.”;$ts = gmdate( "YmdHis" );$_log->created_on = $ts;$_log->modified_on = $ts;$_log->Save();?>
  28. 28. MTMLMovable  Type  Markup  Language
  29. 29. MTML=Movable  Type  Markup  Language•MTML=Viewを担当するもの•MTIf  MTElse  MTLoopなど、実はロジックも書ける•テンプレートにプログラムは書けない(完全に分離離している)=>デザイナに敷居が低い•<MTFoo>  でも  <mt:foo>  でも  <mtfoo  />  でも  <$MTFoo$>  でも良良い(緩い)
  30. 30. <ul><?php$myposts =get_posts(posts_per_page=10);foreach($myposts as $post) :setup_postdata($post);?><li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li><?php endforeach; ?></ul>Template  for  WordPress
  31. 31. <ul><MT:Entries limit="10"><li><a href="<MT:EntryPermalink>"><MT:EntryTitle></a></li></MT:Entries></ul>Template  for  Movable  Type
  32. 32. MTMLの拡張• ダイナミックパブリッシングのタグはPHPで書く• mt_̲dir/plugins/PluginName/php/以下に設置• block.mtfoo.php,  function.mtloop.php(命名規則)• Smartyのプラグインとして書く• MTがSmartyプラグインをMTMLに内部変換して実⾏行行
  33. 33. モディファイア<?php// modifier.addstring.phpfunction smarty_modifier_addstring( $text, $arg ) {return "{$text}{$arg}";}//<mt:foo addstring= “ただしイケメンに限る。”>?>
  34. 34. ファンクションタグ<?php//function.mtrand.phpfunction smarty_function_mtrand( $args, &$ctx ) {$min = $args[min];$max = $args[max];return rand( $min, $max );}//<mt:rand min=”1” max=”10”>?>
  35. 35. 条件タグ<?php//block.mtifrand.phpfunction smarty_block_mtifrand($args, $content, &$ctx, &$repeat) {$rand = (rand(0, 1)) ? TRUE : FALSE;return $ctx->_hdlr_if($args, $content, $ctx, $repeat, $rand);}//<mt:ifRand><mt:else></mt:if>?>
  36. 36. ブロックタグ(1)<?php//block.mtsampleblock.phpfunction smarty_block_mtsampleblock( $args, $content, &$ctx, &$repeat ) {! $from = $args[from];! $to = $args[to];! $glue = $args[glue];! if (! isset( $content ) ) {! ! $vars =& $ctx->__stash[vars];! ! $ctx->stash( __counter__, $from );! ! $ctx->__stash[vars][__counter__] = $from;! } else {
  37. 37. ブロックタグ(2)! } else {! ! $out = $ctx->stash(__out);! ! $counter = $ctx->__stash[vars][__counter__] + 1;! ! if ( $glue && $content && $out ) {! ! ! $content = $glue . $content;! ! } else {! ! ! $ctx->stash(__out, TRUE);! ! }! ! if ( $counter <= $to ) {! ! ! $ctx->__stash[vars][__counter__]= $counter;! ! ! $repeat = TRUE;! ! } else {! ! ! $repeat = FALSE;! ! }! ! return $content;! }
  38. 38. ブロックタグ(3)<mt:SampleBlock from="1" to="10" glue=","></mt:SampleBlock>! 1,2,3,4,5,6,7,8,9,10
  39. 39. DynamicMTMLPHP  Extension  for  MT
  40. 40. DynamicMTML• MTのダイナミックパブリッシングの拡張• 静的ファイル内のMTMLをPHPによって実⾏行行• SmartyのテンプレートがMTタグで書ける!• ORマッパ、Worker、静的パブリッシュ,etc• Class  MTPlugin(config.phpにまとめて書ける)
  41. 41. DynamicMTML-‐‑‒  Demo  -‐‑‒
  42. 42. drwxrwxrwx 32 alfasado admin 1088 3 10 15:17 .drwxr-xr-x 11 alfasado admin 374 3 8 13:40 ..-rw-rw-rw- 1 alfasado admin 935 2 27 16:08 .htaccess-rw-rw-rw- 1 alfasado admin 1223 2 27 16:08 .mtview.php-rw-rw-rw- 1 alfasado admin 24609 3 2 14:41 index.html
  43. 43. Example  1<MTIfFacebookLoggedIn><$MTFacebookGetProfiletarget="gender" setvar="__gender__"$><MTIf name="__gender__" eq="male">                        男性向けページ<MTElseIf name="__gender__" eq="famale">⼥女女性向けページ</MTif></MTIfFacebookLoggedIn>
  44. 44. Example  2<MTSalesforceGetSObjectsobject=”Case” limit=”10”><h2><$MTSalesforceObjectTitle$></h2><p><$MTSalesforceObjectBody$></p></MTSalesforceGetSObjects>
  45. 45. Example  3<MT:IfUserAgent wants="smartphone">        スマホでしょ?<MTElse>        スマホじゃないでしょ?</MT:IfUserAgent><MT:IfUserAgent wants="tablet">        タブレットでしょ?<MTElse>        タブレットじゃないでしょ?</MT:IfUserAgent>
  46. 46. Example  4<MT:IfUserAgent wants="keitai"><MT:IfUserAgent like="DoCoMo">DoCoMo?<MTElse><MT:IfUserAgent like="UP.Browser">AU?<MTElse>SoftBank?</MT:IfUserAgent>
  47. 47. Example  5<MT:IfLogin><MTAuthorDisplayName escape="html">            さん、ようこそ<MTElse>        ここから先はユーザー登録してください。</MT:IfLogin>
  48. 48. Example  6<MT:IfIE lt=”7”>Internet Exproler ver.7以上?<MTElse>Internet Exproler ver.6以下?</MT:IfIE>
  49. 49. Example  7$terms = array(‘status’ => 2,‘blog_id’ => 2,‘class’=>‘entry’);$args = array(‘sort’ => ‘authored_on’,‘direcrtion’ => ‘descend’,‘limit’ => 10 );$entries = $app->load(‘Entry’,$terms,$args);SELECT * FROM ‘mt_entry’WHERE entry_status=2 ANDentry_class=‘entry’ORDER BY `mt_entry`.`entry_authored_on` DESCLIMIT 0,10
  50. 50. Example  8class ExamplePlugin extends MTPlugin {config_settings => array( // mt-config.cgiDynamicForceCompile => array( default => 0 ),),settings => array( // PluginSettingsexample_setting => array( default => 1 ),),tags => array( // Template Tagsblock => array(dynamicmtml => dynamicmtml),function => array(authorlanguage => authorlanguage),modifier => array(trimwhitespace => trimwhitespace),),task_workers => array( // Workersmt_rebuild => array(label => Publishes content.,code => workers_mt_rebuild,class => MT::Worker::Publish,),),callbacks => array( // Callbacksbuild_page => filter_build_page,),);mt_dir/plugins/EsamplePlugin/php/config.php
  51. 51. <ul><?php$myposts =get_posts(posts_per_page=10);foreach($myposts as $post) :setup_postdata($post);?><li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li><?php endforeach; ?></ul>Template  for  WordPress
  52. 52. <ul><MT:Entries limit="10"><li><a href="<MT:EntryPermalink>"><MT:EntryTitle></a></li></MT:Entries></ul>Template  for  Movable  Type
  53. 53. <ul><MT:WP:Entries limit="10"><li><a href="<MT:WP:EntryPermalink>"><MT:WP:EntryTitle></a></li></MT:WP:Entries></ul>Using  DynamicMTML
  54. 54. <!-- File: /app/controllers/posts_controller.php --><?phpclass PostsController extends AppController {var $name = Posts;function index() {$this->set(posts,$this->Post->find(all));}function view($id = null) {$this->Post->id = $id;$this->set(post, $this->Post->read());}}?>Original(Controller)
  55. 55. <!-- File: /app/views/posts/index.ctp --><h1>Blog posts</h1><table><tr><th>Id</th><th>Title</th><th>Created</th></tr><?php foreach ($posts as $post): ?><tr><td><?php echo $post[Post][id]; ?></td><td><?php echo$html->link($post[Post][title],array(controller => posts,action => view,$post[Post][id])); ?></td><td><?php echo $post[Post][created]; ?></td></tr><?php endforeach; ?></table>Original(View)
  56. 56. <!-- File: /app/controllers/posts_controller.php --><?phpclass PostsController extends AppController {var $name = Posts;function index() {$ctx = $this->ctx;$ctx->__stash[vars][page_title]= Blog posts;$ctx->stash(Post,$this->Post->find(all));}function view( $id = null ) {$ctx = $this->ctx;$this->Post->id = $id;$ctx->stash(Post, $this->Post->read());}}?>DynamicMTML(Controller)
  57. 57. <!-- File: /app/views/posts/index.ctp --><h1><mt:var name="page_title" escape="html"></h1><mt:cake:loop model="Post"><mt:if name="__first__"><table><tr><th>Id</th><th>Title</th><th>Created</th></tr></mt:if><tr><td><mt:var name="id"></td><td><a href=".view/<mt:var name="id">"><mt:var name="title" escape="html"></a></td><td><mt:var name="created"></td></tr><mt:if name="__last__"></table></mt:if></mt:cake:loop>DynamicMTML(View)
  58. 58. まとめ• MVCきれいに分けられるよ分業できるよ• MT実はPHPで拡張できるよ便便利利だよ• GPLライセンス版もあるよ• アルファサードではPHP/Perlエンジニア募集中• アルファサードではスマホアプリエンジニア募集中
  59. 59. Thank  you!

×