チャネルの処理順序は不定です。かならずしも main mobile tablet の順に処理されるわけではありません。
8章 マルチデバイス配信
プライマリチャネル以外のチャネルを作成し、多チャンネル化したら、次は、チャネル別のコンテンツ生成が行えるようにテンプレートを修正します。
WebRelease では、コンテンツ生成はテンプレートの展開とメソッドの中で行われるわけですが、その中に、配信先のチャネルに対応して異なるコンテンツ生成を行うロジックを組み込みます。このために channelName() 関数が重要な役割を果たします。
WebRelease はあるページについて、コンテンツ (多くの場合 html) を生成するときに、チャネルの数だけ展開処理を繰り返します。例えば、main mobile tablet の3つのチャネルが定義されているサイトの場合、トップページの index.html の生成は3回行われます。
展開処理中で channelName() 関数を呼び出すと、その展開処理がどのチャネル向けの展開処理なのかを示すチャネル名が返されます。このチャネル名を wr-if などでチェックしながら、チャネル用のコンテンツを生成します。
例えば main mobile tablet という3つのチャネルが定義されている場合の、 WebRelease のコンテンツ生成の処理は下記のように行われます。
チャネルの処理順序は不定です。かならずしも main mobile tablet の順に処理されるわけではありません。
channelName() 関数以外に channel() 関数を呼び出すと、処理の対象となっているチャネルを表す Channel オブジェクトが入手できます。Channel オブジェクトから取得できる情報を使って展開処理を分岐することも可能です。
サイトリソース、テンプレートリソースについては、全チャネルに同一のセットが配信されます。これらをチャネルごとに変更することはできません。
また、ページ中に入力された画像や添付ファイルについても、同一のものが各チャネルに配信されます。
チャネル別に内容をコントロールできるのは、あくまでも、テンプレートの展開とメソッド、コンポーネントのメソッドに記述される部分に限られるという点がポイントです。
多くの場合、各デバイス向けのコンテンツは「まったく異なる」コーディングになります。つまり、mobile 向けの html5 系の html と、PC 向けの html4 系の html は、最も外側の doctype や html 宣言からして別物であり、また、html のツリー構造はほぼ同等であっても、細部がことごとく異なる(属性指定があちこちで異なる)ものとなる場合が多いようです。
いろいろな考え方があるとは思いますが、テンプレートの展開レベルで、デバイスの判断を行い、それぞれのデバイス向けの展開の生成は、それぞれのデバイス向けの展開を行う専用メソッドに処理を委譲するのが良いのかもしれません。
main mobile tablet という 3 つのチャネルが定義されているサイトの、あるテンプレートの展開を、例えば、下記の様に書いておきます。
<wr-if condition="channelName() == \"tablet\"">%generateTablet()</wr-if>
<wr-if condition="channelName() == \"mobile\"">%generateMobile()</wr-if>
<wr-if condition="channelName() == \"main\"">%generateMain()</wr-if>
このテンプレートに generateTablet() generateMobile() generateMain() という3つのメソッドを定義し、その中で、それぞれのチャネル用の展開を生成するようにしておくことで、トップレベルでチャネル別のコンテンツ生成をコントロールすることができるでしょう。
デバイス向けのコンテンツを生成する方法として、Responsive Design という手法が使われることがあります。
Responsive Design は、大雑把に言うならば、全デバイスに同一のコンテンツを配信しておいて、デバイス側のスタイルシートの機能(Media Queries など)や JavaScript を使って、デバイス側でそのデバイスに合ったコンテンツを表示するというものです。
デバイス間の違いが少ない(同じレベルの CSS や JavaScript が使える、HTML5 環境)場合には有効な方式であると言えますが、一方で、下記のような点が問題になる場合もあります。
WebRelease では、ある特定のチャネルについてのみ Responsive を採用することができます。例えば、タブレットとスマートフォン向けには同じチャネルから同じコンテンツを配信し、端末側で Responsive で表示内容を調整することにし、その他のデバイス、例えば PC 向けには、他のチャネルから PC 専用のコンテンツを配信することができます。