MT meets PHP

9,627 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,627
On SlideShare
0
From Embeds
0
Number of Embeds
405
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

MT meets PHP

  1. 1. MT meets PHP MTCafe Saitama 2013 Junnama 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 • マルチサイトの管理理機能 • 強⼒力力なテンプレートエンジン(MTML) • プラグインによる拡張 • テーマの作成 • パートナー企業によるサードパーティ製品 • 開発⾔言語はPerl
  14. 14. 開発⾔言語はPerl
  15. 15. Perl
  16. 16. Perl
  17. 17. MT  meets  PHP
  18. 18. MT  meets  PHP •Ver.3.1でダイナミックパブリッシングサポート • class  MT • class  MTDatabase • class  BaseObject  extends  ADOdb_̲Active_̲Record • class  MTViewer  extends  Smarty • PHPでプラグインによる拡張が可能
  19. 19. 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"; ?>
  20. 20. Example  2 <?php require_once( 'class.mt_entry.php' ); $_entry = new Entry; $where = "entry_status=2 and entry_blog_id=2"; $where .= " order by entry_authored_on DESC "; $extra['limit'] = 10; $entries = $_entry->Find( $where, FALSE, FALSE, $extra ); foreach ( $entries as $entry ) { echo $entry->title . "n"; } ?>
  21. 21. Example  3 <?php //class.mt_log.php require_once( "class.baseobject.php" ); class Log extends BaseObject { public $_table = 'mt_log'; protected $_prefix = "log_"; } ?> <?php require_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(); ?>
  22. 22. MTML Movable  Type  Markup  Language
  23. 23. MTML=Movable  Type   Markup  Language •MTML=Viewを担当するもの •MTIf  MTElse  MTLoopなど、実はロジックも書け る •テンプレートにプログラムは書けない(完全に分 離離している)=>デザイナに敷居が低い •<MTFoo>  でも  <mt:foo>  でも  <mtfoo  />  で も  <$MTFoo$>  でも良良い(緩い)
  24. 24. <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
  25. 25. <ul> <MT:Entries limit="10"> <li><a href="<MT:EntryPermalink>"> <MT:EntryTitle></a></li> </MT:Entries> </ul> Template  for  Movable  Type
  26. 26. MTMLの拡張 • ダイナミックパブリッシングのタグはPHPで書く • mt_̲dir/plugins/PluginName/php/以下に設置 • block.mtfoo.php,  function.mtloop.php(命名規則) • Smartyのプラグインとして書く • MTがSmartyプラグインをMTMLに内部変換して実⾏行行
  27. 27. モディファイア <?php // modifier.addstring.php function smarty_modifier_addstring ( $text, $arg ) { return "{$text}{$arg}"; } //<mt:foo addstring= “ただしイケメンに限る。”> ?>
  28. 28. ファンクションタグ <?php //function.mtrand.php function smarty_function_mtrand( $args, &$ctx ) { $min = $args['min']; $max = $args['max']; return rand( $min, $max ); } //<mt:rand min=”1” max=”10”> ?>
  29. 29. 条件タグ <?php //block.mtifrand.php function 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> ?>
  30. 30. ブロックタグ(1) <?php //block.mtsampleblock.php function 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 {
  31. 31. ブロックタグ(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; ! }
  32. 32. ブロックタグ(3) <mt:SampleBlock from="1" to="10" glue=","> </mt:SampleBlock> ! 1,2,3,4,5,6,7,8,9,10
  33. 33. DynamicMTML PHP  Extension  for  MT
  34. 34. DynamicMTML • MTのダイナミックパブリッシングの拡張 • 静的ファイル内のMTMLをPHPによって実⾏行行 • SmartyのテンプレートがMTタグで書ける! • ORマッパ、Worker、静的パブリッシュ,etc • Class  MTPlugin(config.phpにまとめて書ける)
  35. 35. DynamicMTML -‐‑‒  Demo  -‐‑‒
  36. 36. 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
  37. 37. Example  1 <MTIfFacebookLoggedIn> <$MTFacebookGetProfile target="gender" setvar="__gender__"$> <MTIf name="__gender__" eq="male">                        男性向けページ <MTElseIf name="__gender__" eq="famale"> ⼥女女性向けページ </MTif> </MTIfFacebookLoggedIn>
  38. 38. Example  2 <MTSalesforceGetSObjects object=”Case” limit=”10”> <h2><$MTSalesforceObjectTitle$></h2> <p><$MTSalesforceObjectBody$></p> </MTSalesforceGetSObjects>
  39. 39. Example  3 <MT:IfUserAgent wants="smartphone">        スマホでしょ? <MTElse>        スマホじゃないでしょ? </MT:IfUserAgent> <MT:IfUserAgent wants="tablet">        タブレットでしょ? <MTElse>        タブレットじゃないでしょ? </MT:IfUserAgent>
  40. 40. Example  4 <MT:IfUserAgent wants="keitai"> <MT:IfUserAgent like="DoCoMo"> DoCoMo? <MTElse> <MT:IfUserAgent like="UP.Browser"> AU? <MTElse> SoftBank? </MT:IfUserAgent>
  41. 41. Example  5 <MT:IfLogin> <MTAuthorDisplayName escape="html">            さん、ようこそ <MTElse>        ここから先はユーザー登録してください。 </MT:IfLogin>
  42. 42. Example  6 <MT:IfIE lt=”7”> Internet Exproler ver.7以上? <MTElse> Internet Exproler ver.6以下? </MT:IfIE>
  43. 43. 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 AND entry_class=‘entry’ ORDER BY `mt_entry`.`entry_authored_on` DESC LIMIT 0,10
  44. 44. Example  8 class ExamplePlugin extends MTPlugin { 'config_settings' => array( // mt-config.cgi 'DynamicForceCompile' => array( 'default' => 0 ),), 'settings' => array( // PluginSettings 'example_setting' => array( 'default' => 1 ),), 'tags' => array( // Template Tags 'block' => array('dynamicmtml' => 'dynamicmtml'), 'function' => array('authorlanguage' => 'authorlanguage'), 'modifier' => array('trimwhitespace' => 'trimwhitespace'),), 'task_workers' => array( // Workers 'mt_rebuild' => array('label' => 'Publishes content.', 'code' => 'workers_mt_rebuild', 'class' => 'MT::Worker::Publish',),), 'callbacks' => array( // Callbacks 'build_page' => 'filter_build_page',),); mt_dir/plugins/EsamplePlugin/php/config.php
  45. 45. <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
  46. 46. <ul> <MT:Entries limit="10"> <li><a href="<MT:EntryPermalink>"> <MT:EntryTitle></a></li> </MT:Entries> </ul> Template  for  Movable  Type
  47. 47. <ul> <MT:WP:Entries limit="10"> <li><a href="<MT:WP:EntryPermalink>"> <MT:WP:EntryTitle></a></li> </MT:WP:Entries> </ul> Using  DynamicMTML
  48. 48. <!-- File: /app/controllers/posts_controller.php --> <?php class 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)
  49. 49. <!-- 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)
  50. 50. <!-- File: /app/controllers/posts_controller.php --> <?php class 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)
  51. 51. <!-- 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)
  52. 52. まとめ • MVCきれいに分けられるよ分業できるよ • MT実はPHPで拡張できるよ便便利利だよ • GPLライセンス版もあるよ • アルファサードではPHP/Perlエンジニア募集中 • アルファサードではスマホアプリエンジニア募集中
  53. 53. Thank  you!

×