SlideShare a Scribd company logo
Submit Search
Upload
Login
Signup
やはりお前らのMTMLは間違っている!
Report
純生 野田
Follow
Executive Director at アルファサード
Nov. 29, 2015
•
0 likes
•
11,719 views
1
of
71
やはりお前らのMTMLは間違っている!
Nov. 29, 2015
•
0 likes
•
11,719 views
Download Now
Download to read offline
Report
Technology
MTDDC Meetup Tokyo 2015のセッションスライド
純生 野田
Follow
Executive Director at アルファサード
Recommended
MovableTypeテンプレートタグのまとめ
Yujiro Araki
8K views
•
122 slides
How Cascading Style Sheets (CSS) Works
Amit Tyagi
79.4K views
•
38 slides
Html & Css presentation
joilrahat
2.2K views
•
26 slides
Corso di HTML5 e CSS
Salvatore Cordiano
1.6K views
•
29 slides
Html
Vahideh Zarea Gavgani
2.9K views
•
60 slides
MySQL Load Balancers - Maxscale, ProxySQL, HAProxy, MySQL Router & nginx - A ...
Severalnines
5.8K views
•
38 slides
More Related Content
What's hot
Curso css
Jesus Luque Medina
1.6K views
•
134 slides
Introduction to Bootstrap
Ron Reiter
41.7K views
•
32 slides
MySQL 5.7 NF – JSON Datatype 활용
I Goo Lee
7.9K views
•
29 slides
HTML 5 Tables and Forms
Doncho Minkov
2.2K views
•
58 slides
CSS
venkatachalam84
1.8K views
•
30 slides
Bootstrap 3
Lanh Le
2K views
•
28 slides
What's hot
(20)
Curso css
Jesus Luque Medina
•
1.6K views
Introduction to Bootstrap
Ron Reiter
•
41.7K views
MySQL 5.7 NF – JSON Datatype 활용
I Goo Lee
•
7.9K views
HTML 5 Tables and Forms
Doncho Minkov
•
2.2K views
CSS
venkatachalam84
•
1.8K views
Bootstrap 3
Lanh Le
•
2K views
1 03 - CSS Introduction
apnwebdev
•
998 views
Introduction to HTML
Seble Nigussie
•
218 views
MySQL Performance Tuning 101
Mirko Ortensi
•
2.3K views
Third party libraries and OSGi - a complicated relationship
Sascha Brinkmann
•
1.1K views
redis 소개자료 - 네오클로바
NeoClova
•
205 views
PostgreSQL: Joining 1 million tables
Hans-Jürgen Schönig
•
5.8K views
Css ppt
Nidhi mishra
•
2.2K views
Open Source 101 2022 - MySQL Indexes and Histograms
Frederic Descamps
•
353 views
CSS ppt
Sanmuga Nathan
•
22.9K views
Id and class selector
Jesus Obenita Jr.
•
468 views
HTML and CSS crash course!
Ana Cidre
•
2.6K views
Introduction to HTML
Ajay Khatri
•
387 views
css.ppt
bhasula
•
18K views
PostgreSQL Tutorial For Beginners | Edureka
Edureka!
•
1K views
Viewers also liked
Something Different for the Best Web Solution!
純生 野田
13.9K views
•
59 slides
プロ用CMSフレームワークテーマ「echo」のご紹介
Seiko Kuchida
3.7K views
•
53 slides
MTを使った巨大トラフィックの捌き方
Koji Ogata
7.9K views
•
22 slides
Web制作の幅が広がる! プロジェクトの傾向から考える、 2つ目•3つ目のCMS選び
Seiko Kuchida
22K views
•
123 slides
Movable Type Meetup JSON - MTDDC Meetup TOKYO 2014
bitpart
3.4K views
•
47 slides
MovableTypeの実務制作で考慮すること
Seiko Kuchida
4.7K views
•
55 slides
Viewers also liked
(19)
Something Different for the Best Web Solution!
純生 野田
•
13.9K views
プロ用CMSフレームワークテーマ「echo」のご紹介
Seiko Kuchida
•
3.7K views
MTを使った巨大トラフィックの捌き方
Koji Ogata
•
7.9K views
Web制作の幅が広がる! プロジェクトの傾向から考える、 2つ目•3つ目のCMS選び
Seiko Kuchida
•
22K views
Movable Type Meetup JSON - MTDDC Meetup TOKYO 2014
bitpart
•
3.4K views
MovableTypeの実務制作で考慮すること
Seiko Kuchida
•
4.7K views
Color Testerはどうやって文字の色を拾っているのか?
純生 野田
•
2.5K views
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
純生 野田
•
3K views
Movable Type for AWS - JAWS-UG 沖縄 CMS祭り!
Yuji Takayama
•
4.4K views
ディレクターからみたMovable Type + PowerCMSの優位性
Renji Yoneda
•
8.8K views
UXD-based Biz Development / ユーザエクスペリエンスデザインをベースにした事業創造のススメ
Hiroyuki Arai
•
10.8K views
Webアクセシビリティが無視されすぎで気にくわない。
uenoyuuki
•
27K views
「UXデザインと組織論」に、正面から向きあってみた:2016年2月27日 『人間中心デザイン』HCD導入設計論
Yoshiki Hayama
•
12.4K views
UIデザインは誰のもの?
GMO Pepabo, Inc.
•
34.2K views
YAPC::Kansai 2017 - macOSネイティブアプリ作成におけるPerlの活用
純生 野田
•
2K views
アプリを生み出す現場でUI/UXデザイナーが意識するべきこと:RoomClip
takaaya
•
62K views
Astah Community スタートガイド
ChangeVision
•
574K views
UXとブランド
Takehisa Gokaichi
•
81.7K views
Memcachedの仕組みと設定
Tatsuya Akashi
•
4.3K views
Similar to やはりお前らのMTMLは間違っている!
MT meets PHP
純生 野田
10K views
•
56 slides
MT meets PHP - PHP conference Kansai 2013
純生 野田
18.3K views
•
62 slides
Inside Movable Type
純生 野田
6.6K views
•
72 slides
ディレクター・ノンプログラマー目線のMovable Type
Yasufumi Nishiyama
3.3K views
•
101 slides
20160610 mtsaga handson_public
Six Apart
451 views
•
104 slides
ブログメディアにおけるData APIの活用について
Hatsuhito UENO
1.4K views
•
48 slides
Similar to やはりお前らのMTMLは間違っている!
(12)
MT meets PHP
純生 野田
•
10K views
MT meets PHP - PHP conference Kansai 2013
純生 野田
•
18.3K views
Inside Movable Type
純生 野田
•
6.6K views
ディレクター・ノンプログラマー目線のMovable Type
Yasufumi Nishiyama
•
3.3K views
20160610 mtsaga handson_public
Six Apart
•
451 views
ブログメディアにおけるData APIの活用について
Hatsuhito UENO
•
1.4K views
初めてのMT plugin
onagatani
•
2.1K views
CSS Nite in Matsuyama vol.1 - session 4
arisu yano
•
1.2K views
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
kwatch
•
34K views
プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~
Takeuchi Yuichi
•
2.4K views
LDD'12/Summer in KITAMI Opening Slide
ohotech
•
383 views
ザ・ドキュメント~うまくいかないNoSQL~
Akihiro Kuwano
•
27.4K views
More from 純生 野田
アクセシビリティで企業価値を高める、小さな会社の戦い方
純生 野田
1.5K views
•
66 slides
PowerCMS X
純生 野田
1.2K views
•
80 slides
次世代版 PowerCMS 開発プロジェクトのご紹介
純生 野田
1.8K views
•
126 slides
PowerCMS Conference
純生 野田
413 views
•
22 slides
PowerCMS X
純生 野田
2.4K views
•
117 slides
アルファサード株式会社はなぜ アクセシビリティに取り組むのか
純生 野田
3.4K views
•
40 slides
More from 純生 野田
(20)
アクセシビリティで企業価値を高める、小さな会社の戦い方
純生 野田
•
1.5K views
PowerCMS X
純生 野田
•
1.2K views
次世代版 PowerCMS 開発プロジェクトのご紹介
純生 野田
•
1.8K views
PowerCMS Conference
純生 野田
•
413 views
PowerCMS X
純生 野田
•
2.4K views
アルファサード株式会社はなぜ アクセシビリティに取り組むのか
純生 野田
•
3.4K views
About PowerCMS4.3
純生 野田
•
2K views
オーサリングツールとしてのCMSとWebアクセシビリティ
純生 野田
•
1.9K views
The Next PowerCMS
純生 野田
•
2K views
The Next PowerCMS
純生 野田
•
2.5K views
ウェブアクセシビリティチェックツール開発者の頭ん中
純生 野田
•
1.4K views
PowerCMS 8341 のご紹介
純生 野田
•
3.3K views
SEOの本質から考える PowerCMSを活用した 検索エンジン最適化
純生 野田
•
2.9K views
MTで学ぶセキュアプログラミング@MT Tokyo
純生 野田
•
2.2K views
Mt seminar hiroshima_public
純生 野田
•
1.7K views
Mac OSにおけるShellコマンドの活⽤用 (Xojo 勉強会)
純生 野田
•
3K views
Power cms3+azure
純生 野田
•
2.3K views
mt-plugin-mt-translate - MTDDC
純生 野田
•
2.6K views
PowerCMS Social
純生 野田
•
1.7K views
SixApart Day 2011/第28回WebSig会議 Lightning Talk
純生 野田
•
2.3K views
Recently uploaded
遠隔お酌IoTLT2309.pptx
Yoshiaki Ito
149 views
•
12 slides
2023情報処理学会関西支部大会-G12.pdf
KoseiShimoda1
7 views
•
11 slides
CatBoost on GPU のひみつ
Takuji Tahara
780 views
•
30 slides
拡散する画像生成.pdf
NTTDOCOMO-ServiceInnovation
45 views
•
38 slides
インフラチームとCCoEの関係.pptx
ssuser5c7ee4
28 views
•
18 slides
遠征ドルヲタのための便利サイトを作ってみた
Kenta Fujimoto
11 views
•
24 slides
Recently uploaded
(13)
遠隔お酌IoTLT2309.pptx
Yoshiaki Ito
•
149 views
2023情報処理学会関西支部大会-G12.pdf
KoseiShimoda1
•
7 views
CatBoost on GPU のひみつ
Takuji Tahara
•
780 views
拡散する画像生成.pdf
NTTDOCOMO-ServiceInnovation
•
45 views
インフラチームとCCoEの関係.pptx
ssuser5c7ee4
•
28 views
遠征ドルヲタのための便利サイトを作ってみた
Kenta Fujimoto
•
11 views
GraphQLはどんな時に使うか
Yutaka Tachibana
•
17 views
20230921_IoTLT_vol103_kitazaki_v1.pdf
Ayachika Kitazaki
•
170 views
磁石内臓イヤリングによる磁力変化を利用したジェスチャ識別
sugiuralab
•
7 views
CCoE実践者コミュニティ#1_CCoEが進めるセキュリティカイゼンの旅.pptx
Tomoaki Tada
•
69 views
画像生成AIの問題点
iPride Co., Ltd.
•
13 views
ヒアラブルデバイスにおける音漏れ信号を用いた空中ジェスチャ認識
sugiuralab
•
6 views
MLOps Course Slides_JP(配布用).pdf
Yuya Yamamoto
•
125 views
やはりお前らのMTMLは間違っている!
1.
やはりお前らのMTML は間違っている! MTDDC Meetup TOKYO
2015 ! Junnama Noda (Alfasado inc.)
2.
ゴールドスポンサーになりました!
3.
⾃⼰紹介 ✴ アルファサード株式会社 代表取締役 ✴
PowerCMS 開発者 ✴ ウェブアクセシビリティ エバンジェリスト ✴ Movable Type エバンジェリスト ✴ CPAN Author で MTプラグイン開発者
4.
Movable Type <ul>! <MT:Entries limit="10"
include_blogs="all">! <li>! <a href="<MT:EntryPermalink>">! <MT:EntryTitle>! </a>! </li>! </MT:Entries>! </ul>!
5.
WordPress <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>
6.
<?php か! PHPなのか?
7.
SetVarBlockで変数指定!?
8.
tokuchou_setsubi_01 tokuchou_setsubi_02 tokuchou_setsubi_03 …
9.
(;´Д`)
10.
気を取り直して参りましょう!
11.
前提(2つのプラグイン)
12.
https://github.com/alfasado/mt-plugin-get-hash-var
13.
https://github.com/alfasado/mt-plugin-dom-document
14.
なぜ間違ってしまうのか? ✴ 案件規模が⼤きくなり、要件は複雑(怪奇)に ✴ 何でも聞いてきやがって、な営業w ✴
俺MTタグ得意だぜ、変数分岐お任せあれ ✴ MTタグで頑張ればいけるんじゃね? ✴ 変数に突っ込んでソートして MTLoopで回せば 何とかなるんじゃね?
15.
なぜいけないのか? ✴ 直せない。あいつが書いたの俺、直せない(泣 ✴ わかんね。わかんねぇよ。 ✴
何で修正箇所と別のところ壊したのさ! ✴ ここ直したら、影響範囲どこまで及ぶのさ、こ、 怖いよ修正すんの。 ✴ 担当者、辞めちゃったんだよね。
16.
(;´Д`)
17.
MTSetVarがすべての始まり
18.
おさらい <mt:SetVarBlock name="site_name">! <mt:WebsiteName>! </mt:SetVarBlock>! ! <mt:WebsiteName setvar="site_name">! ! <mt:SetVar
name="site_name2" value="$site_name">! ! <mt:If name="site_name" like="MTDDC">! # do Something.! </mt:If> <= 空⽩・改⾏が含まれるのに注意
19.
変数とは? https://ja.wikipedia.org/wiki/変数_(プログラミング) プログラミングにおいて、変数(へんすう、variable)とは、プ ログラムのソースコードにおいて、扱われるデータを⼀定期間記 憶し必要なときに利⽤できるようにするために、データに固有の 名前を与えたものである。 ⼀⼈⼀⼈の⼈間が異なる名前によって区別されるように、⼀つ⼀ つの変数も名前によって区別される。これにより、複数のデータ を容易に識別することができる。変数を区別するための名前を特 に識別⼦という。また⼀般に、変数が表しているデータをその変 数の値(あたい)という。
20.
変数とは、メモリに値を書き込むこと (少々乱暴だが) https://www.youtube.com/watch?v=755AIUT5ZME 参考
21.
変数とは何か ✴ 名前をつけて、メモリに値を書き込む ✴ 名前で値を取得できる ✴
処理が終ると変数は消える ✴ MTにおける処理の終わりは、テンプレートがビ ルドされた時 ✴ つまり、テンプレートが読み出されビルドされ るまでが変数の寿命
22.
MTのテンプレート変数は、 グローバル変数である
23.
グローバル変数とは? https://ja.wikipedia.org/wiki/グローバル変数 グローバル変数(⼤域変数、英: global variable)は、コンピュー タプログラミングにおいて全てのスコープからアクセスできる変 数のことである。対する語は、ローカル変数である。(中略) ⼀般にグローバル変数は、その⾮局在的な性質ゆえに、好ましく ない実践だと考えられている。すなわち、グローバル変数は潜在 的にどこかで変更される可能性があり、またプログラムの⼀部は それに依存してしまう恐れがあるからである。 (中略)相互依存が⾼まることは複雑性を増⼤することにつながる。
24.
Perl sub main_hdlr {! my
$x = 1;! my $y = 2;! print sub_hdlr( $x, $y );! $x;! }! ! sub sub_hdlr {! my ( $value1, $value2 ) = @_;! my $x = $value1 + $value2;! return $x;! } <= 1 <= 3
25.
Movable Type <mt:Setvar name="x"
value="1">! <mt:Setvar name="y" value="1">! <mt:Setvar name="x" value="$y" op="+">! ! <mt:Var name="x">! ! <= 2
26.
Movable Type <mt:Include module="共通変数">! ! <mt:If
name="some_condition" eq="1">! # do something.! </mt:If>! some_condition! はここで定義 グローバル変数なのに、わかんない! 書き換えてしまうと、全体に影響
27.
どうすれば良いか? ✴ モジュールのインクルードを使わない(無理だろ) ✴ 常に同じテンプレート内で変数を定義する(現実 的じゃないよね) ✴
コメントを⼊れる(変数を定義している箇所でい いの?) ✴ 絶対使われていない変数に⼀回代⼊してから使 う?(美しくない)
28.
Movable Type <mt:Setvar name="x"
value="1">! <mt:Setvar name="y" value="1">! ! <mt:LocalVars>! <mt:Setvar name="x" value="$y" op="+">! <mt:Var name="x">! </mt:LocalVars>! ! <mt:Var name="x">! ! <= 2 <= 1 変数を局所化する
29.
Movable Type <mt:Include module="共通変数">! ! <mt:If
name="some_condition" eq="1"! note="会員属性が通常会員の時">! # do something.! </mt:If>! コメントは利⽤箇所でこそ重要
30.
Movable Type <mt:SetVar name="特徴"
! value="24時間365⽇の監視付き、低価格の専⽤サーバー">! ! <mt:Var name="特徴"> ⽇本語でOK
31.
中級編
32.
お題 タイトルとキーワード欄に「東 京」を含み、本⽂に「MTDDC」 を含む記事を最⼤10件出⼒
33.
<mt:Setvar name="show_entries_counter" value="0">! <mt:Entries>! <mt:EntryKeywords
setvar="entry_keywords">! <mt:EntryTitle setvar="entry_title">! <mt:EntryBody setvar="entry_body">! <mt:If name="entry_keywords" like="東京">! <mt:If name="entry_title" like="東京">! <mt:If name="entry_body" like="MTDDC">! <mt:If name="show_entries_counter" lt="10">! <mt:Unless name="show_entries_counter">! <ul>! </mt:Unless>! <li><mt:EntryTitle></li>! <mt:Setvar name="show_entries_counter"! op="++" setvar="show_entries_counter">! </mt:If>! </mt:If>! </mt:If>! </mt:If>! <mt:If name="show_entries_counter" eq="10">! </ul>! </mt:If>! </mt:Entries> ロジック=> ロジック=> ビュー=> テンプレート1
34.
<mt:Setvar name="show_entries_counter" value="0">! <mt:Entries>! <mt:EntryKeywords
setvar="entry_keywords">! <mt:EntryTitle setvar="entry_title">! <mt:EntryBody setvar="entry_body">! <mt:SetVar name="show_entry" value="0">! <mt:If name="entry_keywords" like="東京">! <mt:If name="entry_title" like="東京">! <mt:If name="entry_body" like="MTDDC">! <mt:If name="show_entries_counter" lt="10">! <mt:SetVar name="show_entry" value="1">! <mt:Setvar name="show_entries_counter" ! op="++" setvar="show_entries_counter">! </mt:If>! </mt:If>! </mt:If>! </mt:If>! <mt:If name="show_entry">! <mt:Unless name="show_entries_counter"><ul></mt:Unless>! <li><mt:EntryTitle></li>! <mt:Setvar name="show_entries_counter"! op="++" setvar="show_entries_counter">! </mt:If>! <mt:If name="show_entries_counter" eq="10">! </ul>! </mt:If>! </mt:Entries> ロジック=> ビュー=> テンプレート2
35.
<mt:Setvar name="show_entries_counter" value="0">! <mt:Entries>! <mt:EntryKeywords
setvar="entry_keywords">! <mt:EntryTitle setvar="entry_title">! <mt:EntryBody setvar="entry_body">! <mt:SetVar name="show_entry" value="0">! <mt:If name="entry_keywords" like="東京">! <mt:If name="entry_title" like="東京">! <mt:If name="entry_body" like="MTDDC">! <mt:If name="show_entries_counter" lt="10">! <mt:EntryId setvar="entry_id">! <mt:SetVar name="entry_ids"! function="push" value="$entry_id">! <mt:Setvar name="show_entries_counter" ! op="++" setvar="show_entries_counter">! </mt:If>! </mt:If>! </mt:If>! </mt:If>! </mt:Entries> ロジックのみ=> 前半 テンプレート3
36.
<mt:Entries entry_ids="$entry_ids">! <mt:If name="__first__"><ul
class="entries_widget"></mt:If>! <li class="<mt:If name="__odd__">odd! <mt:Else>even</mt:If>">! <a href="<mt:EntryPermalink>">! <mt:EntryTitle escape="html">! </a>! <span class="date"><mt:EntryDate></span>! <p class="description">! <mt:EntryExcerpt remove_html="1">! </p>! </li>! <mt:If name="__last__">! </ul>! </mt:If>! </mt:Entries>! ビューのみ=> 後半 テンプレート3 entry_idsはGetHashVarプラグインが 提供するモディファイア
37.
<mt:Setvar name="show_entries_counter" value="0">! <mt:Entries>! <mt:EntryKeywords
setvar="entry_keywords">! <mt:EntryTitle setvar="entry_title">! <mt:EntryBody setvar="entry_body">! <mt:SetVar name="show_entry" value="0">! <mt:If name="entry_keywords" like="東京">! <mt:If name="entry_title" like="東京">! <mt:If name="entry_body" like="MTDDC">! <mt:If name="show_entries_counter" lt="10">! <mt:SetHashVars name="cols">! title=<mt:EntryTitle>! excerpt=<mt:EntryExcerpt>! date=<mt:EntryDate>! permalink=<mt:EntryPermalink>! </mt:SetHashVars>! <mt:SetVar name="entries"! function="push" key="$__counter__" value="$cols">! <mt:Setvar name="show_entries_counter" ! op="++" setvar="show_entries_counter">! </mt:If>! </mt:If>! </mt:If>! </mt:If>! </mt:Entries> ロジックのみ=> テンプレート4 前半 SetHashVarsはGetHashVarプラグインが提供 (setHashVarタグ使えば標準機能だけでも可能) <= 変数にハッシュで格納
38.
<mt:Loop name="entries">! <mt:If name="__first__"><ul
class="entries_widget"></mt:If>! <li class="<mt:If name="__odd__">odd! <mt:Else>even</mt:If>">! <a href="<mt:Var name="__value__{permalink}">">! <mt:Var name="__value__{title}" escape="html">! </a>! <span class="date">! <mt:Var name="__value__{date}"></span>! <p class="description">! <mt:Var name="__value__{excerpt}"! remove_html="1">! </p>! </li>! <mt:If name="__last__">! </ul>! </mt:If>! </mt:Loop>! ビューのみ=> テンプレート4 後半 ただし、変数は諸刃の件。ググれないし、定義した⼈にしかわからないから。
39.
name: EntriesLikeFilter! tags:! filters:! Entries:! like_filter:! handler: >
! sub {! my ( $ctx, $args, $cond ) = @_;! for my $key! ( keys %{ $args->{ like_filter } } ) {! $ctx->{ terms }->{ $key } =! { like => '%' .! $args->! { like_filter }->{ $key } .'%' };! }! } テンプレート5 プラグイン(config.yaml)
40.
<mt:SetHashVars name="entries_condition">! title=東京! keywords=東京! text=MTDDC! </mt:SetHashVar>! ! <mt:Entries like_filter="$entries_condition">! <mt:If
name="__first__"><ul class="entries_widget"></mt:If>! <li class="<mt:If name="__odd__">odd! <mt:Else>even</mt:If>">! <a href="<mt:EntryPermalink>">! <mt:EntryTitle escape="html">! </a>! <span class="date"><mt:EntryDate></span>! <p class="description">! <mt:EntryExcerpt remove_html="1">! </p>! </li>! <mt:If name="__last__">! </ul>! </mt:If>! </mt:Entries>! テンプレート5 たいへんよくできました!
41.
MTタグって作れるんだぜ?
42.
Model View Controller https://ja.wikipedia.org/wiki/Model_View_Controller MVC(Model View
Controller モデル・ビュー・コントローラ) は、ユーザーインタフェースをもつアプリケーションソフトウェ アを実装するためのデザインパターンである。 アプリケーションソフトウェアの内部データを、ユーザーが直接 参照・編集する情報から分離する。そのためにアプリケーション ソフトウェアを以下の3つの部分に分割する。 ✴model: アプリケーションデータ、ビジネスルール、ロジック、関数 ✴view: グラフや図などの任意の情報表現 ✴controller: ⼊⼒を受け取りmodelとviewへの命令に変換する
43.
サーバーサイド エンジニア フロントエンド エンジニア ロジックの実装 MVCのM+C ビューの実装 MVCのV
44.
<mt:MicrosoftProducts sort_by=„released_on"! sort_order="descend" limit="10">! <mt:If
name="__first__"><ul></mt:If>! <li><mt:MicrosoftProductName></li>! <mt:If name="__last__"></ul></mt:If>! </mt:MicrosoftProducts> もしMicrosoft様のウェブサイトなら
46.
CakePHPのView <table>! <tr>! <th>Id</th>! <th>Title</th>! <th>Created</th>! </tr>! <!-- Here is
where we loop through our $posts array, printing out post info -->! <?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>!
47.
MTCakeのView <mt:cake:loop model="Post">! <mt:ignore>! or <mt:cake:loop
model="Post" stash="posts">! </mt:ignore>! <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>!
48.
<?php foreach ($posts
as $post): ?>! <tr>! <td><?php echo $post['Post']['id']; ?></td> <mt:cake:loop model="Post">! <tr>! <td><mt:var name="id"></td> モデルを変えれば書き⽅は同じ、同じ振るまい
49.
MTMLへの疑問?
50.
https://github.com/alfasado/mt-plugin-object-loop
51.
汎⽤的なMTObjectLoop <mt:ObjectLoop model="entry"! include_blogs="all" keyword="Keyword"! sort_order="descend"
sort_by="crearted_on">! <mt:If name="__first__"><ul></mt:If>! <li><mt:Var name="text" trim_to="25+..."></li>! <mt:If name="__last__"></ul></mt:If>! </mt:ObjectLoop>! <mt:ObjectLoop model="comment"! include_blogs="all"! sort_order="descend" sort_by="crearted_on">! <mt:If name="__first__"><ul></mt:If>! <li><mt:Var name="text" trim_to="25+..."></li>! <mt:If name="__last__"></ul></mt:If>! </mt:ObjectLoop>!
52.
汎⽤的なMTObjectLoop ✴ MTObjectLoop =
model指定であらゆるモデル のデータを出⼒できる ✴ MTEntryLoop、MTEntryModelという別名を指 定可能 ✴ tag、field:foo対応 ✴ オブジェクトごとの振る舞いはプラグインで拡 張可能
53.
覚えるのひとつでいいんだぜ!
54.
上級編 というか、間違った⽅向のテクニック利⽤
55.
お題 特定の条件の時だけ、 mt:Entriesにカスタムフィール ドによるフィルタ指定をしたい
56.
<mt:Entries! <mt:If name="want_filter">field.foo="1"</mt:If>>! ...! </mt:Entries> こう書ければいいんだけどね。
57.
<mt:Unless decode_html="1" mteval="1">! <mt:Entries! <mt:If
name="want_filter">! field.foo="1"! </mt:If>>! ...! </mt:Entries>! </mt:Unless> テンプレート1
58.
<mt:setVarBlock name="search1">/<lz:/g</mt:setVarBlock>! <mt:setVarBlock name="replace1"><</mt:setVarBlock>! <mt:setVarBlock
name="replace1" append="1">mt:</mt:setVarBlock>! ! <mt:setVarBlock name="search2">/</lz:/g</mt:setVarBlock>! <mt:setVarBlock name="replace2"><</mt:setVarBlock>! <mt:setVarBlock name="replace2" append="1">/mt:</mt:setVarBlock>! ! <mt:Unless regex_replace="$search1","$replace1"! regex_replace="$search2","$replace2" mteval="1">! ! <lz:Entries <mt:If name="want_filter">field:foo="1"</mt:if>>! <lz:If name="__first__"><ul></lz:If>! <li><lz:EntryTitle></li>! <lz:If name="__last__"></ul></lz:If>! </lz:Entries>! </mt:Unless> テンプレート2
59.
やはりお前らのMTMLは間違っている!
60.
こういうのをTipsとかテクニックとか⾔うな!
61.
どこが間違っているのか ✴ 管理画⾯のテンプレート検索で⽬的の箇所がヒッ トしない ✴ decode_html
のパターンでは、HTML(デザイン) の修正時に修正が困難 ✴ やりすぎると⾒通しが悪くなる ✴ replace のパターンでは⽂字列「<lz:」「</lz:」 がブロック内の出⼒結果に含まれていないかど うかを考慮しておく必要がある
62.
<mt:getElementById id="tmpl_entries" setvar="tmpl_entries">! <mt:removeAttribute
name="id" node="tmpl_entries">! ! <mt:If name="want_filter">! <mt:setAttribute node="tmpl_entries" attr="field.foo","1">! </mt:If>! ! <mt:Entries id="tmpl_entries">! ...! </mt:Entries>! テンプレート3 たいへんよくできました!
63.
Tips, Q&Aとか
64.
mt:Includeのblog_idに変数を使うのは? <mt:Include module="HTMLヘッダー" blog_id="$blog_id"> こう書きたい理由は?
開発環境と本番環境でblog_idが違う? <mt:If name="config.IsProduction">! <mt:Include module="HTMLヘッダー" blog_id="2">! <mt:Else>! <mt:Include module="HTMLヘッダー" blog_id="$blog_id">! </mt:If>! もしくは <mt:Unless name="config.IsProduction">! <mt:GetElementById id="html_header" setvar="html_header">! <mt:SetAttribute node="html_header" attributes=„blog_id","$blog_id">! </mt:Unless>! <mt:Include module="HTMLヘッダー" blog_id="2" id="html_header">!
65.
コメントはどこに⼊れたらいい? (本⽇2度⽬)コメントは利⽤時点こそ重要 <mt:Include module="共通変数">! ! <mt:If name="some_condition"
eq="1"! note="会員属性が通常会員の時">! # do something.! </mt:If>!
66.
コメントはどこに⼊れたらいい? <mt:Ignore>第1条件</mt:Ignore>! <mtSetvar name="ad_attr" function="push"
value="area" note="地域">! <mtSetvar name="add_condition" function="push" value="STREQ" note="等しい">! <mtSetvar name="values" function="push" value="江東区" note="江東区">! ! <mt:Ignore>第2条件</mt:Ignore>! <mtSetvar name="ad_attr" function="push" value="station" note="駅">! <mtSetvar name="add_condition" function="push" value="STRINC" note="含む">! <mtSetvar name="values" function="push" value="森下" note="森下">! ! <mt:EstraierSearch ! ad_attr="$ad_attr" add_condition="$add_condition" values="$values">! # do something.! </mt:EstraierSearch> 存在しないモディファイアは無視される
67.
コメントはどこに⼊れたらいい? https://github.com/alfasado/mt-plugin-template-note
68.
MTEntriesとMTPagesを共通化したい <mt:If name="archive_type" eq="Individual">! <mt:Entries>! <mt:SetHashVars
name="cols">! title=<mt:EntryTitle>! excerpt=<mt:EntryExcerpt>! date=<mt:EntryDate>! permalink=<mt:EntryPermalink>! </mt:SetHashVars>! <mt:SetVar name="entries"! function="push" key="$__counter__" value="$cols">! </mt:Entries>! <mt:Elseif name="archive_type" eq="Page">! <mt:Pages>! <mt:SetHashVars name="cols">! title=<mt:PageTitle>! excerpt=<mt:PageExcerpt>! date=<mt:PageDate>! permalink=<mt:PagePermalink>! </mt:SetHashVars>! <mt:SetVar name="entries"! function="push" key="$__counter__" value="$cols">! </mt:Pages>! </mt:If>! <mt:Loop name="entries">! # do something.! </mt:Loop>
69.
MTEntriesとMTPagesを共通化したい <mt:If name="archive_type" eq="Individual">! <mt:SetVar
name="class_type" value="entry">! <mt:Elseif name="archive_type" eq="Page">! <mt:SetVar name="class_type" value="page">! </mt:If>! ! <mt:Entries class_type="$class_type">! #do something.! </mt:Entries> http://www.movabletype.jp/documentation/appendices/tags/entries.html
70.
最後に、絶対にやってはいけないこと <mt:Var name="request.foo"> ※Dynamicもしくは cgiアプリで <mt:Var
name="request.foo" escape="html"> ?foo=<script>alert()</script>
71.
まとめ ✴ MTのテンプレート変数はグローバル変数であることを 頭に置いておけ。 ✴ ロジックとビューをできるだけ分けろ。 ✴
コメント重要、どこにどう⼊れるかが問題。 ✴ プラグインを怖がるな。作れなくても誰かが作ってく れるかもしれない。 ✴ リクエストはただ。本家でもMTQでもアルファサード でも。リクエストもコミュニティへの貢献。 ✴ ユーザーの⼊⼒値は必ずエスケープせよ。