Blog

ブログ

俺らのMTMLは間違っているのか?「MTDDC Meetup TOKYO 2015」に参加しました

2015年11月28日に開催された「MTDDC Meetup TOKYO 2015」に参加してきました。

数日前に「そうだ、MTDDC行こう」と思い立ち、新幹線での日帰り参戦でした。観光はなんにもできませんでしたが、リアルな現場に近いセッションが多く、行った甲斐がありました。

かなりのボリュームだったので、全部まとめるのは無理そうです。全体の様子は、@webbingstudioのMTDDC当日のツイートを参照ください。

この記事では、私がMTDDCのいちばんの目的にしていた、アルファサード野田さんのセッション「やはりお前らのMTMLは間違っている!」を掘り下げていきます。

「やはりお前らのMTMLは間違っている!」の背景

ほとんどの人には説明不要かもしれませんが、このセッションの背景について補足します。

Movable Typeの独自タグ「MTML」は、プログラミング言語並みの高度な演算ができることが魅力です。
しかし、構文ルールが複数パターンあるため、ユーザーによってテンプレートの書き方がバラバラで「他の人が作ったテンプレートが読めない」「成果物の引継ぎができない」問題もかなり深刻です。
冒頭の「おかしいMTMLの例」などは会場は大爆笑でしたが、本職のプログラマが見れば失笑ものでしょう。

野田さんのセッションは問題点を指摘し、GitHubで公開中のプラグインを活用した、オブジェクト志向に基づく改善案を提案しています。

従来のMTMLの問題

変数の変更が全てに影響する

MTMLの変数は「グローバル変数」です。このため、値を修正すると以降すべてに影響してしまいます。魔改造レベルになると、それが怖くて改修できないというケースもあります(どのCMSでもありがちな問題ですが)。

野田さんは、本格的なプログラミング言語と同様に「ローカル変数」を使えるようにすれば良いのではないかと考え、変数を局所化するプラグインを自作しています。

各変数の説明がない

冒頭の例のようなのは論外として、経験が長いユーザーであれば、テンプレート内で使用する変数は、きちんとまとめてモジュール化します。さらに、mt:Ignoreでコメントも添えたりします。
mt:TemplateNoteという一行コメントもありますが、他のタグに埋もれてしまうので、私は使ってません。

しかし野田さんは「どんなに外部ファイルにコメントを書いても、実際に利用される箇所で参照できなければ意味がない」と指摘し、以下のようなTIPSを推薦しています。

<mt:Include module="共通変数">
<mt:If name="some_condition" eq="1" note="会員属性が通常会員の時">
# do something.
</mt:If>

長年使っていて知らなかったのですが、MTMLは変数名に日本語を使えます。また、存在しないモディファイアを書いても問題ありません。これを利用して条件分岐にどのような処理をしているのかを書くことができます。
noteモディファイアはわかりやすいので、今後積極的に使っていこうと思います。

MVCの概念を取り入れる

mt:Entriesなどで、基本で用意されているよりも複雑な絞り込みが必要となった場合、スライドの33ページ目(テンプレート1)のような書き方をするのが一般的です。しかし、これだと「処理」と「表示」が混在しているため読みづらいです。

MTMLのコア機能の範囲までの理想が34ページ目(テンプレート2)ですが、野田さんは自作のプラグインを利用しての簡略化を紹介しています。

オブジェクト指向

MTMLは、初級者には覚えやすいですが、中級以降になると面倒になってきます。記事、ページ、コメントなど、同じ性質を持っている情報に違う名前のタグが作られており、しかも引き出せる情報がバラバラなので、コードの使い回しがしづらいのです。
この辺は、すべて post で統一されているWordPressが圧倒的に楽です。baserCMSもMTMLに近い問題があるかなと思っています。

野田さんは、オブジェクト指向をMovable Typeに導入できる「ObjectLoop」プラグインを公開しています。

https://github.com/alfasado/mt-plugin-object-loop

使い方は51ページ目のとおりです。かなり魅力的です。私が保守に携われない案件では導入が難しくはあるのですが、積極的に使ってみたいです。

タグの無効化を使ったTIPS?

58ページ目では、ひじょうに高度なTIPSが紹介されています。説明が難しいし、私もやったことがないのですが、MTMLタグをわざと無効化することで、時間差で二回処理させています。

これの最大の問題点は、テンプレート検索ができなくなることと、HTMLの改修性が極端に下がることだと、野田さんは指摘しています。これは私も完全に同意で、これをやるなら自力でプラグインを作るか、PHPを書くことになりそうです。

このテクニックはa-blog cmsでも使われているのですが…おや誰か来たようだ。

プラグインを怖がるな、リクエストもコミュニティへの貢献だ

ここまでの内容の通り、野田さんは問題を解決する際にプラグインを積極的に導入します。これは、Movable Typeのユーザーではけっこう珍しいです。

MTユーザーはMTMLは書けますが、PerlやPHPはほとんどわからない人が多いです。また、安定性・永続性を求めるサイトに利用されることが多いので、冒険がしづらいのです。
これはWordPressとは真逆で、WordPressの自由すぎる文化への反発もあるのかもしれません。

野田さんは、読みにくい間違ったMTMLを書くくらいなら、プラグインを積極的に導入すべきだ、プラグイン開発者に要望を出すのもコミュニティへの貢献だと締めくくりました。

まとめ:野田さんのMTMLも間違っている…気がする

というわけで、野田さんの話は高度ではありますが、Movable Typeを本格的に扱うなら知っておかなければならない話ばかりで、勉強になりました。

私事になりますが、今、Movable Typeのプロ用のフレームワークテーマ「echo」を作っています。
MTDDCから帰ったら仕上げに入る予定だったのですが、学んだことを参考に大幅にMTMLを書き直しています。

echoを作っている立場から野田さんのセッションを見て、私が疑問に思ったのは
ノンプログラマには、本当にオブジェクト指向のコードの方が読みやすいのだろうか
という点でした。

Movable Typeを扱っている人の多くはノンプログラマです。CMSの構築を分業することはまれで、MVCもひとりですべて取り扱うことになります。

全体の行数が減ったとはいえ、そういった人たちが外部から変更できないローカル変数や、ごりごり回っているハッシュや、Movable Typeの公式ドキュメントにないMTMLを理解し、共有できるだろうか…と考えてしまうのです。

私は、a-blog cmsの「ビューではプログラムをできるだけ書かせない」というコンセプトの影響も受けているため、MTMLをプログラミング言語と同等に扱うことを避けています。また、受注製作・完全納品が多い仕事柄「自分よりも技術が下位の制作者に確実に引き継ぐ」ことを優先しています。

もうこればかりは考え方の違いなのでどうにもならんのですが、あまり頑固にならずに、もう少しプラグインの導入に積極的になった方がいいなあ、と思いました。