MT meets PHP - PHP conference Kansai 2013

  • 16,775 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
16,775
On Slideshare
0
From Embeds
0
Number of Embeds
15

Actions

Shares
Downloads
0
Comments
0
Likes
5

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. MT meets PHPPHP Extension for Movable TypeJunnama Noda @ Alfasado, Inc.
  • 2. About  Me  (野⽥田  純⽣生)•アルファサード株式会社  代表取締役•CMS/受託開発を通じてクライアントを爆速化•Movable  Type  エバンジェリスト•http://junnama.alfasado.net/online/•http://twitter.com/junnama• https://www.facebook.com/junnama.noda
  • 3. http://alfasado.net/
  • 4. http://powercms.jp/
  • 5. どのくらいMTが好きか
  • 6. http://www.amazon.co.jp/dp/4774147109
  • 7. http://www.amazon.co.jp/dp/4839927537
  • 8. https://github.com/alfasado
  • 9. http://2012.osaka.wordcamp.org/
  • 10. http://2012.osaka.wordcamp.org/
  • 11. http://2012.osaka.wordcamp.org/speakers/sumio-noda/
  • 12. エイプリルフールのネタではない!http://powercms.alfasado.net/blog/2011/04/wordpressmovable_type.html
  • 13. Movable  Typeについて
  • 14. http://movabletype.org
  • 15. https://github.com/movabletype
  • 16. http://movabletype.fogbugz.com
  • 17. http://communities.movabletype.jp
  • 18. Movable  Type•2001年年リリース(現在12年年⽬目)• ブログエンジン→Web  CMSへ• 現在バージョン5.2• GPL版と商⽤用版のデュアルライセンス• 2011年年から⽇日本の法⼈人へ売却、⽇日本製• ⽇日本で最も使われている商⽤用CMS
  • 19. Movable  Type• マルチサイトの管理理機能• 強⼒力力なテンプレートエンジン(MTML)• プラグインによる拡張• テーマの作成• パートナー企業によるサードパーティ製品• 開発⾔言語はPerl
  • 20. 開発⾔言語はPerl
  • 21. Perl
  • 22. Perl
  • 23. MT  meets  PHP
  • 24. MT  meets  PHP•Ver.3.1でダイナミックパブリッシングサポート• class  MT• class  MTDatabase• class  BaseObject  extends  ADOdb_̲Active_̲Record• class  MTViewer  extends  Smarty• PHPでプラグインによる拡張が可能
  • 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. 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. 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. MTMLMovable  Type  Markup  Language
  • 29. MTML=Movable  Type  Markup  Language•MTML=Viewを担当するもの•MTIf  MTElse  MTLoopなど、実はロジックも書ける•テンプレートにプログラムは書けない(完全に分離離している)=>デザイナに敷居が低い•<MTFoo>  でも  <mt:foo>  でも  <mtfoo  />  でも  <$MTFoo$>  でも良良い(緩い)
  • 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. <ul><MT:Entries limit="10"><li><a href="<MT:EntryPermalink>"><MT:EntryTitle></a></li></MT:Entries></ul>Template  for  Movable  Type
  • 32. MTMLの拡張• ダイナミックパブリッシングのタグはPHPで書く• mt_̲dir/plugins/PluginName/php/以下に設置• block.mtfoo.php,  function.mtloop.php(命名規則)• Smartyのプラグインとして書く• MTがSmartyプラグインをMTMLに内部変換して実⾏行行
  • 33. モディファイア<?php// modifier.addstring.phpfunction smarty_modifier_addstring( $text, $arg ) {return "{$text}{$arg}";}//<mt:foo addstring= “ただしイケメンに限る。”>?>
  • 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. 条件タグ<?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. ブロックタグ(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. ブロックタグ(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. ブロックタグ(3)<mt:SampleBlock from="1" to="10" glue=","></mt:SampleBlock>! 1,2,3,4,5,6,7,8,9,10
  • 39. DynamicMTMLPHP  Extension  for  MT
  • 40. DynamicMTML• MTのダイナミックパブリッシングの拡張• 静的ファイル内のMTMLをPHPによって実⾏行行• SmartyのテンプレートがMTタグで書ける!• ORマッパ、Worker、静的パブリッシュ,etc• Class  MTPlugin(config.phpにまとめて書ける)
  • 41. DynamicMTML-‐‑‒  Demo  -‐‑‒
  • 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. Example  1<MTIfFacebookLoggedIn><$MTFacebookGetProfiletarget="gender" setvar="__gender__"$><MTIf name="__gender__" eq="male">                        男性向けページ<MTElseIf name="__gender__" eq="famale">⼥女女性向けページ</MTif></MTIfFacebookLoggedIn>
  • 44. Example  2<MTSalesforceGetSObjectsobject=”Case” limit=”10”><h2><$MTSalesforceObjectTitle$></h2><p><$MTSalesforceObjectBody$></p></MTSalesforceGetSObjects>
  • 45. Example  3<MT:IfUserAgent wants="smartphone">        スマホでしょ?<MTElse>        スマホじゃないでしょ?</MT:IfUserAgent><MT:IfUserAgent wants="tablet">        タブレットでしょ?<MTElse>        タブレットじゃないでしょ?</MT:IfUserAgent>
  • 46. Example  4<MT:IfUserAgent wants="keitai"><MT:IfUserAgent like="DoCoMo">DoCoMo?<MTElse><MT:IfUserAgent like="UP.Browser">AU?<MTElse>SoftBank?</MT:IfUserAgent>
  • 47. Example  5<MT:IfLogin><MTAuthorDisplayName escape="html">            さん、ようこそ<MTElse>        ここから先はユーザー登録してください。</MT:IfLogin>
  • 48. Example  6<MT:IfIE lt=”7”>Internet Exproler ver.7以上?<MTElse>Internet Exproler ver.6以下?</MT:IfIE>
  • 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. 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. <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. <ul><MT:Entries limit="10"><li><a href="<MT:EntryPermalink>"><MT:EntryTitle></a></li></MT:Entries></ul>Template  for  Movable  Type
  • 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. <!-- 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. <!-- 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. <!-- 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. <!-- 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. まとめ• MVCきれいに分けられるよ分業できるよ• MT実はPHPで拡張できるよ便便利利だよ• GPLライセンス版もあるよ• アルファサードではPHP/Perlエンジニア募集中• アルファサードではスマホアプリエンジニア募集中
  • 59. Thank  you!