• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
MT meets PHP - PHP conference Kansai 2013
 

MT meets PHP - PHP conference Kansai 2013

on

  • 5,677 views

 

Statistics

Views

Total Views
5,677
Views on SlideShare
2,529
Embed Views
3,148

Actions

Likes
4
Downloads
0
Comments
0

13 Embeds 3,148

http://junnama.alfasado.net 2863
http://pcms.localhost 90
https://twitter.com 66
http://mt4local.alfasado.net 48
http://www.h-fj.com 32
http://theme.alfasado.net 18
http://www.feedspot.com 10
http://www.feedly.com 6
http://webcache.googleusercontent.com 6
http://cloud.feedly.com 5
http://localhost 2
http://www.newsblur.com 1
http://cache.yahoofs.jp 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    MT meets PHP - PHP conference Kansai 2013 MT meets PHP - PHP conference Kansai 2013 Presentation Transcript

    • MT meets PHPPHP Extension for Movable TypeJunnama Noda @ Alfasado, Inc.
    • About  Me  (野⽥田  純⽣生)•アルファサード株式会社  代表取締役•CMS/受託開発を通じてクライアントを爆速化•Movable  Type  エバンジェリスト•http://junnama.alfasado.net/online/•http://twitter.com/junnama• https://www.facebook.com/junnama.noda
    • 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年年から⽇日本の法⼈人へ売却、⽇日本製• ⽇日本で最も使われている商⽤用CMS
    • 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• class  MTViewer  extends  Smarty• PHPでプラグインによる拡張が可能
    • 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";?>
    • 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";}?>
    • 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();?>
    • MTMLMovable  Type  Markup  Language
    • MTML=Movable  Type  Markup  Language•MTML=Viewを担当するもの•MTIf  MTElse  MTLoopなど、実はロジックも書ける•テンプレートにプログラムは書けない(完全に分離離している)=>デザイナに敷居が低い•<MTFoo>  でも  <mt:foo>  でも  <mtfoo  />  でも  <$MTFoo$>  でも良良い(緩い)
    • <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
    • <ul><MT:Entries limit="10"><li><a href="<MT:EntryPermalink>"><MT:EntryTitle></a></li></MT:Entries></ul>Template  for  Movable  Type
    • MTMLの拡張• ダイナミックパブリッシングのタグはPHPで書く• mt_̲dir/plugins/PluginName/php/以下に設置• block.mtfoo.php,  function.mtloop.php(命名規則)• Smartyのプラグインとして書く• MTがSmartyプラグインをMTMLに内部変換して実⾏行行
    • モディファイア<?php// modifier.addstring.phpfunction smarty_modifier_addstring( $text, $arg ) {return "{$text}{$arg}";}//<mt:foo addstring= “ただしイケメンに限る。”>?>
    • ファンクションタグ<?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”>?>
    • 条件タグ<?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>?>
    • ブロックタグ(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 {
    • ブロックタグ(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;! }
    • ブロックタグ(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  MTPlugin(config.phpにまとめて書ける)
    • 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 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
    • Example  1<MTIfFacebookLoggedIn><$MTFacebookGetProfiletarget="gender" setvar="__gender__"$><MTIf name="__gender__" eq="male">                        男性向けページ<MTElseIf name="__gender__" eq="famale">⼥女女性向けページ</MTif></MTIfFacebookLoggedIn>
    • Example  2<MTSalesforceGetSObjectsobject=”Case” limit=”10”><h2><$MTSalesforceObjectTitle$></h2><p><$MTSalesforceObjectBody$></p></MTSalesforceGetSObjects>
    • Example  3<MT:IfUserAgent wants="smartphone">        スマホでしょ?<MTElse>        スマホじゃないでしょ?</MT:IfUserAgent><MT:IfUserAgent wants="tablet">        タブレットでしょ?<MTElse>        タブレットじゃないでしょ?</MT:IfUserAgent>
    • Example  4<MT:IfUserAgent wants="keitai"><MT:IfUserAgent like="DoCoMo">DoCoMo?<MTElse><MT:IfUserAgent like="UP.Browser">AU?<MTElse>SoftBank?</MT:IfUserAgent>
    • 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’ => ‘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
    • 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
    • <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
    • <ul><MT:Entries limit="10"><li><a href="<MT:EntryPermalink>"><MT:EntryTitle></a></li></MT:Entries></ul>Template  for  Movable  Type
    • <ul><MT:WP:Entries limit="10"><li><a href="<MT:WP:EntryPermalink>"><MT:WP:EntryTitle></a></li></MT:WP:Entries></ul>Using  DynamicMTML
    • <!-- 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)
    • <!-- 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)
    • <!-- 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)
    • <!-- 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)
    • まとめ• MVCきれいに分けられるよ分業できるよ• MT実はPHPで拡張できるよ便便利利だよ• GPLライセンス版もあるよ• アルファサードではPHP/Perlエンジニア募集中• アルファサードではスマホアプリエンジニア募集中
    • Thank  you!