以前TwitterでDreamweaverってどうよ?メモ帳でよくね?的なRTが回ったとき、
私が便利機能として挙げたのはサイト内全文検索と正規表現置換だったのだけど、もうひとつ、
140文字じゃ到底説明しきれないテンプレートパラメータについて熱く語ってみようと思う。
Dreamweaverのイメージといったらコードの自動補完の次にテンプレート機能っていう感じだから
ソフト使ったことがある人なら100%に近い確率でdwtファイルを作成したり修正したりしたことがあるはずだ。
しかしテンプレートパラメータについては意外と知らない人の方が多い。
メニューを良く見ると「修正」の「ページプロパティ」の下にテンプレートプロパティっていうのがあったりするんだけども、
正規表現に似てプログラミングっぽいからとっつきにくいのかな。
TemplateParamコメントタグ
テンプレートプロパティはテンプレートパラメーターをテンプレートファイル内に挿入してから有効になる。
オプション領域を追加したときにテンプレートパラメーターは追加されるが、設定しない場合には都度手打ち入力しなければならない。
割と面倒なので次のソースのスニペット登録をオススメする。
<!-- TemplateParam name="param_name" type="type of value" value="the value of the parameter" -->
パラメーターはdwtファイル内ならどこでも配置出来るけどヘッダ内がデフォな感じ。
設定箇所
- name → パラメーターの名前。テンプレートプロパティウィンドウを表示した時に表示される
- type → パラメーターのタイプ。設定する値に応じて選ぶ
- text : 文字列型。任意の文字を設定できる
- boolean : ブーリアン型。チェックボックスでオンオフ切り替えることが出来るようになる
- number : 数値型。数字しか設定できない
- value → パラメーターの値。typeと異なる組み合わせは設定できない
テンプレートプロパティを使う上で一番お手軽なのはオプション領域を設定すること。
- オプション領域にしたい範囲を選択
- メニューから「挿入」→「テンプレートオブジェクト」→「オプション領域」を選択
- 表示されたダイアログで名前などの設定をする
- OKを押すとテンプレートタグが追加されてオプション領域化する
パラメータを利用した表示
ある範囲をパラメーターで操作する場合はTemplateBeginIfというテンプレートタグを使用する。
メニューではオプション領域という名前です。
<!-- TemplateBeginIf cond="param_name" --><!-- TemplateEndIf -->
領域の表示を制御するのも便利だがパラメーターだけ使いたいということもある。
テンプレートタグの場合
<!-- #TemplateExpr expr="param_name" -->
@@で囲まれた文字列
@@(param_name)@@
上記のタグを使用するとパラメーターに設定された値だけが表示されます。
例:
<!-- TemplateParam name="hello" type="text" value="World!" --> <strong>@@(hello)@@</strong>
テンプレート式
式を使えばもっと複雑なことも出来る。テンプレートへの挿入の仕方は値と同じ。
パラメータのキーを書いていた場所に式を書きます。
<!-- TemplateBeginIf cond="式" --><!-- TemplateEndIf --> <!-- TemplateExpr expr="式" --> @@(式)@@
式で使える演算子一覧
JavaScriptとほぼ同じ。
- 数値リテラル、ストリングリテラル (二重引用符のシンタックスのみ)、ブール値リテラル (真または偽)
- 単項演算子: +、-、~、!
- 2 項演算子: +、-、*、/、%、&、|、^、&&、||、<、<=、>、>=、==、!=、<<、>>
- 条件演算子(3項演算子): ?:
- 括弧: ()
- フィールド参照 (dot 演算子)
- 変数参照
ブール値リテラルというのがオプション領域で使われるものです。
基本的にどんな演算子を使ってもtrueかfalseかを判別するものになる。
定義済みテンプレート変数
- _document … ドキュメント内のパラメータごとに 1 つずつフィールドがあり、ドキュメントレベルのテンプレートデータを保持します
- _repeat … リピート領域内に表示される式に対してのみ定義されます。 領域に関する組み込み情報を指定します。
- _index … 現在のエントリの数値インデックス (0 から)
- _isFirst … 現在のエントリがリピート領域における最初のエントリである場合に真
- _isLast … 現在のエントリがリピート領域における最後のエントリである場合に真
- _prevRecord … 前のエントリの _repeat オブジェクト
- _nextRecord … 次のエントリの _repeat オブジェクト
- _parent … ネストされたリピート領域では、囲んでいる (外側の) リピート領域に _repeat オブジェクトが与えられます。
- _numRows … リピート領域内のエントリ数の合計
※以上公式サイトより引用
_documentについて
データはオブジェクト形式 Object {'param_name':'param_value'}
になっており、
_document.param_name
または _document[param_name]
でパラメータにアクセスすることが出来る。
式の内部では値、それ以外はキーにアクセスします。
@@(_document.param_name)@@
→ param_nameの値を表示
@@((param_name==false) ? _document.param_name:'hoge')@@
→ param_nameの値かhogeを表示
MultipleIf
条件文をいくつか並べたくなったらMultipleIfを使おう。
構文:
<!-- TemplateBeginMultipleIf --> <!-- TemplateBeginIfClause cond="式" -->式が真の場合に適用されるコンテンツ<!-- TemplateEndIfClause --> <!-- TemplateEndMultipleIf -->
TemplateBeginIfClauseは条件式(TemplateBeginIf)を複数並べることが出来る。
上から順に式の内容をチェックしていき、trueである場合にだけタグ内のコンテンツが表示される。
defaultのないSwitch文、もしくはelseのないif文という感じです。
例:
<!-- TemplateParam name="pageid" type="text" value="" --> <!-- TemplateBeginMultipleIf --> <!-- TemplateBeginIfClause cond="pageid == 'home'" --> <div>HOMEです</div> <!-- TemplateEndIfClause --> <!-- TemplateBeginIfClause cond="pageid == 'contact'" --> <div>CONTACTです</div> <!-- TemplateEndIfClause--> <!-- TemplateBeginIfClause cond="(pageid != 'home')&&(pageid!='contact')" --> <div>HOMEでもCONTACTでもない</div> <!-- TemplateEndIfClause--> <!-- TemplateEndMultipleIf -->
テンプレート式使用例
真の場合だけ要素を表示(単項演算):
<!-- TemplateParam name="cat" type="boolean" value="false" --> <!-- TemplateBeginIf cond="!cat" --> <div>ワン!</div> <!-- TemplateEndIf -->
クラス切り替え(2項演算):
<!-- TemplateParam name="count" type="number" value="2" --> <div@@((count>1)? ' class="over"':' class="safe"')@@>
タイトルの自動挿入(文字列連結+2項演算+条件演算):
<!-- TemplateParam name="pagetitle" type="text" value="" --> <title>@@((pagetitle=='')?'': _document.pagetitle+'|')@@SAMPLE CORPORATION</title>
※式内では+で文字列連結できる。数値相手に使うと計算式になる。
上記ソースを使う場合はタイトルについている編集可能領域タグを外す必要がある。
<!-- TemplateBeginEditable name="doctitle" --><!-- TemplateEndEditable -->
テーブルの背景色を交互に変える(リピート領域):
<!-- TemplateParam name="oddColor" type="text" value="#ff0000" --> <!-- TemplateParam name="evenColor" type="text" value="#0000ff" --> <tr bgcolor="@@((_index & 1) ? oddColor : evenColor )@@">
パンくずリンク(リピート領域+MultipleIf):
<!-- TemplateParam name="pageid" type="text" value="" --> <!-- TemplateParam name="pagetitle" type="text" value="" --> <!-- TemplateBeginIf cond="pageid!='home'" --> <p class="breadcrumb"><a href="index.html">HOME</a> <!-- TemplateBeginRepeat name="breadcrumb" --> > <!-- TemplateBeginMultipleIf --> <!-- TemplateBeginIfClause cond="!_isLast" --><a href="@@(pageid)@@/index.html"><!-- TemplateBeginEditable name="page" -->parentName<!-- TemplateEndEditable --></a><!-- TemplateEndIfClause --> <!-- TemplateBeginIfClause cond="_isLast" --><span class="current">@@(pagetitle)@@</span><!-- TemplateEndIfClause --> <!-- TemplateEndMultipleIf --> <!-- TemplateEndRepeat --> </p> <!-- TemplateEndIf -->
テンプレートタグを使った場所は空白になるので、気になる時は改行なしで全部つなげてしまおう!
正規表現もだけどテンプレートパラメータもJavaScriptがベースになっているそうなので、
使える演算子とか+で文字列を繋げられるところとかはまんまJavaScriptです。
JavaScriptの関数を使用する
試しにmatch使ってみたら正規表現のマッチングが出来た…!
関数全てはチェックしてないですが、matchとreplaceは覚えておくと便利だと思う。
match例:
<!-- TemplateBeginIf cond="pageid.match(/contact/)" -->テンプレートパラメータpageidにcontactという文字列があれば表示<!-- TemplateEndIf -->
replace例:パラメータpagetitleの文字列からひらがなを取り除く
@@(pagetitle.replace(/[あ-ん]/g,''))@@
はじめまして。
DWテンプレート、編集領域の設定くらいしか触らずに「なんかイマイチ」的な結論に至っちゃう方が私の周囲には多いので
すごくわかりやすくて、周りにお勧めしたい記事だと思いコメントさせていただきました。
ちゃんとつかえば、コントリビュートをクライアントに導入してもらって簡易CMSチックな使い方を提案するなどもできますし、
使えるアイテムだと思うのですが、こんなにも広まらないのは公式のドキュメントがわかりにくいのか、そもそもそのあたりを詳しく解説している書籍などもないからなのか・・・。
SWD さん>
コメントありがとうございます。
確かにAdobeのマニュアルは見づらさと情報の拾い難さに定評がありますが、
それはソフトウェアが軒並み多機能が故の宿命ですねw
機能が多ければ使わないものがいくつも出てくるのは仕方ない事ですけど、
便利なものを知らないまま結論付けてしまうのは勿体無いなぁと思って(正規表現の記事も含め)書いた次第です。
ソースコードを書きなれていない人にはちょっと敷居が高いかもしれませんね。
非常に分かりやすいです!DWの解説書などを読んでもいまいちこのあたりの詳しい説明がのっておらず・・・苦戦しておりました。
今後も参考にさせていただきます。ありがとうございました!