今回のアプリケーションの仕様の1つに、最新のリンクをハイライトするという機能があります。この機能は最近2週間の間に追加されたリンクに異なるCSS のクラスを付けることで実装します。whenaddedフィールドを現在の日付から引けば、リンクをどうするのかを決定することができます。
MySQLを使用する場合は以下のようなSQL文になります。
IF(whenadded > SUBDATE(CURDATE(),INTERVAL
'14' DAY), 'new',
'old') AS cssclass
cssclassという名前のフィールドに、newもしくはoldの値が格納されます。このフィールドの目的はアンカータグのCSSクラスを決定するためのものです。PHPで毎回whenaddedフィールドをチェックするよりもSQLを使用したほうがずっとスマートです。
しかしSQLiteには日付の引き算を行う関数がありません。さらにいってしまうとSQLiteのサイトでは日付関数について何もドキュメント化されていません。ということはPHPで毎回whenadded フィールドを取得して計算しなければならないということなのでしょうか。
これは、デフォルトのSQLite関数を使用してはできませんが、ユーザ定義関数(UDF)を使用することで実現することができます。まずはPHPで日付の引き算を行う関数を作成します。リスト8に掲載してあるcheck_when_added()関数を見ればわかりますが、それほど難しくありません。
リスト8
//////////////////////////////////////////////////////////
function check_when_added($whenadded){
// 2週間以内かどうかをチェックする
$type = '';
$diff = floor(abs(strtotime('now') -
strtotime($whenadded))/86400);
if($diff < 15){
$type = 'new';
}
return $type;
}
//////////////////////////////////////////////////////////
...
//関数を登録する
$db->createFunction('cssclass','check_when_added',1);
$strsql ="SELECT url, precedingcopy, linktext, ".
"followingcopy, ".
"UPPER(SUBSTR(linktext,1,1)) AS letter, ".
"cssclass(whenadded) AS type, target ".
"FROM tblresources ".
"WHERE reviewed = 1 ".
"ORDER BY letter ";
$result = $db->query($strsql);
...
このリストにはSQLiteからcheck_when_added()関数を利用するためのメソッドである、SQLiteDatabaseクラスのcreateFunction() メソッドも含まれています。SQLiteでこの関数を利用するにはcssclass(whenadded)AS typeとSELECT句の中に記述します。
このようにすると、結果セットはtypeというフィールドでnewもしくは空文字の値が格納されるようになります。この値を使用することで、アンカータグに指定するクラスを決定することができます。最新のリンクはハイライトされるように普通のものとは異なるCSSのクラスを指定すればよいわけです。
|