この記事の概要
リスト表示系プラグインです。
冗談みたいな名前ですが、サブプラグインで機能を拡張できるようになっています。
blog(bloglist相当), category(categorylist相当), monthly(archivelist相当), recentitem(最新アイテムリスト), writeback(コメント・TBリスト) のサブプラグインを同梱。
スキン変数のパラメータで設定を全て制御できます。
Download: NP_List_v0.2.zip 新しいバージョンがあります
Nucleus v3.31SP1 UTF-8、PHP4/5で確認。
このプラグインの特徴
NP_ContentsList等のメニュー系プラグインとリスト出力プラグインを混ぜ合わせたようなものです。
- サブプラグインでリストタイプを追加できます。
- 各リストを統一的なパラメータ指定で制御できます。並び順、条件フィルター等。
- すべての指定をスキン・テンプレート上に記述します。スキン・テンプレートの書き出し&読み込みのみで全ての設定を保存・復元できます。
- ブログリストからカテゴリーリストを[呼び出せます]1。blog - categoryによる2層メニューが作れます。
インストール
ZIPを展開すると出てくる NP_List.php と listディレクトリ をNucleusのプラグインディレクトリへアップロードします。その後、管理画面のプラグインリストからインストールしてください。
スキンへの記述
このプラグインの設定は、すべてスキン・テンプレートに記述するように作ってあります。プラグインの管理画面はありません。一見めんどくさそうですが、その代わりにパラメータの記述がわかりやすくなるよう配慮してあります。
シンプルな指定例
<%List(type:blog, tpl:templatename)%><!-- ブログリスト -->
<%List(type:category, tpl:templatename)%><!-- カテゴリーリスト -->
<%List(type:monthly)%><!-- 月別アーカイブリスト -->
<%List(type:recentitem)%><!-- 最新アイテムリスト -->
<%List(type:writeback)%><!-- コメント・トラックバックリスト -->
デフォルトでは「定義リスト」形式によるリスト出力を想定してます。なので、実際には以下のように前後に記述します。
※出力形式は変更できます(後述)
<dl>
<dt>リストのタイトル</dt>
<%List(type:blog, tpl:templatename)%><!-- <dd>が出力される -->
</dl>
高度な指定例
いろいろなパラメータを指定できます。リストの並び順、条件フィルター、オプションフラグ等。パラメータの順番は自由です。
<%List(type:blog, tpl:templatename, order:blogdesc ASC, corder:catdesc ASC, flag:stripe)%>
<%List(type:category, tpl:templatename, filter:arcdate=@, order:catdesc ASC, flag:stripe hidenoamount)%>
<%List(type:monthly, filter:blogid=@ catid=@, flag:stripe)%>
<%List(type:recentitem, filter:catid=1|2|3, flag:stripe)%>
<%List(type:writeback, filter:blogid!=4|5)%>
具体的な指定例もあります。スクリーンショットあり。
スキン変数の主要パラメータの説明
- type - リストタイプを指定。
- blog - ブログリスト
- category - カテゴリーリスト
- monthly - 月別アーカイブリスト
- recentitem - 最新アイテムリスト
- writeback - コメント・トラバリスト
- (さらに拡張可能)
- tpl - テンプレートを使うリストタイプの場合、テンプレート名を指定。
- order - ソート順を指定。指定方法は "対象カラム名 (ASC|DESC)"。
- filter - フィルターを指定。半角スペースをはさんで複数指定可。
- blogid - ブログID
- catid - カテゴリーID
- arcdate - アーカイブ日付(yyyy-mm)
- (さらに拡張可能)
各項目には、 "=", "!=", ">", "<"などの記号をはさんで右側に、単数値("1"など)または複数値("1|2|3"など)を指定します。数値には現在の値("@")を指定することもできます。
その他のパラメータの説明
- tplprefix - NP_Containerによるカスタムテンプレートを使うリストタイプで、複数のカスタムパーツセットを使い分けるときにプレフィックスを指定。
- amount - 出力数を指定。デフォルトは"5"。
- len - リスト項目の文字数を指定。recentitem, writeback で使用。デフォルトは"25"。
- trimmarker - lenで指定した文字数を超えた場合の省略マーカーを指定。デフォルトは".."。
- yorder, morder - monthlyタイプの年月のソート順を個別に指定。指定方法は "ASC"または"DESC"。
- flag - オプションフラグを指定。半角スペースをはさんで複数指定可。
- stripe -
<%class%>(後述)に1つ置きに"stripe"を出力。これを利用してスタイルシートでリスト行を色分けできます。 - hidenoamount - amountが0の項目を出力しない(categoryタイプ)。
- nolimit - amount指定を無視して全項目を出力する(monthlyタイプ)。
- shownolink - リンクが無いリストも出力する(monthlyタイプ)。
- (さらに拡張可能)
- stripe -
テンプレートへの記述
blog, category タイプは、テンプレートを指定してリストを整形します。テンプレートには、通常のテンプレート変数のほかに拡張変数として <%amount%>、<%class%>、<%catlist%>が使えます。
まずは出発点のスキン記述を先に出します。
スキンの記述例
ブログリスト(入れ子でカテゴリーリストを呼び出す)の例と、通常のカテゴリーリストの例です。
<dl class="menu">
<dt>メニューリスト(ブログ-カテゴリーの2層リスト)</dt>
<%List(type:blog, tpl:templatename)%>
</dl>
<dl class="menu">
<dt>メニューリスト(カテゴリー)</dt>
<%List(type:category, tpl:templatename)%>
</dl>
テンプレートパーツ「ブログ一覧の本体」の例
上記スキンに対応した、ブログリスト(2層タイプ)のテンプレートパーツの記述例です。
<dd>
<dl>
<dt<%class%>><a href="<%bloglink%>" title="<%blogdesc%>"><%blogname%></a></dt>
<%catlist%>
</dl>
</dd>
テンプレートパーツ「カテゴリー一覧の本体」の例
カテゴリーリストの記述例です。<%amount%>でリスト毎にアイテム数を表示するようにしています。
<dd<%class%>>
<a href="<%catlink%>" title="<%catdesc%> <%archivedate%>"><%catname%></a> [<%amount%>]
</dd>
拡張テンプレート変数の説明
<%amount%>- 項目内のアイテム数<%class%>- スタイル装飾用のクラス出力(項目が特定条件に合致した場合に"current"クラスが指定される等)。たとえばカテゴリーAを選択しているときにカテゴリーリストの該当項目を目立たせるなどが可能になります。<%catlist%>- カテゴリーリストの呼び出し(blogタイプ内のみ)
ブログリストからカテゴリーリストを呼び出す
上で書かれた例の繰り返しになりますが、blogタイプの「ブログ一覧の本体」テンプレートに<%catlist%>が記述されていると、入れ子でcategoryタイプが呼び出されます。
※ blogタイプからcategoryタイプを呼び出すときに、カテゴリー側の order, filter パラメータを設定したい場合は、それぞれ"corder", "cfilter"と指定してください。
<%List(type:blog, tpl:templatename, order:blogdesc ASC, corder:catdesc ASC, filter:blogid!=1, cfilter:catid!=10)%>
NP_Containerによるカスタムテンプレート
monthly, recentitem, writeback は各々デフォルトの出力テンプレートを内部に持っているので、通常のテンプレートでの整形はできません。listディレクトリ内に収められている各サブプラグインファイルを[直接書き換える]2か、NP_Containerを使ってスキンにテンプレートパーツを書き込んだものを指定します。
monthlyタイプ+カスタムテンプレート指定の例
<h2>月別表示</h2>
<ul class="calendar2">
<%Container(begin,List)%>
<!--PART name="MONTHLY_MLABEL" NP_Calendar2スタイル -->
01|02|03|04|05|06|07|08|09|10|11|12
<!--/PART-->
<!--PART name="MONTHLY_HEADER"--><li><span class="year"><%year%></span><!--/PART-->
<!--PART name="MONTHLY_BODY1" リンクありの場合 --><span class="sep">|</span><a href="<%archivelink%>" title="<%amount%> item(s)"><%month%></a><!--/PART-->
<!--PART name="MONTHLY_BODY2" リンクなしの場合 --><span class="sep">|</span><span title="No items"><%month%></span><!--/PART-->
<!--PART name="MONTHLY_FOOTER"--></li><!--/PART-->
<%Container(end)%>
<%List(type:monthly, morder:ASC, filter:blogid=@ catid=@, flag:shownolink nolimit)%>
</ul>
その他いろいろ
blog/categoryタイプの並び順や非表示項目の設定
ブログリストやカテゴリーリストを表示するときに、並び順を制御したい場合は、(原始的な方法ですが)管理画面でブログやカテゴリーの「説明」項目の頭に"01:","02:"と数字を振っておくと、"order:blogdesc ASC", "order:catdesc ASC" などの指定で並び順を制御できます。
同様に非表示にしたい項目がある場合は(フィルターで除外指定する以外にも)ブログやカテゴリーの「説明」項目の頭に"[!]"と振ることで非表示にすることもできます。
フィルター指定について
フィルターに"arcdate"を利用することで、月別アーカイブ閲覧時のリスト出力を絞り込むことができます(ただし日別アーカイブには対応していません)。
"blogid", "catid"とあわせて、カレント("@")指定することで閲覧条件に合わせた柔軟なリスト出力ができます。複数値の中にカレント指定を混ぜたいときは、"blogid=3|4|@" のように最後に @ を置きます。
リストタイプによっては使い勝手を考慮して、filter指定が無い場合に blogid が自動的に補完されるものがあります。
blogidが補完されない recentitem, writeback は、デフォルトでは複数ブログをまたいだリストになります。ブログ内の内容に絞りたいときは明示的に "blogid=@" 等、フィルタリングしてください。
フィルターの柔軟性はこのプラグインの利点ですが、DBからのデータ取得コストが上がることにもなりますのでご注意を。重いなと思ったら、フィルター条件をシンプルにするか、キャッシュ系プラグインの導入を検討してください。
プラグインの拡張
以下はプラグインの中身の話です。
プラグインを改造・拡張しやすいように、サブプラグインを別クラスで用意してそれぞれに処理を委譲しています(listディレクトリ内の NP_ListOf~ が各処理を担います)。
Nucleus標準のテンプレートを使うものなら NP_ListOfBlog が、NP_Containerによるカスタムテンプレートを使うものなら NP_ListOfRecentItem が、コードの雛形として使えます。
サブプラグインからは $this->caller で呼び出し元(NP_List)にアクセスできます。
yu: