【问题标题】:Bootstrap pagination with CakePHP pagination helper使用 CakePHP 分页助手的引导分页
【发布时间】:2012-12-30 01:12:16
【问题描述】:

我正在尝试让 CakePHP 的分页助手与引导程序很好地配合使用。也就是说,我希望我的分页元素看起来像引导程序,但由 CakePHP 生成。

目前我的视图页面上有这个:

<?php
echo $this->Paginator->numbers(array(
    'before' => '<div class="pagination"><ul>',
    'separator' => '',
    'currentClass' => 'active',
    'tag' => 'li',
    'after' => '</ul></div>'
));
?>

这会产生以下标记:

<div class="pagination">
    <ul>
        <li class="active">1</li>
        <li><a href="/test/posts/page:2">2</a></li>
        <li><a href="/test/posts/page:3">3</a></li>
    </ul>
</div>

问题是,因为活动页面(在本例中为 1)在 &lt;li&gt; 标记中没有 &lt;a&gt; 元素,所以它无法正确显示在页面上(参见此处:http://i.imgur.com/OczPh.png)。

我似乎在 Cookbook 上找不到任何提及可以解决此问题的任何内容。

这甚至可以解决吗?

【问题讨论】:

    标签: cakephp twitter-bootstrap pagination


    【解决方案1】:

    这么多答案,但没有句柄省略号。您可以在下面找到完整版本,无需自定义 CSS。

    CakePHP v2、Bootstrap v3

    <ul class="pagination">
        <li><?php echo $this->Paginator->prev('Previous', array('escape' => false, 'tag' => 'li'), null, array('escape' => false, 'tag' => 'li', 'class' => 'disabled', 'disabledTag' => 'a')); ?></li>
        <li><?php echo $this->Paginator->numbers(array('separator' => '', 'currentTag' => 'a', 'currentClass' => 'active', 'tag' => 'li', 'first' => 1, 'ellipsis' => '<li class="disabled"><a>...</a></li>')); ?></li>
        <li><?php echo $this->Paginator->next('Next', array('escape' => false, 'tag' => 'li', 'currentClass' => 'disabled'), null, array('escape' => false, 'tag' => 'li', 'class' => 'disabled', 'disabledTag' => 'a')); ?></li>
    </ul>
    

    生成的代码:

    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
    <ul class="pagination">
    	<li class="prev">
    		<a href="/users/page:8" rel="prev">Previous</a>
    	</li>
    	<li>
    		<a href="/users">1</a>
    	</li>
    	<li class="disabled">
    		<a>...</a>
    	</li>
    	<li>
    		<a href="/users/page:5">5</a>
    	</li>
    	<!-- more numbers here... -->
    	<li class="active">
    		<a>9</a>
    	</li>
    	<!-- more numbers here... -->
    	<li class="next">
    		<a href="/users/page:10" currentclass="disabled" rel="next">Next</a>
    	</li>
    </ul>

    【讨论】:

      【解决方案2】:
      <ul class="pagination">
      <?php
        echo $this->Paginator->prev('&laquo;', array('tag' => 'li', 'escape' => false), '<a href="#">&laquo;</a>', array('class' => 'prev disabled', 'tag' => 'li', 'escape' => false));
        echo $this->Paginator->numbers(array('separator' => '', 'tag' => 'li', 'currentLink' => true, 'currentClass' => 'active', 'currentTag' => 'a'));
        echo $this->Paginator->next('&raquo;', array('tag' => 'li', 'escape' => false), '<a href="#">&raquo;</a>', array('class' => 'prev disabled', 'tag' => 'li', 'escape' => false));
      ?>
      </ul>
      

      【讨论】:

      【解决方案3】:

      您需要在活动页面的“li”标签之间添加一个锚标签,试试这个代码:

      <nav>
          <ul class="pagination">
          <?php
          echo $this->Paginator->prev('&laquo;', array('tag' => 'li', 'escape' => false), '<a href="#">&laquo;</a>', array('class' => 'prev disabled', 'tag' => 'li', 'escape' => false));
          $numbers = $this->Paginator->numbers(array('separator' => '', 'tag' => 'li', 'currentLink' => true, 'currentClass' => 'active', 'currentTag' => 'a'));
          $numbers = preg_replace("#\<li class=\"active\"\>([0-9]+)\<\/li\>#", "<li class=\"active\"><a href=''>$1</a></li>",$numbers);
          echo $numbers;
          echo $this->Paginator->next('&raquo;', array('tag' => 'li', 'escape' => false), '<a href="#">&raquo;</a>', array('class' => 'prev disabled', 'tag' => 'li', 'escape' => false));
          ?>
          </ul>
      </nav>
      

      【讨论】:

        【解决方案4】:
        #pagination > li.current {
            z-index: 2;
            color: #ffffff;
            position: relative;
            float: left;
            padding: 6px 12px;
            line-height: 1.428571429;
            text-decoration: none;
            border: 1px solid #dddddd;
            margin-left: 0;
            color: #999999;
            z-index: 2;
            color: #ffffff;
            cursor: default;
            background-color: #428BCA;
            border-color: #428BCA;
        }
        #pagination > li.prev.disabled,#pagination > li.next.disabled {
            position: relative;
            float: left;
            padding: 6px 12px;
            line-height: 1.428571429;
            text-decoration: none;
            border: 1px solid #dddddd;
            margin-left: 0;
            color: #999999;
            cursor: not-allowed;
            background-color: #ffffff;
            border-color: #dddddd;
        }
        .pagination > li > a{
            color: #428BCA;
        }
        

        【讨论】:

        • 欢迎来到stackoverflow。完全由代码组成的答案不如答案有用,包括对代码的一些解释,以及答案代码和 OP 代码之间的差异如何成为功能的关键。请考虑改进您的答案。
        【解决方案5】:

        对于字体真棒和完整分页的 bootstrap 2,您可以使用它:

        并在您的 css 或更少的内容中添加一些 hack

                <div class="pagination">
            <ul>
                <?php
                ## PAGINATION
                echo $this->Paginator->first('<i class="fa fa-angle-double-left"></i>', ['escape' => false, 'tag' => 'li']);
                //
                //
                        echo $this->Paginator->prev('<span><i class="fa fa-angle-left"></i></span>', [
                    'class' => 'prev enabled',
                    'tag' => 'li',
                    'escape' => false,
                ], null, [
                    'class' => 'prev disabled',
                    'tag' => 'li',
                    'escape' => false,
                ]);
                echo $this->Paginator->numbers(
                [
                    'separator' => '',
                    'tag' => 'li',
                    'modulus' => 20,
                    'escape' => false,
                    'currentTag' => 'span',
                    'currentClass' => 'active',
                ]);
                //
                echo $this->Paginator->next('<span><i class="fa fa-angle-right"></i></span>', [
                    'class' => 'next enabled',
                    'tag' => 'li',
                    'escape' => false,
                ], null, [
                    'class' => 'next disabled',
                    'tag' => 'li',
                    'escape' => false,
                ]);
                echo $this->Paginator->last('<i class="fa fa-angle-double-right"></i>', ['escape' => false, 'tag' => 'li']);
                ?>
        
            </ul>
            <div class="pull-right paginationCounter">
                <?php
                echo $this->Paginator->counter(
                [
                    'class' => 'pull-right',
                    'format' => '{:page} / {:pages} pages, {:count} results',
                ]);
                ?>          
            </div>
        </div>
        
           /* Pagination bootstrap 2 add */
        .pagination ul > li.active{
            float: left;
            -moz-border-bottom-colors: none;
            -moz-border-left-colors: none;
            -moz-border-right-colors: none;
            -moz-border-top-colors: none;
            background-color: #fff;
            border-color: #ddd;
            border-image: none;
            border-style: solid;
            border-width: 1px 1px 1px 0;
            line-height: 20px;
            padding: 4px 12px;
            text-decoration: none;
            cursor: default;
        }
        
        .pagination ul > li a[rel='first'], 
        .pagination ul > li a[rel='last'], 
        .pagination ul > li.prev a, 
        .pagination ul > li.next a {
            height: 17px;
            padding-top: 7px;
        }
        

        【讨论】:

          【解决方案6】:

          我能得到的最好的:

          PHP:

          <div class="paging btn-group page-buttons">
              <?php
              echo $this->Paginator->prev('< ' . __d('users', 'previous'), array('class' => 'btn btn-default prev', 'tag' => 'button'), null, array('class' => 'btn btn-default prev disabled', 'tag' => 'button'));
              echo $this->Paginator->numbers(array('separator' => '', 'class' => 'btn btn-default', 'currentClass' => 'disabled', 'tag' => 'button'));
              echo $this->Paginator->next(__d('users', 'next') . ' >', array('class' => 'btn btn-default next', 'tag' => 'button'), null, array('class' => 'btn btn-default next disabled', 'tag' => 'button'));
              ?>
          </div>
          

          CSS:

          button:hover > a {
              text-decoration: none;
          }
          

          结果:


          .paging {margin: 10px;}
          button:hover > a {text-decoration: none;}
          <link href="http://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet"/>
          <link href="http://getbootstrap.com/dist/css/bootstrap-theme.min.css" rel="stylesheet"/>
          
          <div class="paging btn-group page-buttons">
          	<button class="btn btn-default prev disabled">&lt; anterior</button>
          	<button class="disabled btn btn-default">1</button>
          	<button class="btn btn-default"><a href="/cakephp/users/index/page:2">2</a></button>
          	<button class="btn btn-default next"><a href="/cakephp/users/index/page:2" rel="next">próximo &gt;</a></button>
          </div>

          【讨论】:

            【解决方案7】:

            如果你使用 Twitter Bootstrap 3.0 和 CakePHP 2.0 或 2.1,试试这个:

            css (在您的 css 中,而不是在引导 css 中!)

            ul.pagination li.active {
                position: relative;
                float: left;
                padding: 6px 12px;
                margin-left: -1px;
                line-height: 1.428571429;
                text-decoration: none;
                background-color: #fff; 
                border: 1px solid #ddd;
            }
            

            CakePHP 视图 (要显示分页栏的位置)

            <ul class="pagination">
                <?php
                    echo ($this->Paginator->hasPrev()) ? $this->Paginator->prev('«', array('tag' => 'li'), null, null) : '<li class="disabled"><a href="#">«</a></li>';
                    echo $this->Paginator->numbers(array('separator' => false, 'tag' => 'li'));   
                    echo ($this->Paginator->hasNext()) ? $this->Paginator->next('»', array('tag' => 'li'), null, null) : '<li class="disabled"><a href="#">»</a></li>';
                ?>
            </ul>
            

            【讨论】:

              【解决方案8】:

              您无需添加任何 CSS 即可实现此目的:

              <?php
              echo $this->Paginator->numbers(array(
                      'before' => '<ul class="pagination">',
                      'separator' => '',
                     'currentClass' => 'active',
                      'currentTag' => 'a',
                      'tag' => 'li',
                      'after' => '</ul>'
                  ));
              ?>
              

              【讨论】:

                【解决方案9】:

                我已经使用了 bootstrap 所需的 cake php html 的通用函数。

                要点代码:https://gist.github.com/jruzafa/5302941

                <div class="pagination pagination-large">
                    <ul class="pagination">
                            <?php
                                echo $this->Paginator->prev(__('prev'), array('tag' => 'li'), null, array('tag' => 'li','class' => 'disabled','disabledTag' => 'a'));
                                echo $this->Paginator->numbers(array('separator' => '','currentTag' => 'a', 'currentClass' => 'active','tag' => 'li','first' => 1));
                                echo $this->Paginator->next(__('next'), array('tag' => 'li','currentClass' => 'disabled'), null, array('tag' => 'li','class' => 'disabled','disabledTag' => 'a'));
                            ?>
                        </ul>
                    </div>
                

                【讨论】:

                • 这是最好的答案,刚刚复制到我的页面并与 bootstrap css 完美配合,谢谢!
                • 完美,正是我所需要的
                • 这很好用,但对于 Bootstrap 3,您需要将 class="pagination" 放在 UL 中,而不是放在 DIV 中
                • 有什么方法可以防止省略号出现在侧面并使整个分页器偏离中心?
                • 如果您使用的是新版本的蛋糕,您需要设置省略号的样式(这 3 个点表示第 1 页和其余部分之间的分隔)。只需在 Paginator->numbers() 的数组中添加'ellipsis' =&gt; '&lt;li class="disabled"&gt;&lt;a&gt;...&lt;/a&gt;&lt;/li&gt;'
                【解决方案10】:
                    if ($this->Paginator->hasPage(null, 2)) { 
                    echo '<tfoot>';
                    echo '<tr>';
                    echo '<td colspan="7" class="text-right">';
                    echo '  <ul class="pagination pagination-right">';
                    echo $this->Paginator->first('<span class="glyphicon glyphicon-fast-backward"></span> First', array('escape' => false, 'tag' => 'li'), null, array('escape' => false, 'tag' => 'li', 'class' => 'disabled', 'disabledTag' => 'a'));
                    echo $this->Paginator->prev('<span class="glyphicon glyphicon-step-backward"></span> Prev', array('escape' => false, 'tag' => 'li'), null, array('escape' => false, 'tag' => 'li', 'class' => 'disabled', 'disabledTag' => 'a'));
                    echo $this->Paginator->numbers(array(
                        'currentClass' => 'active',
                        'currentTag' => 'a',
                        'tag' => 'li',
                        'separator' => '',
                    ));
                    echo $this->Paginator->next('Next <span class="glyphicon glyphicon-step-forward"></span>', array('escape' => false, 'tag' => 'li', 'currentClass' => 'disabled'), null, array('escape' => false, 'tag' => 'li', 'class' => 'disabled', 'disabledTag' => 'a'));
                    echo $this->Paginator->last('Last <span class="glyphicon glyphicon-fast-forward"></span>', array('escape' => false, 'tag' => 'li', 'currentClass' => 'disabled'), null, array('escape' => false, 'tag' => 'li', 'class' => 'disabled', 'disabledTag' => 'a'));
                
                    echo '  </ul>';
                    echo '<p>'.$this->Paginator->counter(array('format' => 'Page {:page} of {:pages}, showing {:current} records out of {:count} total.')).'</p>';
                    echo '</td>';
                    echo '</tr>';
                    echo '</tfoot>';    
                }
                

                【讨论】:

                  【解决方案11】:

                  这个其实在the "Creating page number links" section of the "Paginator" documentation里特别提到:

                  currentTag 当前页码使用的标签,默认为空。 这允许您生成例如 Twitter Bootstrap 之类的链接 当前页码包含在额外的“a”或“span”标签中。

                  在您的情况下,您需要使用'currentTag' =&gt; 'a'。但是,请记住,此选项是在 CakePHP 2.3 中添加的,因此如果您使用的是旧版本,它将不起作用。

                  【讨论】:

                    【解决方案12】:

                    您真正需要做的就是为当前和禁用的项目添加一个 CSS 类以匹配。这是我用于我的项目的一个(它基本上是从引导 CSS 文件中复制和粘贴的)。

                    .pagination .current,
                    .pagination .disabled {
                        float: left;
                        padding: 0 14px;
                    
                        color: #999;
                        cursor: default;
                        line-height: 34px;
                        text-decoration: none;
                    
                        border: 1px solid #DDD;
                        border-left-width: 0;
                    }
                    

                    这使它具有与a 标签相同的样式。

                    【讨论】:

                    • 我不确定你的意思。我将我的currentClass 更改为active,但没有修复。你的意思是我应该直接修改bootstrap.css文件吗?
                    • 你不需要修改 bootstrap CSS,只需将它添加到你自己的 CSS 文件中。
                    • @jeremyharris 虽然您的解决方案可以工作,但从 CakePHP 2.3 开始就不需要了。看我的回答。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-05-21
                    • 2017-03-28
                    • 2012-07-20
                    • 2014-01-24
                    • 2011-08-31
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多