concrete5: ページリストを逆順で表示

concrete5 トリック集

ちょっとトリッキーな方法を紹介します。

concrete5 のページリストの表示順を、逆に表示させるためのカスタマイズ方法です。

このカスタマイズ、実際に concrete5 日本語版の Welcome 画面で表示されている最新情報で使用しています。将来のイベント情報をそのイベント開催の日付順に登録しているのですが、ページリストの最新記事の順で指定すると常に一番遠い将来のイベントが表示されてしまいます。今回は、最新記事5件を絞り込んでから、その中で古い順番に表示させるようカスタマイズしました。

※ このコードは 5.6.3.1 で動作確認をしています。

concrete5 Japan 新着情報

1. ページリストの view.php をコピー&ペースト

まず concrete5 のコアーフォルダ「インストールディレクトリ/concrete/blocks/page_list/view.php」をコピー。

複製先は「blocks/page_list/templates/reverse.php」としてください。

(※ この reverse.php の「reverse」部分は、スペース無しの半角英数字であればお好きな様に変更してください。)

2. 11行目の書き換え

11行目にある

<?php foreach ($pages as $page):

の部分を

<?php
 $rpages = array_reverse ($pages);
 foreach ($rpages as $page):

に書き換えます。

3. ファイルをアップロード

変更したファイルをアップロードします。

4. カスタムテンプレートを適用

通常通りに、concrete5 のサイトにページリストを設置します。

そして、その設置したページリストブロックを再度クリックし、メニューから「カスタムテンプレート」を選択。

カスタムテンプレートの中から、先ほど名前をつけた「Reverse」を選択してください。(別のファイル名を付けた場合はそのファイル名を)

なんと、ページリストの表示順が逆になって表示されます。

5. おまけ:<p><a> だけのページリスト&逆表示

今回特別に、concrete5 日本語版の新着窓のページリストでそのまま使用しているページリストのカスタムテンプレートのコードを公開します。

<?php
defined('C5_EXECUTE') or die("Access Denied.");
$rssUrl = $showRss ? $controller->getRssUrl($b) : '';
$th = Loader::helper('text');
//$ih = Loader::helper('image'); //<--uncomment this line if displaying image attributes (see below)
//Note that $nh (navigation helper) is already loaded for us by the controller (for legacy reasons)
?>

<?php
 $rpages = array_reverse ($pages);
 foreach ($rpages as $page):

// Prepare data for each page being listed...
 $title = $th->entities($page->getCollectionName());
 $url = $nh->getLinkToCollection($page);
 //$target = ($page->getCollectionPointerExternalLink() != '' && $page->openCollectionPointerExternalLinkInNewWindow()) ? '_blank' : $page->getAttribute('nav_target');
 $target = '_blank'; // ここでリンクを常に「_blank」で表示させる設定
 $description = $page->getCollectionDescription();
 $description = $controller->truncateSummaries ? $th->wordSafeShortText($description, $controller->truncateChars) : $description;
 $description = $th->entities($description);
 /* The HTML from here through "endforeach" is repeated for every item in the list... */ ?>

<p><a href="<?php echo $url ?>" target="<?php echo $target ?>"><?php echo $title ?></a></p>
 <?php endforeach; ?>

本来のページリストは <h3>やページの説明文がついていますが、この改造では、<p> で囲まれたシンプルなリストで、target を _blank で指定させています。

ページリストは一番奥が深くカスタマイズしがいのあるブロックです!