これは Mayaa Advent Calendar 2015 の3日目です。昨日は「JSPで書かれたシステムをMayaaに移行する」でした
さて前回の記事で、JSPでフロントが書かれたプロジェクトをMayaaに移行する例を書きました。しかし、実際にWebシステムのビューをすべて実装しようとすると大変です。
そこで、今日から数日に分けて私の経験に基づく、MayaaでWebサイトを実装するテクニックを紹介します。
自分で言うのも恥ずかしいですが、「いしがみメソッド」ってなやつです (^^;
いしがみメソッド1「命名規則は徹底せよ」
デザイナーはMayaaファイルを読めません。したがって、m:id一つ一つ何を意味するのか、意思疎通をしておくことが必須です。
1.m:id含め、プログラム都合の識別子は常に大文字を使う
Mayaaを使う最大の目的は、デザイナーとプログラマーが平行して、最終的に出力される一つのHTMLを作ることです。
したがって、同時にひとつのHTMLを作ることになります。そうすると、二人して同時にclassを作ってしまったりします。
そこで、プログラマーが書くものは常に大文字、デザイナーが書くものは常に小文字というように、命名規則を分けることを推奨します。
プログラマーが小文字、デザイナーが大文字でも良いですが、制御を扱うm:idが大文字の方が埋もれないメリットが有り、次のようなスタイルが良いです。
<div m:id="IF_MEMBER" class="member_box">
...
</div>
2.m:idのする仕事を4種類に限定する
僕は発行するm:idを次の4種類に限定しています。
- *_HERE
- その場所に文字列を出力する
- *_TAG
- そのタグの属性を変化させたり要素を足したりする
- IF_*
- そのタグ及びその子要素が特定の条件にもとづいて消える
- LOOP_*
- そのタグ及びその子要素を特定の条件に基づいて繰り返す
これまでの経験から、この4種類だけでWebサイトは作れ作れます。
3.それぞれの実装方法
それぞれ、実装の方法も固定されます。_HEREは、その場に出力されれば良いので、m:writeプロセッサーをそのまま使うのが良いでしょう。
<!-- タイトルを出力します -->
<m:write m:id="TITLE_HERE" value="${page.getTitle()}" />
m:writeプロセッサーではなく、m:insertプロセッサーの場合もあります。これらは、デザイン視点から見たら違いがないので、m:idの名前は、常にデザイナー視点で考えてください。
_TAGは主にタグの属性を変更するために使用します。場合によっては、hidden要素の追加にも使います。hiddenはデザインとは関係ない要素なので、テンプレートに記述することはせず、常にm:idで出すべきです。
また、属性はデザイナーが編集する場合もあり、m:idで制御する対象とデザイナーが書いた属性がぶつかると、デザイナー側の記述が無効になってしまいます。そこで、事前にどのm:idがどの属性を制御するのかわかるようにしておきます。classやid属性が変化するやつは特に注意が必要です1
<!-- 商品画像を表示します。src属性を制御します -->
<m:echo m:id="ITEM_IMAGE_TAG">
<m:attribute name="src" value="${image.getSrc()}" />
</m:echo>
IFのm:idは、そのままm:ifプロセッサーを使ってはいけません。m:ifプロセッサーは、条件にマッチしても、自分のタグを消してしまいます。例えば
ダメな例:
<m:if m:id="IF_MEMBER" test=${context.isMember()} />
<div m:id="IF_MEMBER">
会員限定
</div>
↓
会員限定
このようになってしまうと、テンプレート上ではdivで囲まれて前後が改行されているのに、divが消えて横並びになってしまいます。これではいけませんので。正解は次のように書くことです。
良い例:
<m:if m:id="IF_MEMBER" test=${context.isMember()}>
<m:echo><m:doBody /></m:echo>
</m:if>
LOOPも同じことが言えます。
良い例:
<m:forEach m:id="LOOP_ITEM" items=${items}>
<m:echo><m:doBody /></m:echo>
</m:if>
4._TAGの運用な慎重に
これら、4つのルールの中で、*_TAGは唯一汎用的に使うことができます。それは、IFのようにも、_HEREのようにもできます。
このことは、コンポーネント的なm:idを作れる反面、きちんとドキュメントを書かないとデザイナーとの間で混乱を招きます。
例えば、ある時「条件に応じて、display:noneで表示非表示を切り替えられる領域」という意味で「**_AREA_TAG」というものを作りました。
「エリアタグとはなんぞや」
というクレームが上がりました。どうしても、特殊な概念のTAGを作りたければ、事前にネゴっておきましょう。
実際は_INPUT_TAGや、_RADIO_TAG、*_IMAGE_TAGのように指定するべきタグ名と名前を合わせるのが無難な選択です。
ただ、必ずしもタグ名がデザインとシンクロするとも限らないので、この辺りは事前に話し合って決めましょう。
default.mayaaに書いたm:idには接頭辞"common."を付けよう! (2015/12/07 追記)
default.mayaaに書いたm:idはすべてのテンプレートファイルで使えます。これらと各ページ特有のm:idは名前で見分けられるほうが良いです。
ということで、僕は"common."という接頭辞を付けています。
<span m:id="common.SITE_NAME_HERE">サイト名</span>
まとめ
ざっと命名規則について、説明させていただきました。
まとめてみると、常に、同じリソースを、プログラマーとデザイナーが同時に書いているということを意識することが大切です。
Mayaaという技術の採用はプログラマー側が引っ張って導入しているものなので、プログラマーは是非自分の範囲以上に、チーム全体のことを考えてm:idの設計を行ってください。
Mayaaの導入で最も重要なのはチームワークです。明日以降もチームワークを支える様々なテクニックを紹介します。