ページリストブロックのページ送りのカスタマイズ
対象:バージョン 5.7.4 以降
ページ送りの基本
ページリストブロックのビューテンプレート( concrete/blocks/page_list/view.php )では、ページ送りは下記のように記述されています。
<?php if ($showPagination): ?>
<?php echo $pagination;?>
<?php endif; ?>
出力されるHTMLは次のようになります。
<div class="ccm-pagination-wrapper">
<ul class="pagination">
<li class="prev disabled"><span>← 前へ</span></li>
<li class="active"><span>1 <span class="sr-only">(このページ)</span></span></li>
<li><a href="/index.php/blog?ccm_paging_p=2">2</a></li>
<li><a href="/index.php/blog?ccm_paging_p=3">3</a></li>
<li><a href="/index.php/blog?ccm_paging_p=4">4</a></li>
<li><a href="/index.php/blog?ccm_paging_p=5">5</a></li>
<li><a href="/index.php/blog?ccm_paging_p=6">6</a></li>
<li><a href="/index.php/blog?ccm_paging_p=7">7</a></li>
<li class="disabled"><span>…</span></li>
<li><a href="/index.php/blog?ccm_paging_p=10">10</a></li>
<li class="next"><a href="/index.php/blog?ccm_paging_p=2">次へ →</a></li>
</ul>
</div>
オプションの指定
下記のように記述することで、用意されたオプションを指定して、class名や文言を変更することができます。
<?php if ($showPagination): ?>
<?php
$pagination = $list->getPagination();
if ($pagination->getTotalPages() > 1) {
$options = array(
'proximity' => 2,
'prev_message' => '前のページへ',
'next_message' => '次のページへ',
'dots_message' => '...',
'active_suffix' => '現在のページ',
'css_container_class' => 'my-container-class',
'css_prev_class' => 'my-prev-class',
'css_next_class' => 'my-next-class',
'css_disabled_class' => 'my-disabled-class',
'css_dots_class' => 'my-dots-class',
'css_active_class' => 'my-active-class'
);
echo $pagination->renderDefaultView($options);
}
?>
<?php endif; ?>
上記の例で出力されるページ送りのHTMLは次のようになります。
<div class="ccm-pagination-wrapper">
<ul class="my-container-class">
<li class="my-prev-class my-disabled-class"><span>前のページへ</span></li>
<li class="my-active-class"><span>1 現在のページ</span></li>
<li><a href="/index.php/blog?ccm_paging_p=2">2</a></li>
<li><a href="/index.php/blog?ccm_paging_p=3">3</a></li>
<li><a href="/index.php/blog?ccm_paging_p=4">4</a></li>
<li><a href="/index.php/blog?ccm_paging_p=5">5</a></li>
<li class="my-dots-class"><span>...</span></li>
<li><a href="/index.php/blog?ccm_paging_p=10">10</a></li>
<li class="my-next-class"><a href="/index.php/blog?ccm_paging_p=2">次のページへ</a></li>
</ul>
</div>
テンプレートの差し替え
さらに細かいカスタマイズが必要な場合は、コアのページネーションビューマネージャーをリバインドすることで、テンプレートごと差し替えることができます。
まず、application/bootstrap/app.php に下記の記述を追記します。
Core::bind('manager/view/pagination', function($app) {
return new \Application\Src\Search\Pagination\View\Manager($app);
});
コアで使われているページャーマネージャーは concrete/src/Search/Pagination/View/Manager.php ですので、このファイルを参考にクラスを作成します。
上記のコードでリバインドしているページャーマネージャーの作例が、以下のコードです。ファイル位置は application/src/Search/Pagination/View/Manager.php です。
<?php
namespace Application\Src\Search\Pagination\View;
use Concrete\Core\Support\Manager as CoreManager;
use Concrete\Core\Search\Pagination\View\ConcreteBootstrap3View;
class Manager extends CoreManager
{
protected function createApplicationDriver()
{
return new ConcretePagerfantaDefaultView();
}
protected function createDashboardDriver()
{
return new ConcreteBootstrap3View();
}
}
上記のページャーマネージャーで、デフォルトの ConcreteBootstrap3View() の代わりに ConcretePagerfantaDefaultView() クラスをページャーテンプレートとして登録しています。
ConcretePagerfantaDefaultView() クラスのページ位置は、 application/src/Search/Pagination/View/ConcretePagerfantaDefaultView.php で、コードは下記のように作りました。
<?php
namespace Application\Src\Search\Pagination\View;
use \Pagerfanta\View\DefaultView;
use \Concrete\Core\Search\Pagination\View\ViewInterface;
class ConcretePagerfantaDefaultView extends DefaultView implements ViewInterface
{
protected function createDefaultTemplate()
{
return new \Pagerfanta\View\Template\DefaultTemplate();
}
public function getArguments()
{
return array(
'previous_message' => '前へ',
'next_message' => '次へ'
);
}
}
ここでようやく、ページャーテンプレートの実体が出てきました。concrete5.7では、Pagerfanta というライブラリをページ送りの表示に使用していますが、 \Pagerfanta\View\Template\DefaultTemplate() はそのライブラリのデフォルトテンプレートです。
以上のコードが正しく設置できていれば、ページリストブロックのテンプレートに何も変更を加えなくても、ページ送りのテンプレートが下記の様なHTML出力に差し代わります。
<nav>
<span class="disabled">前へ</span>
<span class="current">1</span>
<a href="/index.php/blog?ccm_paging_p=2">2</a>
<a href="/index.php/blog?ccm_paging_p=3">3</a>
<a href="/index.php/blog?ccm_paging_p=4">4</a>
<a href="/index.php/blog?ccm_paging_p=5">5</a>
<span class="dots">...</span>
<a href="/index.php/blog?ccm_paging_p=10">10</a>
<a href="/index.php/blog?ccm_paging_p=2">次へ</a>
</nav>
Pagerfanta ライブラリには様々なオプションがあり、テンプレートを新規に作成することもできます。詳細は Pagerfanta の GitHub ページをご覧ください。
Pagerfanta ライブラリを使用せず直接HTMLを指定する
Pagerfanta ライブラリは便利ですが、柔軟にHTMLを変更できず困る場合もあります。そのような場合は、テンプレートを使用せずにページ送りを表示することもできます。下記は、ページリストブロックのテンプレートで、直接HTMLを出力している例です。
<?php if ($showPagination): ?>
<?php
/** @var \Concrete\Core\Utility\Service\Url $urlHelper */
$urlHelper = Core::make('helper/url');
/** @var \Concrete\Core\Search\Pagination\Pagination $pagination */
$pagination = $list->getPagination();
if ($pagination->getTotalPages() > 1) {
echo '<ul class="pager">';
if ($pagination->hasPreviousPage()) {
echo sprintf(
'<li class="previous"><a href="%s">←</a>',
$urlHelper->setVariable($list->getQueryPaginationPageParameter(), $pagination->getPreviousPage())
);
}
echo sprintf('<li>%d / %d</li>', $pagination->getCurrentPage(), $pagination->getNbPages());
if ($pagination->hasNextPage()) {
echo sprintf(
'<li class="next"><a href="%s">→</a>',
$urlHelper->setVariable($list->getQueryPaginationPageParameter(), $pagination->getNextPage())
);
}
echo '</ul>';
}
?>
<?php endif; ?>