PowerCMS™
2025年1月1日購入分よりライセンスの価格を改定いたします。
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[よくあるご質問] システムログに「タスクを実行するために必要なロックを獲得できませんでした」というログが残っている を追加しました。
[よくあるご質問] 特定のシステムログに絞って確認できますか? を追加しました。

PowerCMS ブログ

ホーム > PowerCMS ブログ > PowerCMS 4 > Pagerのコンテンツ分割を条件指定に擬似対応させる

2016年10月01日

Pagerのコンテンツ分割を条件指定に擬似対応させる

PowerCMS 5.21 / PowerCMS 6.00 以降ではカスタムフィールドによる絞り込みを適用したページ分割が標準で可能です。

Pagerは簡単なUIで分割が可能な便利な機能で、以下の仕様で動作します。

  1. Pager指定したテンプレート内に書かれた一番最初の MTEntries (モジュール読込している内容は除外)を対象に分割処理を行います。
  2. 2つ目以降のMTEntriesは分割処理の対象にはならず、通常の出力処理が行われます。
  3. MTEntries の表示数指定には limit を使い分割したい記事数を指定します。last では分割数指定として認識されません。
  4. 同じく 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
投稿者
小野崎@アルファサード

Recent Entries