この記事の概要
ちょくちょく更新。
- フィルターのカレント値補完にmemberidが含まれてなかったので追加。
- recentitemのmemberid指定に対応。writebackと同様、何もないときのパーツ定義を追加。
- monthlyタイプをNucleusのテンプレート「アーカイブ一覧」を利用するバージョンとして作り直したarchiveタイプに差し替えました。
その他は機能的には変わりません。
Download: NP_List v0.32
Nucleus v3.31SP1 UTF-8、PHP4/5で確認。
(もろもろあとで書く)
サブプラグインの作成ポイント(フィルター編)
recentitemタイプ(NP_ListOfRecentItem)でのmemberid対応にみる作成ポイントの解説です。
サブプラグインでやる仕事は、主に
- リスト出力用のテンプレートパーツを用意する
- 必要なデータをSQLを発行して取得する
- データをテンプレートパーツに埋め込んで出力する
の3つです。ここでは2番目に関連するフィルター部分にスポットをあてます。
SQL文を組み立てるときは、まずNucleusのテーブル構成を確認します。phpMyAdminなどで確認するのが手っ取り早いです。
また、NP_Listのフィルターを利用するには、エイリアス名に対応する本当のカラム名を明示する必要があります。これはMySQLではWHERE節でエイリアス名が使用できない制限があるためです。
recentitemタイプではitemテーブルにアクセスします。そこで memberid に対応したカラム名が iauthor であることを確認。
そして、もともと blogid と catid しかマッピングしてないところを、
$aliasmap['search'] = array('blogid', 'catid');
$aliasmap['replace'] = array('iblog', 'icat');
次のように追加します。
$aliasmap['search'] = array('blogid', 'catid', 'memberid');
$aliasmap['replace'] = array('iblog', 'icat', 'iauthor');
NP_List v0.32はmemberidのカレント補完に対応しているので、あとはフィルターメソッドに渡すだけ。
$fstr = $this->_getFilter($p['filter'], $aliasmap); //WHERE節に対応するフィルター指定の文字列が返ってくる
カレント値を明示的に渡す必要がある場合は、フィルターメソッドの第3引数に "エイリアス名"=>カレント値 の形で連想配列を渡します。 この場所であえて第3引数も明示するとしたら、こんな感じになります。
$aliasmap['search'] = array('blogid', 'catid', 'memberid');
$aliasmap['replace'] = array('iblog', 'icat', 'iauthor');
global $blogid, $catid, $memberid;
$current = array( //対応するカレント値を用意する
'blogid' => $blogid,
'catid' => $catid,
'memberid' => $memberid,
);
$fstr = $this->_getFilter($p['filter'], $aliasmap, $current);
フィルターメソッドの中では、エイリアス名を置換し、"@" 記号をカレントの blogid, catid, memberid の値に変換しつつ、フィルター指定を展開してくれます。
また、フィルター指定でたとえば "catid=@" となっていても、catidが実際に存在しないときは無視される(その指定だけ脱落する)作りになっているのでSQLエラーになる心配はありません。