自分がラクをするための自動化のススメ--WebデザイナのためのPHP入門

たにぐちまこと(H2O Space.)
2008-04-01 17:00:00
PHPとデータベースについて大体わかったボクたち。次は「実務でどう活用するか」ですね。
最新特集【一覧】

ブラウザごとのCSSファイルを記述する

 WebブラウザごとにCSSを振り分ける方法には、JavaScriptを利用する方法やCSSハックを利用する方法など、さまざまある。しかし、環境によって動作しなかったり、特定のブラウザに向けてCSSを作成するのが難しかったりする。そんなときも、PHPを利用すれば便利だ。

 次の記述を見てみよう。

<?php if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false): ?>
<link href="/ie_only.css" rel="stylesheet" type="text/css" media="all" />
<?php endif; ?>

 この記述で、Internet Explorerの場合のみ読み込むCSSファイルを作成することができる。他のWebブラウザの場合には記述すらされないので、ハックなどを使う必要はない。若干プログラムは複雑だが、注目するのは「MSIE」という部分だけでかまわない。

 「$_SERVER」という記述は「サーバー変数」といって、Webサーバーが管理している様々な情報を利用することができる。ここでは、 HTTP_USER_AGENT(エージェント情報)と呼ばれるWebブラウザそれぞれが持っている固有の名前を判断し、CSSファイルを出し分けているのだ。例えば、WindowsのInternet Explorer 6の場合、エージェント情報は次のようになる。

Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)

 使っている環境などによって、若干変わるがIEの場合は必ずその中に「MSIE」という文字が潜んでいるのだ。それを「strpos」という「含まれているかを検査する」ファンクションで比べている。他にも、次のように記述すれば環境に応じてCSSファイルを分けることが可能だ。

Firefoxの場合

<?php if (strpos($_SERVER['HTTP_USER_AGENT'], 'Firefox') !== false): ?>
<link href="/firefox_only.css" rel="stylesheet" type="text/css" media="all" />
<?php endif; ?>

Safariの場合

<?php if (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') !== false): ?>
<link href="/safari_only.css" rel="stylesheet" type="text/css" media="all" />
<?php endif; ?>

IE6の場合

<?php if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.0') !== false): ?>
<link href="/ie6_only.css" rel="stylesheet" type="text/css" media="all" />
<?php endif; ?>

Wii(任天堂ゲーム機)の場合

<?php if (strpos($_SERVER['HTTP_USER_AGENT'], 'Nintendo Wii') !== false): ?>
<link href="/wii_only.css" rel="stylesheet" type="text/css" media="all" />
<?php endif; ?>

 このように、エージェント情報はパソコン用Webブラウザに限らず、ゲーム機、携帯電話などほぼすべてのWebブラウザが固有の情報を持っている。また、バージョン情報や搭載されているOSの種類、バージョンなども取得できるものがあるので、細かく制御することも可能だ。

 端末ごとのページを準備したり、どうしてもWebブラウザ特有の現象などで悩んだときは使ってみてもよいだろう。

 上部のような記述をすると、Dreamweaverでの編集作業中など、PHPが動作しない状況でもCSSを読み込ませて、デザインを再現することができる。ただし、逆にすべてのCSSファイルが無条件で読み込まれてしまうため、デザインが崩れることもあるだろう。そんなときは、次のように記述するとよい。

<?php print('<link href="/safari_only.css" rel="stylesheet" type="text/css" media="all" />'); ?>

 「print」というファンクションは、PHPによってHTMLに記述するファンクションで、PHPが動作しない場合にはCSSファイルが読み込まれることもない。こうして、特定のCSSを読み込ませた状態でデザインをしていけば、調整も楽になるだろう。

 いかがだろうか。PHPは難しいと感じていたかもしれないが、実際には数文字記述するだけで十分実用的なスクリプトを記述することもできる。内容も、簡単な英単語の組み合わせであり、理解できないこともないだろう。

 このような実用的なスクリプトをまずは使いながら、少しずつ自分好みにカスタマイズしていったり、別のスクリプトに応用するなどして、少しずつ慣れ親しんでいけば、いつか自分なりのスクリプトを作ることができるだろう。まずは、使ってみよう。

 次回はPHPを扱うに際して忘れてはいけない、セキュリティについて紹介しよう。

  • コメント(4件)
#1 D298   2008-04-02 10:16:41
includeで重複読み込みエラーが起きたときの解決方法を補足してもらえないでしょうか?
#2 h2ospace   2008-04-04 14:32:56
筆者です。
D298さん、ご質問ありがとうございます。

本文では触れなかったのですが、確かに includeというファンクションは同じファイルを何度も読み込もうとするとエラーが発生してしまいます。これを、防ぐ方法は残念ながらなく、別の手段を用いる必要があります。

簡単なのは、本文の3番目で触れた「変数」を使った例です。変数は、同じファイル内で何度も使うことができます。「ヒヤドキュメント」というテクニックを使えば、非常に長い文章も変数に入れることができますので、比較的簡単ですよ。次の例を参考にしてみてください。
/header.php
<?php
$header = <<<END
ここにヘッダーの内容を記述します。<br />
<strong>HTMLも記述することができます</strong><br />
↓この記述までが、変数に記憶されます。<br />
END;
?>

/index.php など
<?php
print($header);
?>
ここから、本文
#3 いが   2008-04-04 18:23:30
include_onceを使う方法もありますね。デザインだと繰り返しパターンもあるのでこちらを使うことも多いと思います。
http://jp2.php.net/manual/ja/function.include-once.php
#4 D298   2008-04-10 09:43:11
補足いただきありがとうございます。
ヒアドキュメントのincludeは重複して行われても変数に格納される内容が同じであれば定数的に扱えるので出力の指示が適切になされていれば問題が発生しにくい、と理解しました。includeされる内容が変数として扱えるというのは大きなメリットですね。
include_onceは、たとえば、画面要素をパーツで開発しているときにinclude_onceを使って外部定義を取り込むようにすれば、結合時に重複定義のような問題の発生を防ぐとこができる、というイメージでいいのかな?Functionやコードの取り込みはinclude_onceだと安心できそうですね。

ドキュメントデータと制御用コードでincludeの方法を使い分けると幸せになれる、ということですね。