DedeCMSのarclistタグでAJAXページネーションを実装しスタイルをカスタマイズする方法

AJAXスクリプトの読み込みと設定

DedeCMSのarclistタグで非同期ページングを実現するには、まずテンプレートの<head>セクションでAJAX通信用のスクリプトを読み込み、ページ切り替え用の関数を定義します。

<script type="text/javascript" src="{dede:global.cfg_cmsurl/}/include/dedeajax2.js"></script>
<script>
function fetchPagedContent(pageNumber, listId) {
    var contentArea = document.getElementById(listId);
    var navArea = document.getElementById("page_" + listId);
    
    var reqContent = new DedeAjax(contentArea, false, false, '', '', '');
    reqContent.SendGet2("/plus/arcmulti.php?mtype=0&pnum=" + pageNumber + "&tagid=" + listId);
    
    var reqNav = new DedeAjax(navArea, false, false, '', '', '');
    reqNav.SendGet2("/plus/arcmulti.php?mtype=1&pnum=" + pageNumber + "&tagid=" + listId);
    
    DedeXHTTP = null;
}
</script>

テンプレートでのタグ設定

次に、コンテンツを表示するarclistタグと、ページネーションを表示するarcpagelistタグを記述します。この2つのタグのtagid属性は必ず一致させる必要があります。ここではmainListという識別子を使用します。

{dede:arclist typeid='14' titlelen='200' row='100' tagid='mainList' pagesize='5'}
    <li>
        <p><a href="[field:arcurl/]" target="_blank">[field:title/]...</a></p>
        <p>[field:pubdate function="MyDate('Y-m-d',@me)"/]</p>
    </li>
{/dede:arclist}

{dede:arcpagelist tagid='mainList'/}

ページネーションロジックのカスタマイズ

デフォルトのページ番号表示のマークアップを変更するには、include/taglib/arcpagelist.lib.php内のページ生成関数を編集します。以下は、前後のページへのリンクやページ番号のリストを生成するカスタム関数の例です。

function generatePaginationMarkup($totalCount, $activePage, $itemsPerPage, $listId='')
{
    if ($totalCount == 0) return "";

    $totalPages = ceil($totalCount / $itemsPerPage);

    // 最初のページ
    $homeLink = ($activePage <= 1) ? "<span>[最初]</span>" : "<a href='javascript:fetchPagedContent(1,\"{$listId}\")' title='1ページへ'><span>[最初]</span></a>";

    // 最後のページ
    $endLink = ($activePage >= $totalPages) ? "<span>[最後]</span>" . $activePage : "<a href='javascript:fetchPagedContent(" . $totalPages . ",\"{$listId}\")' title='{$totalPages}ページへ'><span>[最後]</span></a>";

    // 前のページ
    $prevLink = ($activePage <= 1) ? "<span>[前へ]</span>" : "<a href='javascript:fetchPagedContent(" . ($activePage - 1) . ",\"{$listId}\")' accesskey='p' title='前のページ'><span>[前へ]</span></a>";

    // 次のページ
    $nextLink = ($activePage >= $totalPages) ? "<span>[次へ]</span>" : "<a href='javascript:fetchPagedContent(" . ($activePage + 1) . ",\"{$listId}\")' title='次のページ'><span>[次へ]</span></a>";

    // ページ情報
    $pageInfo = "&nbsp;&nbsp;全&nbsp;{$totalPages}&nbsp;ページ&nbsp;&nbsp;全&nbsp;{$totalCount}&nbsp;件";

    // ページ番号のリスト生成
    $pageLinks = "";
    $pageLinks .= $homeLink;
    $pageLinks .= $prevLink;
    
    $startOffset = max(1, $activePage - 4);
    $endOffset = min($totalPages, $activePage + 8);
    
    for ($i = $startOffset; $i <= $endOffset; $i++) {
        if ($i == $activePage) {
            $pageLinks .= "<a href='javascript:void(0)' class='current-page'><span>{$i}</span></a>";
        } else {
            $pageLinks .= " <a href='javascript:fetchPagedContent({$i},\"{$listId}\")' title='{$i}ページへ'><span>{$i}</span></a> ";
        }
    }
    
    $pageLinks .= $nextLink;
    $pageLinks .= $endLink;
    $pageLinks .= $pageInfo;

    return $pageLinks;
}

CSSによるスタイリング

最後に、テンプレートの<head>内にCSSを追加してページネーションの見た目を整えます。

<style>
* {
    padding: 0;
    margin: 0;
}

.pagination-wrapper {
    font-size: 12px;
    font-family: "メイリオ", sans-serif;
    color: #666666;
    text-align: center;
    padding-left: 20px;
    box-sizing: border-box;
}

.pagination-wrapper span {
    min-width: 30px;
    height: 28px;
    border: 1px solid #dce0e0 !important;
    text-align: center;
    margin: 0 4px;
    cursor: pointer;
    line-height: 28px;
    color: #666666;
    font-size: 13px;
    display: inline-block;
    background-color: #fff;
}

.pagination-wrapper a {
    text-decoration: none;
}

.pagination-wrapper .current-page span {
    background-color: #f0f0f0;
    font-weight: bold;
}
</style>

テンプレート側でCSSクラスを適用してページネーションを呼び出します。

<div class="pagination-wrapper">
    {dede:arcpagelist tagid='mainList'/}
</div>

タグ: DedeCMS AJAX PHP CSS ページネーション

9月8日 15:47 投稿