前回の記事で結論としてはPHPが扱うXMLファイルは単なるデータとして、直接GETするXMLファイルの動的部分はスクリプトで生成すれば良いということになるのだろうか。
と書いたが、その後より深く考えるとスクリプトを含むXMLファイルを直接GETするのは冗長性が多すぎることに気が付いた。
単独ページかスクリプトをBBSやチャットの様な動的部分それ自体を目的とした物なら問題ないが、ナビゲーションやHTMLの基本構造などのサイト内共通部分の生成を効率化するための物ならば、このサイトの構成のようにXMLファイルを完全なデータと見なした方が管理の効率化が期待できる。
まず、XMLの書式は自分で好きなように考える。基本的にはXHTMLの要素を使い、よく使う要素の組み合わせだけ新しい要素として追加すると楽だ。XHTMLの要素はかなり良くできているので流用しない手はない。逆にmeta
要素やaddress
要素などサイト内で使い回しが聞く部分はXMLファイル内には一切書かない。後でXSL変換するときに付ければ良いからだ。出来るだけ簡素な書式にして書くのを楽にすると良い。
さて、例えばナビゲーションを各ページのヘッダ部分に付けるとして
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="foo.xsl"?>
<title>例としてのページ</title>
<?php
require( "/template/navi.php" );
insert_navi( "/file_id/" );
?>
<h1>見出し</h1>
<p>以下文章など</p>
このようなXMLファイルをGETさせ、スクリプトの実行結果をさらにクライアントサイドで変換するとせっかく自分でXMLの書式を作ったにも関わらず冗長部分が多すぎる。この例ではたった2行だが実際に処理を行うと変数の代入などで意外とスクリプト部分が長くなる。もし、ファイルが数十個になった後、仕様の変更でヘッダ挿入部分を書き直さなければならなくなった場合、修正作業は非常に面倒だ。
<?xml version="1.0" encoding="UTF-8"?>
<title>例としてのページ</title>
<h1>見出し</h1>
<p>以下文章など</p>
本来この文章に必要な最低限の情報はこれだけである。しかし、こうしてしまうと実際にGETされた場合、UAにもよるがXMLの木構造が表示されて終わってしまう。ここで役に立つのがApacheのmod_rewriteである。全てのリクエストを1つのスクリプトにリダイレクトし、そのスクリプトがXMLファイルをオープン、動的部分を追加し出力させることで冗長部分の管理を1本化出来る。もし何らかの変更が生じても1つスクリプトを書き直すだけで済むので非常に楽で良い。mod_rewriteを使わなくても単純に「bar.php?file_id」のようにリクエストさせても良いが、この形のURIは検索エンジンには嫌われるので注意が必要だ。XMLファイルはPHPが読み込むことが可能ならどこにおいて置いても構わない。このサイトでは実際にリクエストされるURIに対応したXMLファイルが置いてあるがXML用のフォルダを作ってそこにしまっておくのも手だ。実際に読み込むのはPHPなのでファイルがどこにあっても関係ない。
最終的なXHTMLへの変換はクライアント側で行っても構わないが、どうせPHPを使うならXSLT関数を使えば簡単にサーバサイドで変換できるので旧式ブラウザの事も考えてついでに変換してしまった方がよい。
これまでのHTMLではそれ自体がページであるというイメージが強かったため、1番目の様なタイプのスクリプトの使われ方が多かった、しかしXMLはDOMやXSLTによる情報へのアクセス、変換が容易なため、単純にデータと見なして2番目の例の様に扱った方が効率的である。さすがにSQLといったデータベースに各ページの情報を保存しておくのは大げさすぎるかもしれないが、XMLの場合は単純なファイルなのでこれまでのHTMLと同じ取り扱いが可能だ。
もしBBSやチャットのようなスクリプトそれ自身が主体のコンテンツを作る場合はHTMLを直接出力するのではなく、先ほどと同じ書式のXMLデータを生成しそのデータを1本化したPHPに引き渡せば(スクリプトでは単純にファイルを開くだけでなく、引数としてXMLデータを受け取れるようにもしておく)、動的ページでも静的(一部動的)ページと同じページ構造が簡単に制作できる。class
属性なども同じ物になるのでCSSの制作も楽になる。また、HTMLをスクリプトで出力させようとするとprint
が入り乱れて可読性が低下するが、HTMLの冗長部分を削ったXML生成するだけなら幾分読みやすくなる。
最後に百聞は一見にしかずと言うことで、実際に現在使用しているHimmelの構成ファイルを掲載しておく。公開用に作っていない部分はコメントがかなり適当な上、書式が一定していない部分が有る。各ファイルの役割やmod_rewriteの設定については『XMLベースのウェブサイトを構築する(1)』を参照のこと。XMLの書式は実際にこのサイト内のXMLファイルを調べれば(各ページにindex.xmlを付ければ良い)簡単に理解できると思われる。