DreamWeaverテンプレート機能のオプション領域などでグローバルナビゲーションを便利にする
2010 年 1 月 26 日 by 正宗年末進行のせいにして年賀状も書いてない男。正宗です。さっきやっと寒中見舞いが刷り上がりました。
DreamWeaverのテンプレート機能。便利ですよね。うまくつかうとライブラリ機能と組み合わせる事によって大規模なサイト制作におけるケアレスミスを大幅に減らすことが出来ます。
今回はそのテンプレート機能でグローバルメニューをどう作ろうか考えたので、現時点で見つけた一番スマートではないかと思えるやり方を紹介したいと思います。
まずは僕が一生懸命作ったDreamWeaverのテンプレートを見て下さい。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <!-- TemplateBeginEditable name="doctitle" --> <title>マサムネット</title> <!-- TemplateEndEditable --> <link rel="stylesheet" type="text/css" media="all" href="/css/import.css" /> <!-- TemplateBeginEditable name="head" --> <!-- TemplateEndEditable --> </head> <body> <div id="page" class="top"> <div id="header"> <h1><a href="/">マサムネット</a></h1> <ul id="globalNavigation"> <li><a href="/profile/">プロフィール</a></li> <li><a href="/gallery/">ギャラリー</a></li> <li><a href="/contact/">お問い合わせ</a></li> <li><a href="/link/">リンク</a></li> </ul> </div> <div id="contents" class="top"> <!-- TemplateBeginEditable name="maincontents" --> ここにコンテンツが入ります。 <!-- TemplateEndEditable --> </div> <div id="footer"> コピーライト </div> </div> </body> </html>
こうしたテンプレートを作っておく場合、例えば「/profile/」以下のファイルには全部
<li class="self"><a href="/profile/">プロフィール</a></li>
こんな感じで他のリストとは違ったクラス名を付けたくなるかもしれません。
また、/profile/index.htmlページは、メニューからプロフィールのリンクを押しても自身のページに飛ぶだけなのでアンカーを付けたくない、などといったようにページによってメニューが細かく変化する場合が出てきます。
グローバルメニューは編集可能領域にしてしまうとか、それだとテンプレート機能の便利さがスポイルされてしまうのでライブラリと組み合わせて運用するとか、いろいろ試してみたんですがどれも一長一短あって困っていましたが、面白いものを見つけました。
それが「編集可能オプション領域」と「オプション領域」です。
それぞれテンプレート編集画面から「挿入」→「テンプレートオブジェクト」から挿入できます。
普段よく使う「編集可能領域」と一緒の場所にあるので、これは何なのか不思議に思った方も多いと思います。
ところがこれ、実際に使ってみようと思っても、変な画面が出るだけでナニが何やらわけがわからないんですよね。
じつはこれ、JavaScriptの書式でテンプレートを動的に変化させることができるものみたいなんです。
編集可能オプション領域
まずは「編集可能オプション領域」の説明から。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <!-- TemplateBeginEditable name="doctitle" --> <title>マサムネット</title> <!-- TemplateEndEditable --> <link rel="stylesheet" type="text/css" media="all" href="/css/import.css" /> <!-- TemplateBeginEditable name="head" --> <!-- TemplateEndEditable --> <!-- TemplateParam name="profile_class" type="text" value="menu" --> <!-- TemplateParam name="gallery_class" type="text" value="menu" --> <!-- TemplateParam name="contact_class" type="text" value="menu" --> <!-- TemplateParam name="link_class" type="text" value="menu" --> </head> <body> <div id="page" class="top"> <div id="header"> <h1><a href="/">マサムネット</a></h1> <ul id="globalNavigation"> <li class="@@(profile_class)@@"><a href="/profile/">プロフィール</a></li> <li class="@@(gallery_class)@@"><a href="/gallery/">ギャラリー</a></li> <li class="@@(contact_class)@@"><a href="/contact/">お問い合わせ</a></li> <li class="@@(link_class)@@"><a href="/link/">リンク</a></li> </ul> </div> <div id="contents" class="top"> <!-- TemplateBeginEditable name="maincontents" --> ここにコンテンツが入ります。 <!-- TemplateEndEditable --> </div> <div id="footer"> コピーライト </div> </div> </body> </html>
ややこしい記述が増えてきたので順番に見て行きます。
先ずは13行目〜16行目
<!-- TemplateParam name="profile_class" type="text" value="menu" --> <!-- TemplateParam name="gallery_class" type="text" value="menu" --> <!-- TemplateParam name="contact_class" type="text" value="menu" --> <!-- TemplateParam name="link_class" type="text" value="menu" -->
これはDreamWeaverのテンプレート用の記述方式で、例えば13行目はprofile_classという変数の中に"menu"という値がセットすることを意味します。14行目、15行目、16行目も全く同じで、それぞれgallery_class、contact_class、link_classという変数に"menu"という値をセットしています。
そんな変数なんて変なものセットしてどこで使うんだYO!!と思いたいところですが、次に24行目〜27行目を見てみます。
<li class="@@(profile_class)@@"><a href="/profile/">プロフィール</a></li> <li class="@@(gallery_class)@@"><a href="/gallery/">ギャラリー</a></li> <li class="@@(contact_class)@@"><a href="/contact/">お問い合わせ</a></li> <li class="@@(link_class)@@"><a href="/link/">リンク</a></li>
「class="@@(profile_class)@@"」なんていうオットロシイ文字が出てきましたが、落ち着いてみるとこれ、ただのli タグに追加されたクラス属性です。
class="何々”の中がちょっと変わった書き方になってるので複雑に見えますが、
@@( )@@の中はさっき13行目〜16行目で設定した変数が入っています。
先ほどセットした変数をここで実際につかっている、というイメージですね。
テンプレートをこのようにしておくと、このテンプレートからページを作った時に
<li class="menu"><a href="/profile/">プロフィール</a></li> <li class="menu"><a href="/gallery/">ギャラリー</a></li> <li class="menu"><a href="/contact/">お問い合わせ</a></li> <li class="menu"><a href="/link/">リンク</a></li>
こんな感じで作成してくれる、っていうのが「編集可能オプション領域」になります。
ここから当初の目的である「どうやってページごとの特定のメニューだけクラス名を変えるのか?」を実際に試してみます。
テンプレート機能を使おうという記事なので、ここまで読んでる方はその前段階である、DreamWeaverのサイト定義はもう済ませてあると前提で進めて行きます。
サイト定義がよくわからない場合は「DreamWeaver サイト定義」などの語句でヘルプやWEB上の情報を検索してみて下さい。
ファイルの新規作成で「test.html」などのHTMLファイルを作成して開いておいて、メニューの「修正」→「テンプレート」→「テンプレートをページに適用」でHTMLファイルをテンプレートと関連づけます。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!-- InstanceBegin template="/Templates/main.dwt" codeOutsideHTMLIsLocked="false" --> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <!-- InstanceBeginEditable name="doctitle" --> <title>マサムネット</title> <!-- InstanceEndEditable --> <link rel="stylesheet" type="text/css" media="all" href="/css/import.css" /> <!-- InstanceBeginEditable name="head" --> <!-- InstanceEndEditable --> <!-- InstanceParam name="profile_class" type="text" value="menu" --> <!-- InstanceParam name="gallery_class" type="text" value="menu" --> <!-- InstanceParam name="contact_class" type="text" value="menu" --> <!-- InstanceParam name="link_class" type="text" value="menu" --> </head> <body> <div id="page" class="top"> <div id="header"> <h1><a href="/">マサムネット</a></h1> <ul id="globalNavigation"> <li class="menu"><a href="/profile/">プロフィール</a></li> <li class="menu"><a href="/gallery/">ギャラリー</a></li> <li class="menu"><a href="/contact/">お問い合わせ</a></li> <li class="menu"><a href="/link/">リンク</a></li> </ul> </div> <div id="contents" class="top"> <!-- InstanceBeginEditable name="maincontents" --> ここにコンテンツが入ります。 <!-- InstanceEndEditable --> </div> <div id="footer"> コピーライト </div> </div> </body> <!-- InstanceEnd --></html>
test.htmlはこんな感じになると思います。
ここでメニューから「修正」→「テンプレートプロパティ」を選択します。

さきほど苦労してテンプレートで作った変数がずらっと並んでいると思うので、そこからうまく「profile_class」という変数を見つけて、中身の「menu」を「self」と書き換えて下さい。

お見事!グローバルナビゲーション部分のリストが次のように変わったかと思います。
<li class="self"><a href="/profile/">プロフィール</a></li> <li class="menu"><a href="/gallery/">ギャラリー</a></li> <li class="menu"><a href="/contact/">お問い合わせ</a></li> <li class="menu"><a href="/link/">リンク</a></li>
オプション領域
次に「オプション領域」を試してみたいと思います。
これは何かと言うと、テンプレートの中に、オプションとして「付けるか付けないか」をページごとに決められる部分を作る機能です。
(一個前にやったtest.htmlではなく)先ほどのテンプレートに戻って、テンプレート変数を増やしてみます。
<!-- TemplateParam name="profile_class" type="text" value="menu" --> <!-- TemplateParam name="gallery_class" type="text" value="menu" --> <!-- TemplateParam name="contact_class" type="text" value="menu" --> <!-- TemplateParam name="link_class" type="text" value="menu" --> <!-- TemplateParam name="profile_anchor" type="boolean" value="true" --> <!-- TemplateParam name="gallery_anchor" type="boolean" value="true" --> <!-- TemplateParam name="contact_anchor" type="boolean" value="true" --> <!-- TemplateParam name="link_anchor" type="boolean" value="true" -->
追加しているのは下4行目です。上4行と比べて、今度は
type="boolean"
となっています。
プログラムに慣れた方で勘の良い方はこれで理解したかと思いますが、「オプション領域」と「編集可能オプション領域」の違いは、変数がbooleanかそうでないかの違いだけです。
なので先ほどの「編集可能オプション領域」と同じように、こんども変数のセットを行ったら、次はその変数を実際に使う部分を作っていきます。
<li class="@@(profile_class)@@">@@( (profile_anchor) ? '<a href="/profile/">プロフィール</a>' : 'プロフィール' )@@</li> <li class="@@(gallery_class)@@">@@( (gallery_anchor) ? '<a href="/gallery/">ギャラリー</a>' : 'ギャラリー' )@@</li> <li class="@@(contact_class)@@">@@( (contact_anchor) ? '<a href="/contact/">お問い合わせ</a>' : 'お問い合わせ' )@@</li> <li class="@@(link_class)@@">@@( (link_anchor) ? '<a href="/link/">リンク</a>' : 'リンク' )@@</li>
なにやら@@ばっかりで複雑になったようですが、落ち着いて下さい。
実は@@( )@@この中にはJavaScriptが書けるんです。
なので例えば
@@( (link_anchor) ? '<a href="/link/">リンク</a>' : 'リンク' )@@
こんなのも@@( )@@の中だけに注目してみると
(link_anchor) ? '<a href="/link/">リンク</a>' : 'リンク'
こうなります。
こうしてみると、オプション領域の中はただの二項演算子(if 〜 elseのかっこいいやつ)で書けるということになります。
テンプレートを編集したら、test.htmlに戻ってみましょう。

さっき作ったばかりの変数「profile_anchor」を選択して下の「profile_anchorを表示」のチェックを外して下さい。
<li class="self">プロフィール</li> <li class="menu"><a href="/gallery/">ギャラリー</a></li> <li class="menu"><a href="/contact/">お問い合わせ</a></li> <li class="menu"><a href="/link/">リンク</a></li>
こんな感じで、プロフィールだけアンカーが無いリストになったと思います。
まとめ
実は@@( )@@とかJavascriptなんてものを使わなくても、最初からテンプレート編集画面で「挿入」→「テンプレートオブジェクト」から「編集可能オプション領域」や「オプション領域」を選ぶと、何かUIが現れて設定できるのですが、そっちを覚えるよりは僕はJavascriptのほうが馴染みがあるのでこっちの方法を紹介しました。
とにかくテンプレート機能が見違えるくらい柔軟かつ強力になる機能には間違いないので、興味がある方でJavascriptよりはUIからの設定に自信のある方はそちらを試してみても良いと思います!
タグ: DreamWeaver, Tips, 便利, 制作