详情页中的上一页下一页


通常情况以下代码就可以实现详情页的上一页下一页效果,仅限于数量不多的情况,默认是按日期排列。

注意我们如何使用当前页面的发布日期来获取其前后相邻页面。
当然,您可以使用“pages”标签的所有其他可用参数,例如,要显示与当前页面位于同一文件夹中的下一页,请添加“folder”参数。

<ul class="uk-pagination">
   <cms:pages start_on=k_page_date order='asc' limit='1' offset='1'>
   <li><a href="<cms:show k_page_link />"><span class="uk-margin-small-right" uk-pagination-previous></span> <cms:show k_page_title /></a></li>
   </cms:pages>
   <cms:pages stop_before=k_page_date limit='1'>
   <li class="uk-margin-auto-left"><a href="<cms:show k_page_link />"><cms:show k_page_title /> <span class="uk-margin-small-left" uk-pagination-next></span></a></li>
   </cms:pages>
</ul>

我的问题是:有没有简单的方法可以循环显示所有帖子,并且:
— 到达最后一篇帖子时显示第一篇帖子
— 到达第一篇帖子时显示最后一篇帖子
这样,用户在查看第一篇和最后一篇帖子时就不会出现空白了。

-----

当 cms:pages 没有返回任何结果时,就会出现空白。这种情况可以通过在 cms:pages 中放置 <cms:no_results> 标签对来处理。请在 no_results 中放置相应的代码,用于获取最后一条帖子。

<cms:pages stop_before=k_page_date limit='1'>
       <h5><cms:date k_page_date format='d.m.Y' /></h5>
       <h4><cms:show en_titulo /></h4>
    <cms:no_results>
        // HERE WE SHOW MOST LATEST (LAST) POST
    </cms:no_results>
 </cms:pages>

  <cms:pages start_on=k_page_date order='asc' limit='1' offset='1'>
        <h5><cms:date k_page_date format='d.m.Y' /></h5>
        <h4><cms:show en_titulo /></h4>
      <cms:no_results>
        // HERE WE SHOW MOST EARLIEST (FIRST) POST
    </cms:no_results>
 </cms:pages>

如果页面数量较多,循环遍历所有页面来查找下一页和上一页可能会影响性能。为了避免这种情况,我们在此解决方案中使用了 PHP。

<cms:if k_is_page >
    <cms:php>
        global $CTX;
        $page_ids = explode( ",", "<cms:pages folder=k_page_foldername include_subfolders='0' ids_only='1' />" );
        $cur_page_id = "<cms:show k_page_id />";
        $pos = array_search( $cur_page_id, $page_ids );
        if( $pos!==FALSE ){
            if( $pos>0 ){
                // Prev page id
                $prev_page_id = $page_ids[$pos-1];
                $CTX->set( 'prev_page_id', $prev_page_id, 'global' );
            }

            if( $pos<count($page_ids)-1 ){
                // Next page id
                $next_page_id = $page_ids[$pos+1];
                $CTX->set( 'next_page_id', $next_page_id, 'global' );
            }
        }
    </cms:php>

    <cms:if k_current_page >
        <h4>Showing page <cms:show k_current_page /> of <cms:show k_total_pages /> pages <cms:if k_page_foldername>in folder <cms:show k_page_foldername /></cms:if></h4>
    </cms:if>

    <!-- show links to next and prev images -->
    <cms:if prev_page_id >
        <cms:pages id=prev_page_id skip_custom_fields='1'>
            <a href="<cms:show k_page_link />"><cms:show k_page_title /></a>
        </cms:pages>
    </cms:if>

    <cms:if next_page_id >
        <cms:pages id=next_page_id skip_custom_fields='1'>
            &nbsp;<a href="<cms:show k_page_link />"><cms:show k_page_title /></a>
        </cms:pages>
    </cms:if>
</cms:if>

如果我们在列表后台做了自定义排序,即 orderby='weight', 这种情况需要做一些改动:

$page_ids = explode( ",", "<cms:pages orderby='weight' order='asc' ids_only='1' />" );