PowerCMS Xのページネーションや検索結果の表示に必要な変数をプラグインでセットする

公開

PowerCMS Xで検索ページを作成した際ページネーションのリンクや「全100件中1件〜20件」のような表示を出すかと思うのですが、全オブジェクト数や現在のページ数、そして1ページのオブジェクト数から計算することが必要となり、長々としたテンプレートになるように感じます。ページネーションのリンクでページ数のリンク(2ページ目の「2」や3ページ目の「3」)がn個並ぶという条件が付くとさらに大変です。

サイトによって変化するものでない、毎回リファクタリングしてよりよいテンプレートになるようなものでもないと思うので、プラグインを作成して表示に必要な変数をセットしています。例えば「全100件中1件〜20件」のような表示の手前にmt:resultcountvarsというファンクションタグを置いて利用します。

/**
 * 表示している件数の表示生成用変数のセット
 *
 * @param array $args
 * @param PAML $ctx
 * @return void
 */
public function hdlr_result_count_variables( $args, $ctx ) {
    $pagination_limit   = (int) $ctx->vars[ 'pagination_limit' ];
    $is_estraier_search = array_key_exists( 'estraier_hit', $ctx->local_vars ) ? true : false;

    if ( $is_estraier_search ) {
        $object_count = (int) $ctx->local_vars[ 'estraier_hit' ];
        $current_page = (int) $ctx->local_vars[ 'estraier_currentpage' ];
    } else {
        $object_count = (int) $ctx->local_vars[ 'object_count' ];
        $current_page = (int) $ctx->local_vars[ 'current_page' ];
    }

    $start = ( $pagination_limit * ( $current_page - 1 ) ) + 1;
    $end   = ( $pagination_limit * ( $current_page - 1 ) ) + $pagination_limit;
    if ( $end > $object_count ) {
        $end = $object_count;
    }

    $ctx->local_vars[ 'object_start_count' ] = $start;
    $ctx->local_vars[ 'object_end_count' ]   = $end;
}

また、ページネーションリンク用のmt:pagervariablesファンクションタグでは以下のような値をセットしています。

  • 総ページ数
  • 表示するオブジェクトの区間(数字リンクの表示やoffset値の設定等に利用)
  • 検索パラメータ(limit, offset, _filter以外のパラメータ)

このコードも「Develop Utilityプラグイン」に格納したいなと考えています。