2016年10月01日
Pagerのコンテンツ分割を条件指定に擬似対応させる
PowerCMS 5.21 / PowerCMS 6.00 以降ではカスタムフィールドによる絞り込みを適用したページ分割が標準で可能です。
Pagerは簡単なUIで分割が可能な便利な機能で、以下の仕様で動作します。
- Pager指定したテンプレート内に書かれた一番最初の MTEntries (モジュール読込している内容は除外)を対象に分割処理を行います。
- 2つ目以降のMTEntriesは分割処理の対象にはならず、通常の出力処理が行われます。
- MTEntries の表示数指定には limit を使い分割したい記事数を指定します。last では分割数指定として認識されません。
- 同じく offset 値には 0 を指定します。offsetに0以外の値を指定した場合、正常な分割が行われません。
つまり記事を10件ずつ分割したい場合のMTMLは次のようになります。
<MTEntries limit="10" offset="0">
~
</MTEntries>
この時にページ数は自動的に計算され、ページング部分は MTPager タグで出力されます。
このページ数はコンテクストの記事数を、分割する件数で割ったものとして計算されます。
例えば MTEntries に依る一覧に、カスタムフィールドによる絞り込みを指定した場合にも、ページ数の計算は絞り込みを行わない状態から計算されるため、本来そうあるべきページ数とは差異が発生します。
これは現時点での Pager での仕様となっています。
以下はこの様な絞り込みを行っている時に、擬似的にページング部分を本来出力されるべき内容にするMTMLコードになります。
<MTEntries limit="10" offset="0" field:entryfieldbasename="1"> ~ </MTEntries> <MTEntries lastn="0" field:entryfieldbasename="1"><MTEntriesFooter><MTVar name="__counter__" setvar="total_products"></MTEntriesFooter></MTEntries> <MTVar name="total_products" op="/" value="10" regex_replace="/\.\d+$/","" setvar="max_page"> <MTIf name="total_products" op="mod" value="10"><MTSetVar name="max_page" op="++"></MTIf> <MTPager> <MTIfPagerHeader> <ul> <MTIfPagerPrev> <li class="arrow prev"><a href="<$MTPagerPrevLink escape="html"$>">Prev</a></li> <MTElse> <li class="arrow prev"><span class="inactive">Prev</span></li> </MTIfPagerPrev> </MTIfPagerHeader> <MTIf tag="PagerCounter" ge="1"> <MTIf tag="PagerCounter" le="$max_page"> <li><MTIfPagerCurrent><span><$MTPagerCounter escape="html"$></span><MTElse><a href="<$MTPagerLink escape="html"$>"><$MTPagerCounter escape="html"$></a></MTIfPagerCurrent></li> </MTIf> </MTIf> <MTIfPagerFooter> <MTIf tag="PagerCurrent" ne="$max_page"> <li class="arrow next"><a href="<$MTPagerNextLink escape="html"$>">Next</a></li> <MTElse> <li class="arrow next"><span class="inactive">Next</span></li> </MTIf> </ul> </MTIfPagerFooter> </MTPager>
上記は最初に書いた、Pagerの仕様を逆手に取り、内容の分割用MTEntriesの他に、再度MTEntriesを使いトータルの件数を取得し、その数を元に擬似的にページャーで表示されるページ数に制限をかけるものです。
なお標準の動作ではページ数分のリンクが表示されることになりますが、一般的な分割ページで利用されているようにページャーに表示されるページ数部分が、最大で10ページ分になるような処理は次のように追加できます。Pagerタグの内側を差し替えてください。
<MTPager> <MTIfPagerHeader> <MTPagerCurrent setvar="center_page"> <MTVar name="center_page" op="+" value="4" setvar="last_page"> <MTIf name="last_page" gt="$max_page"><MTSetVar name="last_page" value="$max_page"></MTIf> <MTVar name="last_page" op="-" value="9" setvar="first_page"> <MTIf name="first_page" lt="1"><MTSetVar name="first_page" value="1"></MTif> <MTVar name="first_page" op="+" value="9" setvar="last_page"> <MTIf name="last_page" gt="$max_page"><MTSetVar name="last_page" value="$max_page"></MTIf> <ul> <MTIfPagerPrev> <li class="arrow prev"><a href="<$MTPagerPrevLink escape="html"$>">Prev</a></li> <MTElse> <li class="arrow prev"><span class="inactive">Prev</span></li> </MTIfPagerPrev> </MTIfPagerHeader> <MTIf tag="PagerCounter" ge="$first_page"> <MTIf tag="PagerCounter" le="$last_page"> <li><MTIfPagerCurrent><span><$MTPagerCounter escape="html"$></span><MTElse><a href="<$MTPagerLink escape="html"$>"><$MTPagerCounter escape="html"$></a></MTIfPagerCurrent></li> </MTIf> </MTIf> <MTIfPagerFooter> <MTIf tag="PagerCurrent" ne="$max_page"> <li class="arrow next"><a href="<$MTPagerNextLink escape="html"$>">Next</a></li> <MTElse> <li class="arrow next"><span class="inactive">Next</span></li> </MTIf> </ul> </MTIfPagerFooter> </MTPager>
- カテゴリー
- PowerCMS 4
コメントを投稿する