この例はあくまでもサンプルです。上記機能の実現には gotoChannelURL() メソッドの方が便利です。URL の組み立てを自動で行ってくれます。
オブジェクト索引
Page オブジェクトはページを表すオブジェクトです。
Page オブジェクトに対しては「要素参照」と同じ方法を使ってページ以下に定義されている要素を参照することができます。例えば、ページ中に「リリース日」という要素が定義されているとすると、展開中に
%aPage.リリース日%
という記述を行うと aPage 中の「リリース日」を取り出すことができます。
また、aPage というページの作成に使われているテンプレートに、例えば generateText() というメソッドが定義されているとすると、展開中に
%aPage.generateText()%
という記述を行うと aPage 中の generateText() メソッドを呼び出して実行することができます。
メソッド名 | 説明 |
---|---|
canonicalURL() | ページの canonical URL を返す |
folder() | ページが置かれているフォルダを返す |
folderPath() | トップフォルダからのパスを返す |
gotoChannelURL(channelName) | ページの他のチャネル上での URL を返す |
indexOfObject() | 親フォルダの中で何番目に位置しているかを返す(フォルダを含む並び順) |
indexOfPage() | 親フォルダの中で何番目に位置しているかを返す(フォルダを除く並び順) |
isFirstObject() | 親フォルダの中で先頭に置かれているか判定する(フォルダを含む並び順) |
isFirstPage() | 親フォルダの中で先頭に置かれているか判定する(フォルダを除く並び順) |
isFolder() | オブジェクトが Folder なのか(= Page でないか)を判定する |
isLastObject() | 親フォルダの中で最後に置かれているか判定する(フォルダを含む並び順) |
isLastPage() | 親フォルダの中で最後に置かれているか判定する(フォルダを除く並び順) |
isPage() | オブジェクトが Page なのかを判定する |
isPageData() | ページがページデータテンプレートから作成されているか判定する |
isPublicPage() | 公開テンプレートから作成されたページかどうか判定する |
nextObject(wrap) | ひとつ後ろに位置するページまたはフォルダを返す |
nextPage(wrap) | ひとつ後ろに位置するページを返す |
pageURL(channelName) | ページの URL を返す |
prevObject(wrap) | ひとつ前に位置するページまたはフォルダを返す |
prevPage(wrap) | ひとつ前に位置するページを返す |
このページの canonical URL を返します。canonical URL とは、このページのコンテンツがプライマリチャネルに配信された場合の URL です。
プレビュー時には、プレビュー用の URL が返されます。配信先の公開サーバ上の URL ではありません。
ページ中に、そのページの各デバイス用の版にアクセスするリンクを作成してみます。この例では、main (プライマリチャネル) tablet mobile の 3 つのチャネルが定義されていることを想定しています。
<body>
....
<br/>
このページは %channelName()% 版です。<br/>
<br/>
<wr-if condition="channelName() != \"mobile\"">
<a href="%thisPage().canonicalURL()%?%channelCookieName()%=mobile">モバイル版はこちら</a><br/>
</wr-if>
<wr-if condition="channelName() != \"tablet\"">
<a href="%thisPage().canonicalURL()%?%channelCookieName()%=tablet">タブレット版はこちら</a><br/>
</wr-if>
<wr-if condition="channelName() != \"main\"">
<a href="%thisPage().canonicalURL()%?%channelCookieName()%=main">PC版はこちら</a><br/>
</wr-if>
<a href="%thisPage().canonicalURL()%?%channelCookieName()%=.">お使いのデバイスに最適なページはこちら</a><br/>
<br/>
....
</body>
他のチャネルに誘導するための URL には、そのページの、プライマリチャネルでの URL (canonicalURL) の末尾に
?channel=<channelName>
という形式の query string を付加したものを使います。(チャネル選択機能のマニュアルを参照してください)この時、channel= の部分の query string のパラメタ名の部分は「FTP管理」画面の「ルール」タブで「Cookie 名」欄に指定した名前でなければなりません。その名前を取り出すために channelCookieName() 関数を使っています。
プライマリチャネル上での URL は Page オブジェクトの canonicalURL() メソッドで知ることができます。
サーバサイドの mod_rewrite によるデバイスの判別を実行して最適なチャネルに誘導する場合には、チャネル名に "." (ピリオド)を指定します。(チャネル選択機能のマニュアルを参照してください)
この例はあくまでもサンプルです。上記機能の実現には gotoChannelURL() メソッドの方が便利です。URL の組み立てを自動で行ってくれます。
プライマリではないチャネルのコンテンツを生成する場合に、head 節内に link rel="canonical" を宣言し、検索エンジン等に対して、インデクシングすべきオリジナルのページの URL を供給してみます。
<head>
........
<wr-if condition="channel().isPrimary() != true">
<link rel="canonical" href="%thisPage().canonicalURL()%"/>
</wr-if>
........
</head>
ツイートボタンなどを設置する場合には、ツイートする URL には canonicalURL() メソッドの戻り値を指定すると良いでしょう。ユーザがツイートする URL は、そのユーザが使用していたデバイスに依存した URL よりも、デバイス判定ルールが動作するプライマリチャネル側の URL、つまり、canonicalURL() メソッドの返す URL の方がよいでしょう。canonicalURL() でつぶやいてもらえれば、そのつぶやきを読んでリンクを辿ったユーザには、そのユーザの使用しているブラウザに適したコンテンツが配信されます。
もし canonicalURL() を使わずに pageURL() メソッドを使ったり、ボタンが設置されているページの URL を使った場合、つぶやかれる URL はつぶやいたユーザが使用していたデバイスに依存した URL となるため、そのつぶやきを読んでリンクを辿ったユーザには、つぶやいたユーザが使用していたデバイスに最適化されたコンテンツが配信されてしまいます。
link rel="canonical" 宣言を入れておくと、つぶやきボタンが、その URL を使用してつぶやいてくれる場合もあるようです。個々のスニペットにより動作が違うので、実際にどの URL でつぶやかれることになるのかを調べて使うとよいでしょう。
Page オブジェクトが置かれているフォルダを返します。返される値は Folder オブジェクトです。
link という名前の Link 要素が定義されているとします。link に指定されているリンク先ページが置かれているフォルダの名前を表示してみます。
<body>
....
リンク先のページが置かれているフォルダは「%link.folder().folderName()%」です。<br/>
....
</body>
index とう名称の目次要素が定義されているとします。その目次にリストされている各ページについて、そのページが置かれているフォルダの名前とページのタイトルを表示してみます。
<body>
........
<wr-for list="sort(index, \"A\", \"folder().folderName()\")" variable="aPage">
%aPage.folder().folderName()% : %pageTitle(aPage)%<br/>
</wr-for>
........
</body>
目次 index を、その目次に含まれているページのフォルダ名で昇順にソートしてから表示しています。 sort() 関数の、ソートキーの部分には、ソート対象の属性がしていできるだけでなく、このように、ソート対象に対するメソッドの呼び出しも行えます。
Page オブジェクトが置かれているフォルダの、トップフォルダからのパスを返します。返される値は Folder オブジェクトの列(リスト)です。
ページが置かれているフォルダまでのパスをパン屑リスト風に表示します。
<body>
........
<wr-for list="thisPage().folderPath()" variable="aFolder">
<wr-if condition="aFolder.isNotRootFolder()">→ </wr-if>
%aFolder.folderName()%
</wr-for>
<br />
........
</body>
thisPage() 関数で自分の Page オブジェクトを取得します。そのオブジェクトの folderPath() メソッドを呼び出して最上位のフォルダからのフォルダのパスを取得し、それに基づいて表示を作成しています。
このページの他のチャネル上での URL を返します。チャネルはパラメタで指定します。
プレビュー時には、プレビュー用の URL が返されます。配信先の公開サーバ上の URL ではありません。
このメソッドは、このページの他のチャネル上での URL を返すのですが、どのチャネルの URL を取得したいかをこのパラメタで指定します。指定はチャネル名で行います。
このパラメタは省略可能です。省略すると、アクセスしているデバイスに最適なチャネルへの誘導が行われる(デバイス判定ルールが動作する) URL が返されます。
ページ中に、そのページの各デバイス用の版にアクセスするリンクを作成してみます。この例では、main (プライマリチャネル) tablet mobile の 3 つのチャネルが定義されていることを想定しています。
<body>
....
<br/>
このページは %channelName()% 版です。<br/>
<br/>
<wr-if condition="channelName() != \"mobile\"">
<a href="%thisPage().gotoChannelURL("mobile")%">モバイル版はこちら</a><br/>
</wr-if>
<wr-if condition="channelName() != \"tablet\"">
<a href="%thisPage().gotoChannelURL("tablet")%">タブレット版はこちら</a><br/>
</wr-if>
<wr-if condition="channelName() != \"main\"">
<a href="%thisPage().gotoChannelURL("main")%">PC版はこちら</a><br/>
</wr-if>
<a href="%thisPage().gotoChannelURL()%">お使いのデバイスに最適なページはこちら</a><br/>
<br/>
....
</body>
他のチャネルに誘導するための URL には、そのページの、プライマリチャネルでの URL (canonicalURL) の末尾に
?channel=<channelName>
という形式の query string を付加したものを使います。(チャネル選択機能のマニュアルを参照してください)この時、channel= の部分の query string のパラメタ名の部分は「FTP管理」画面の「ルール」タブで「Cookie 名」欄に指定した名前を指定する必要があります。
このメソッドは、これらの条件を満たす URL を生成します。
<a href="%thisPage().canonicalURL()%?%channelCookieName()%=tablet">...</a>
と
<a href="%thisPage().gotoChannelURL("tablet")%">...</a>
は等価です。
canonicalURL() メソッドの説明も併読してください。
Page オブジェクトのフォルダ中での位置を返します。ページとフォルダの並び順は、ページ一覧画面での並び順と同じです。このメソッドが返す値は、フォルダ中での、ページとフォルダが混在した状態での位置です。ページだけに着目して位置を取得したい場合には indexOfPage() メソッドを使用してください。
戻り値はゼロオリジンです。ページが先頭にあるときには 0 が返されます。
ページが何番めに位置しているかを表示してみます。
<body>
........
このページは先頭から %thisPage().indexOfObject() + 1% 番めに位置しています。<br/>
........
</body>
Page オブジェクトのフォルダ中での位置を返します。ページの並び順は、ページ一覧画面での並び順と同じです。このメソッドが返す値は、フォルダ中での、ページの位置です。フォルダを除いたページの位置が返されます。
戻り値はゼロオリジンです。ページが先頭にあるときには 0 が返されます。
このページが、ページが置かれているフォルダ中で、何番めに位置しているかを表示してみます。
<body>
........
このページは先頭から %thisPage().indexOfPage() + 1% 番めに位置しています。<br/>
........
</body>
このページが置かれているフォルダ中での、このページの位置が先頭である場合に true を返します。
このページが、ページが置かれているフォルダ中で、先頭にあるかどうかを調べて表示してみます。
<body>
........
<wr-if condition="thisPage().isFirstObject()">このページが先頭です</wr-if>
........
</body>
このページが置かれているフォルダにあるページの中での、このページの位置が先頭である場合に true を返します。
このページが、ページが置かれているフォルダにあるページの中で、先頭にあるかどうかを調べて表示してみます。
<body>
........
<wr-if condition="thisPage().isFirstPage()">このページが先頭です</wr-if>
........
</body>
false を返します。このメソッドは allObjects() メソッドなどで入手したリストに含まれるオブジェクトが Folder なのか Page なのかを判別する時に使用します。 Folder オブジェクトにも同様のメソッドがあります。
isPage() メソッドの利用例を参照してください。
このページが置かれているフォルダ中での、このページの位置が末尾である場合に true を返します。
このページが置かれているフォルダ中での、このページの位置が末尾であるかどうかを調べて表示してみます。
<body>
........
<wr-if condition="thisPage().isLastObject()">このページが末尾です</wr-if>
........
</body>
このページが置かれているフォルダにあるページの中での、このページの位置が末尾である場合に true を返します。
このページが、ページが置かれているフォルダにあるページの中で、末尾にあるかどうかを調べて表示してみます。
<body>
........
<wr-if condition="thisPage().isLastPage()">このページが末尾です</wr-if>
........
</body>
true を返します。このメソッドは allObjects() メソッドなどで入手したリストに含まれるオブジェクトが Folder なのか Page なのかを判別する時に使用します。 Folder オブジェクトにも同様のメソッドがあります。
ページが置かれているフォルダにあるページとフォルダの一覧を表示してみます。
<wr-for list="folder().allObjects()" variable="x">
<wr-if condition="x.isPage()">
%pageTitle(x)%<br />
</wr-if>
<wr-if condition="x.isFolder()">
%x.folderName()%<br />
</wr-if>
</wr-for>
allObject() メソッドを使ってフォルダに置かれているページとフォルダのリストを入手します。そのリスト中の要素について、isPage() メソッドと isFolder() メソッドを使って、ページなのかフォルダなのかを調べます。ページであれば pageTitle() 関数を使ってページのタイトルを表示します。フォルダであれば folderName() メソッドを使ってフォルダの名称を表示します。
このページがページデータテンプレートから作成されている場合に true を返します。
searchText() 関数を使って全ページを検索します。検索結果として得られた Page オブジェクトのリストから、検索結果一覧を表示してみます。
検索の結果得られたページの中には、ページデータテンプレートで作成されたページも含まれている可能性があります。ページデータテンプレートで作成されたページは URL を持たないためリンクを生成することはできません。そこで、ページデータテンプレートで作成されたページについては、そのページのタイトルを、また、それ以外のテンプレートで作成されたページについては、ページタイトルとそのページへのリンクを表示してみます。
searchText() 関数への検索パターンは regexp という名前の1行テキスト要素に入力されているものとします。
<body>
........
<wr-for list="searchText(regexp)" variable="aPage">
<wr-if condition="aPage.isPageData() != true">
<wr-then>
<a href="%aPage%">%pageTitle(aPage)%</a><br/>
</wr-then>
<wr-else>
%pageTitle(aPage)%<br/>
</wr-else>
</wr-if>
</wr-for>
........
</body>
このようなテンプレートを用意しておけば特定のパターンを含むページを簡単に探すことができ、実用的です。
このページが公開テンプレートまたはページデータテンプレートから作成されている場合に true を返します。
自分が公開テンプレートから作成されたページかどうかを調べて表示してみます。
<body>
........
<wr-if condition="thisPage().isPublicPage()">ページは公開テンプレートで作成されています</wr-if>
........
</body>
このページが置かれているフォルダ中での、このページの次の位置にあるページまたはフォルダを返します。
フォルダやページの順序は、ページ一覧画面でのページとフォルダの表示順序と同じです。その順序に従って、ひとつ後(下)のページまたはフォルダが返されます。
返される値は Folder オブジェクトまたは Page オブジェクトです。返された値の型を調べるには isFolder() メソッドと isPage() メソッドを使ってください。
ラップするかどうかを指定します。末尾のページに対して wrap に true を指定して nextObject(ture) という呼び出しを行った場合、先頭のオブジェクトが返されます。末尾のページに対して nextObject() または nextObject(false) という呼び出しを行った場合には null が返されます。
このパラメタは省略可能です。省略した場合には false が指定されたものとして動作します。
次のページまたは、次のフォルダの下にある index.html というファイル名を持つページへのリンクを生成してみます。
<body>
........
<wr-variable name="next" value="thisPage().nextObject()" />
<wr-if condition="isNotNull(next)">
<wr-if condition="next.isPage()">
<a href="%next%">%pageTitle(next)%</a><br />
</wr-if>
<wr-if condition="next.isFolder()">
<wr-variable name="index" value="next.pageWithFileName(\"index.html\")" />
<wr-if condition="isNotNull(index)">
<a href="%index%">%pageTitle(index)%</a><br />
</wr-if>
</wr-if>
</wr-if>
........
</body>
このページが置かれているフォルダ中での、このページの次の位置にあるページを返します。返される値は Page オブジェクトです。
ラップするかどうかを指定します。末尾のページに対して wrap に true を指定して nextPage(ture) という呼び出しを行った場合、先頭のページが返されます。末尾のページに対して nextPage() または nextPage(false) という呼び出しを行った場合には null が返されます。
このパラメタは省略可能です。省略した場合には false が指定されたものとして動作します。
次のページへのリンクを生成してみます。
<body>
........
<wr-variable name="next" value="thisPage().nextPage(true)" />
<wr-if condition="isNotNull(next)">
<a href="%next%">%pageTitle(next)%</a><br />
</wr-if>
........
</body>
nextPage() にパラメタ true を渡しているので末尾のページには先頭のページへのリンクが作成されます。
pageURL() メソッドは、このページの URL を返します。返される URL は http から始まる URL です。 プレビュー時には、プレビュー用の URL が返されます。配信先の公開サーバ上の URL ではありません。
ある特定のチャネルにおける URL を調べたい場合には、そのチャネルのチャネル名を指定することができます。
このパラメタは省略可能です。パラメタを指定せずにこのメソッドを呼び出した場合、展開処理が行われている対象のチャネルが指定されたものとして動作します。
プレビューの場合にこのパラメタが省略されていると、チャネルセレクタ(チャネルを指定するポップアップメニュー)で選ばれているチャネルが指定されているものとして動作します。チャネルセレクタの指定が「自動判別」になっている場合には、プレビューに使用されたデバイスをデバイス判定ルールに照らし合わせてそのデバイス向けのコンテンツを配信するチャネルを判別し、そのチャネルが指定されたものとして動作します。
公開コンテンツを生成するために FTP を実行中にこのパラメタが省略されていると、その展開処理の対象となるチャネルが指定されているものとして動作します。
このメソッドの利用方法は限定的です。あまり利用するシーンは見当たらないでしょう。多くの場合 canonicalURL() メソッドが適当であり、このメソッドの出番はあまりなさそうです。
他のチャネルのページへのリンクを作成するときには、このメソッドを使って URL を取得するのではなく、canonicalURL() メソッドと、ターゲットとなるチャネルの名称を query string に追加して合成する URL を使ってください。詳しくは canonicalURL() のマニュアル、チャネル選択機能のマニュアルを併読してください。
それでも、あるページの URL が必要な場合には、このメソッドを使ってください。
tweet やブックマーク用の URL の生成には、このメソッドは使わない方が良いでしょう。このメソッドの戻り値は、特定のチャネル(デバイス)に依存した URL です。ブックマークや tweet などに使う URL は canonicalURL() の方が良さそうです。
このページが置かれているフォルダ中での、このページの前の位置にあるページまたはフォルダを返します。
フォルダやページの順序は、ページ一覧画面でのページとフォルダの表示順序と同じです。その順序に従って、ひとつ前(上)のページまたはフォルダが返されます。
返される値は Folder オブジェクトまたは Page オブジェクトです。返された値の型を調べるには isFolder() メソッドと isPage() メソッドを使ってください。
ラップするかどうかを指定します。先頭のページに対して wrap に true を指定して prevObject(ture) という呼び出しを行った場合、末尾のオブジェクトが返されます。先頭のページに対して prevObject() または prevObject(false) という呼び出しを行った場合には null が返されます。
このパラメタは省略可能です。省略した場合には false が指定されたものとして動作します。
前のページまたは、前のフォルダの下にある index.html というファイル名を持つページへのリンクを生成してみます。
<body>
........
<wr-variable name="prev" value="thisPage().prevObject()" />
<wr-if condition="isNotNull(prev)">
<wr-if condition="prev.isPage()">
<a href="%prev%">%pageTitle(prev)%</a><br />
</wr-if>
<wr-if condition="prev.isFolder()">
<wr-variable name="index" value="prev.pageWithFileName(\"index.html\")" />
<wr-if condition="isNotNull(index)">
<a href="%index%">%pageTitle(index)%</a><br />
</wr-if>
</wr-if>
</wr-if>
........
</body>
このページが置かれているフォルダ中での、このページの前のページを返します。返される値は Page オブジェクトです。
ラップするかどうかを指定します。先頭のページに対して wrap に true を指定して prevPage(ture) という呼び出しを行った場合、末尾のページが返されます。先頭のページに対して prevPage() または prevPage(false) という呼び出しを行った場合には null が返されます。
このパラメタは省略可能です。省略した場合には false が指定されたものとして動作します。
前のページへのリンクを作成してみます。
<body>
........
<wr-variable name="prev" value="thisPage().prevPage(true)" />
<wr-if condition="isNotNull(prev)">
<a href="%prev%">%pageTitle(prev)%</a><br />
</wr-if>
........
</body>
prevPage() にパラメタ true を渡しているので先頭のページには末尾のページへのリンクが作成されます。