CakePHP Paginator,如何使当前页面成为锚点

时间:2012-07-13 06:25:46

标签: php cakephp pagination

在我看来,我正在使用此代码:

$numbers = $this->Paginator->numbers(array(
    'separator'     => '',
    'tag'           => 'li',
    'currentClass'  => 'active'
));

输出:

<li class="active">1</li>
<li><a href="/controller/action/page:2">2</a></li>
<li><a href="/controller/action/page:3">3</a></li>

这很好用,我唯一的问题是当前页面不是链接。是否可以将当前页面作为链接?

感谢阅读。

5 个答案:

答案 0 :(得分:2)

我实现了像Dave建议的类扩展,但是我没有复制原始类中的所有代码,而是使用字符串替换方法,这样,如果我更新CakePHP核心库,这应该会非常优雅地失败,其中复制原始Helper中的所有代码可能会导致功能丢失,错误修复等。以下是我实现的类:

<?php

class AppPaginatorHelper extends PaginatorHelper
{
    public function numbers($options = array()) {
        $output = parent::numbers($options);

        // get the current page number, and create a link with it
        $current = $this->current();
        $currentLink = $this->link($current, array('page' => $current));

        // if you're using cake pre 2.1 you cannot change the current class with
        // the options array, so it will always be "current"
        $find = "<li class=\"current\">{$current}</li>";
        $replace = "<li class=\"active\">{$currentLink}</li>"; 

        $output = str_replace($find, $replace, $output);

        return $output;
    }
}

答案 1 :(得分:2)

有一个公关让它发挥作用。 不幸的是,这只会发生在2.3版本中。

在这里你可以找到PR https://github.com/cakephp/cakephp/pull/900

在这里您可以找到讨论 http://cakephp.lighthouseapp.com/projects/42648/tickets/2892-paginator-helper-numbers-is-a-bit-counter-intuitive-enhancement-included

答案 2 :(得分:2)

您可以使用下一段代码制作出您想要的内容:

<?php echo $this->Paginator->numbers(array('separator' => '','tag' => 'li', 'currentTag' => 'a', 'currentClass' => 'active')); ?>

它仅适用于CakePHP 2.3 +

答案 3 :(得分:1)

简单回答:

我不相信Paginator Helper可以使用它。

如果您只是想要链接到当前页面但在编号链接中不需要它,您可以使用

echo $this->Html->link($this->Paginator->counter('{:current}'), 'yourLinkHere');

但这并不是非常有用,因为你依靠Paginator Helper为你处理其余的链接。

扩展答案/可能性

您可以使用下面的内容扩展PaginatorHelper。基本上,我刚刚删除了检查,看它是否是当前的页码。然后,您必须使用MyPaginatorHelper来构建链接。这也会使它忽略currentClass选项......等。但是 - 通过更多的代码调整,你可以做到这一点,它做同样的事情,但也建立一个链接,而不是只是删除IF检查。

class MyPaginatorHelper extends PaginatorHelper {
    public function numbers($options = array()) {
    if ($options === true) {
        $options = array(
            'before' => ' | ', 'after' => ' | ', 'first' => 'first', 'last' => 'last'
        );
    }

    $defaults = array(
        'tag' => 'span', 'before' => null, 'after' => null, 'model' => $this->defaultModel(), 'class' => null,
        'modulus' => '8', 'separator' => ' | ', 'first' => null, 'last' => null, 'ellipsis' => '...', 'currentClass' => 'current'
    );
    $options += $defaults;

    $params = (array)$this->params($options['model']) + array('page' => 1);
    unset($options['model']);

    if ($params['pageCount'] <= 1) {
        return false;
    }

    extract($options);
    unset($options['tag'], $options['before'], $options['after'], $options['model'],
        $options['modulus'], $options['separator'], $options['first'], $options['last'],
        $options['ellipsis'], $options['class'], $options['currentClass']
    );

    $out = '';


        $half = intval($modulus / 2);
        $end = $params['page'] + $half;

        if ($end > $params['pageCount']) {
            $end = $params['pageCount'];
        }
        $start = $params['page'] - ($modulus - ($end - $params['page']));
        if ($start <= 1) {
            $start = 1;
            $end = $params['page'] + ($modulus - $params['page']) + 1;
        }

        if ($first && $start > 1) {
            $offset = ($start <= (int)$first) ? $start - 1 : $first;
            if ($offset < $start - 1) {
                $out .= $this->first($offset, compact('tag', 'separator', 'ellipsis', 'class'));
            } else {
                $out .= $this->first($offset, compact('tag', 'separator', 'class') + array('after' => $separator));
            }
        }

        $out .= $before;

        for ($i = $start; $i < $params['page']; $i++) {
            $out .= $this->Html->tag($tag, $this->link($i, array('page' => $i), $options), compact('class')) . $separator;
        }

        if ($class) {
            $currentClass .= ' ' . $class;
        }
        $out .= $this->Html->tag($tag, $params['page'], array('class' => $currentClass));
        if ($i != $params['pageCount']) {
            $out .= $separator;
        }

        $start = $params['page'] + 1;
        for ($i = $start; $i < $end; $i++) {
            $out .= $this->Html->tag($tag, $this->link($i, array('page' => $i), $options), compact('class')) . $separator;
        }

        if ($end != $params['page']) {
            $out .= $this->Html->tag($tag, $this->link($i, array('page' => $end), $options), compact('class'));
        }

        $out .= $after;

        if ($last && $end < $params['pageCount']) {
            $offset = ($params['pageCount'] < $end + (int)$last) ? $params['pageCount'] - $end : $last;
            if ($offset <= $last && $params['pageCount'] - $end > $offset) {
                $out .= $this->last($offset, compact('tag', 'separator', 'ellipsis', 'class'));
            } else {
                $out .= $this->last($offset, compact('tag', 'separator', 'class') + array('before' => $separator));
            }
        }

    }

    return $out;
}
}

答案 4 :(得分:1)

我找到了一个很好的解决方案,并为您分享:)

<div class="pagination pagination-large">
    <ul>
            <?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>