mt:Forを使って色々試してみたので、メモエントリーになります。
やろうと思ったきっかけは配列やループ系を勉強する中で、JSのフレームワークでよくあるコンポーネントっぽいものをMTMLで実装してみようかなって思ったのが始まりです。
各ブログでそれぞれのローカルナビゲーションを作ってみる
本来mt:Forの使い方は、カウント処理だったり回数で何かするということが一般的に使われていると思います。
私個人の研究として、これを各ブログで違うローカルナビとかで応用できるかなと思いやってみました。
最初は、mt:loopとかで複数の配列を入れたいなと思ったのですが、うまくいかずmt:Forのform→toで処理で代替してみました。すばらしいTipsではありませんが、こういった使い方もできるなと思いました。
結局ソースコードが長くなってHTMLを直接入れたほうがいいんじゃない?って思ったのですが、構造体だけを維持しつつデータの差し替えだけで管理したかったのでやってみました。
構造体をウェブサイトのテンプレートモジュールで定義
ウェブサイト(親)のテンプレートモジュールで定義することで、各ブログのテンプレートで呼び出せるようにしておきます。
<mt:SetVarTemplate name="navigationSample" key="navigation">
<ul>
<mt:for var="x" from="$navigationStart" to="$navigationCnt">
<li class="<mt:Var name="classSample{$x}" />">
<a href="<mt:Var name="linkSample{$x}" />">
<mt:Var name="labelSample{$x}" />
</a>
</li>
</mt:for>
</ul>
</mt:SetVarTemplate>
- SetVarTemplateをセット
- mt:forをセット
- formとtoは、各ブログテンプレートで変数を定義する(数はブログごとにユニークのため)
- mt:Varは、各ブログテンプレートで配列を定義する
- テンプレートモジュール名:function
各テンプレートのインデックスまたはアーカイブテンプレートで定義
各ブログで使用するフォーマットは以下のように定義してみました。
<mt:Ignore>テンプレートモジュールの読み込み</mt:Ignore>
<mt:Include module="function" parent="1" />
<mt:ignore>** ローカル変数 **</mt:ignore>
<mt:Ignore>Countの定義</mt:Ignore>
<mt:SetVars>
navigationStart=1
navigationCnt=3
</mt:SetVars>
<mt:Ignore>Labelの定義</mt:Ignore>
<mt:SetVar name="labelSample" />
<mt:SetHashVar name="labelSample">
<mt:SetVar name="1" value="HOME" />
<mt:SetVar name="2" value="ABOUT" />
<mt:SetVar name="3" value="SERVICE" />
</mt:SetHashVar>
<mt:Ignore>linkの定義</mt:Ignore>
<mt:SetVar name="linkSample" />
<mt:SetHashVar name="linkSample">
<mt:SetVar name="1" value="/index.html" />
<mt:SetVar name="2" value="/about.html" />
<mt:SetVar name="3" value="/service.html" />
</mt:SetHashVar>
<mt:Ignore>classの定義</mt:Ignore>
<mt:SetVar name="classSample" />
<mt:SetHashVar name="classSample">
<mt:SetVar name="1" value="home" />
<mt:SetVar name="2" value="about" />
<mt:SetVar name="3" value="service" />
</mt:SetHashVar>
<mt:Ignore>表示側</mt:Ignore>
<mt:Var name="navigationSample" key="navigation" />
- 各hashで定義したkeyはナンバリングが必要(Forで呼び出す時の値として使用するため)
- それぞれに定義したclass名やlinkやlabelの値をvalueに入れる
これで、同じフォーマットを使って、各ブログで表示する内容を変えることができます。
個人的にSetHashVarが複数設定するところをそれぞれの値ごとに関連性をもたせたかったのですが、keyとvalueしか対応できないので、3つ以上の場合この方法になりました。
他に良い方法が見つかれば良いのですが。。コンポーネント化プラグイン的なのを作るしかないのかなと思いました。(プラグイン作れない身としては結構きつかったり・・・)