この記事の概要
今度は生成部ではなく解析部の改良試案。つっても勉強がてら、こんな風にすればもっといいんじゃないか、というのをただ書いてみてるだけですが。
今回の目的は2つ。
- fancyurlsの構成(fancyurls-1:拡張子なしファイルの中身等)をシンプルに
- fancyurls(1、2とも)のパラメータ拡張にコアで対応
(この記事の目玉は後者のパラメータ拡張の処理)
mod_rewrite使える環境なら、fancy化はfancyurl-2の方式を取れば十分シンプルで扱いやすいんだけど、そうでない場合は旧来のfancyurlの無拡張子ファイルを使わないといけない。で、globalfunctions.phpにpathinfoのデコード処理がまとまっているのに、各々の無拡張子ファイル内にもデコード部が分散してるのがちょっといけてない気がしたので、これをまとめてみる。
まずは$virtualpathの代入を改良し、無拡張子ファイル名も取り込んでしまう。
$virtualpath = ((getVar('virtualpath') != null) ?
getVar('virtualpath') :
basename(serverVar('SCRIPT_NAME')).serverVar('PATH_INFO'));
※追記:サーバ環境によってはPATH_INFO内にSCRIPT_NAMEが入って重複してしまうことがあるかも?
そうするとglobalfunctionsのデコード処理部内で片付くので、無拡張子ファイルの中身はこれだけで済む。
/* 注:都合上PHPタグを省いて掲載してます */
$CONF = array();
include('./fancyurls.config.php');
include('./config.php');
selector();
これなら受け付けるパラメータを増やすときも、ファイルのコピペとファイル名の変更で済むので若干扱いやすくなる。
てことでさらに進めて、fancyのパラメータ拡張(新しいキーの追加)を考えてみる。
デコード処理部、switchブロックのdefaultに対応コードを追加。
// decode path_info
if (!$parsed) {
// default implementation
$data = explode("/", $virtualpath );
for ($i = 0; $i < sizeof($data); $i++) {
switch ($data[$i]) {
(略)
default:
//拡張対応
if (is_numeric($data[$i])) break;
$exkey = ucfirst($data[$i]) . 'Key';
if (!isset($CONF[$exkey])) break;
if (isset($GLOBALS[ $CONF[$exkey] ])) $exstore =& $GLOBALS; //代入先の判断
else $exstore =& $_REQUEST;
if (!$exstore[ $CONF[$exkey] ]) { //未定義,0,''なら代入処理
$i++;
if (is_numeric($data[$i])) $data[$i] = (int) $data[$i];
else $data[$i] = preg_replace('/[^a-zA-Z0-9,._-]/', '', $data[$i]);
$exstore[ $CONF[$exkey] ] = $data[$i];
}
fancyurls.config.php の キーカスタマイズの記述($CONF['なんとかKey']の指定)に合わせて、こんなふうにパラメータのキーを追加。
$CONF['ItemKey'] = 'item';
(略)
$CONF['SpecialskinKey'] = 'special';
$CONF['PageKey'] = 'page';//追加
$CONF['StartposKey'] = 'startpos';//追加
※追記:ここは拡張が必要なプラグインのほうでParseURLイベントを拾って$CONF['なんとかKey']を定義してもいいかも
fancyurls-1なら、それに加えて.htaccessへの記述の追加も忘れずに。
#標準キーに加えて、pageとstartposを追加した例
<FilesMatch "^(item|archive|archives|category|blog|special|page|startpos)$">
ForceType application/x-httpd-php
</FilesMatch>
これでURLパース時に、追加したキーに対応した値をコアでグローバル変数なりリクエスト変数なりに代入してくれるようになる。startpos等すでに存在するものがあればグローバル変数を代入対象にしてみた。 追記:グローバル変数に影響を与えるとなると汚染が心配されるけど、先立って$CONFが汚染チェックを受けてるので心配はないかと。
こうしておくと、前回のURL生成の改良と合わせると、プラグイン側ではURL生成はcreateLink()で、拡張パラメータの受け取りはintRequestVar()とかでnormalでもfancyでも処理を統一できて便利。