Пользовательская разбивка на страницы в Cake PHP

StackOverflow https://stackoverflow.com//questions/9636228

  •  10-12-2019
  •  | 
  •  

Вопрос

я новичок в CakePHP, и я не хочу создавать пользовательскую разбивку на страницы в CakePHP.

функция $paginator->numbers() ; он отображает номера страниц следующим образом :

1 | 2 | 3 | 4 | ...

заглянув в настройки, можно найти несколько вариантов изменения разделителя, добавления класса стиля css .. и т.д.

чего я хочу, так это чтобы моя разбивка на страницы выглядела следующим образом :

1-20 21-40 41-60 61-80 ... >>

у кого-нибудь есть идея о том, как это закодировать?

РЕДАКТИРОВАТЬ :

я создал пользовательский помощник разбиения на страницы в : app/View/Helper/ ,

и я добавил свой CustomPaginatorHelper чтобы $helpers из моего Controller подобный этому :

public $helpers = array('CustomPaginator', 'Html', 'Form', 'Js');

но я получил эту ошибку :

Fatal error: Class 'PaginatorHelper' not found in /Applications/MAMP/htdocs/QRCode/app/View/Helper/CustomPaginatorHelper.php on line 2

похоже, он не знает, что PaginatorHelper !!!Где я должен добавить свой пользовательский Paginator ??

nb : ваша функция numbers() будет отображать только формат разбивки на страницы :1-20 21-40... и т.д., но без ссылок на страницы, я думаю :)

ПРАВКА 2 :

я добавил App::set('PaginatorHelper','/View/Helper/'); и я больше не получаю эту ошибку.Теперь я пытаюсь вызвать numbers() метод пользовательского разбиения на страницы выглядит следующим образом :

$this->CustomPaginator->numbers(); 

но я получаю эту ошибку :

Fatal error: Call to a member function numbers() on a non-object in /Applications/MAMP/htdocs/QRCode/app/View/Codes/index.ctp on line 71

каков источник этой ошибки?я попытался добавить свой customPaginatorHelper в переменную $helpers моего контроллера, но я все равно получаю ту же ошибку ;есть какие-нибудь идеи?

заранее спасибо

Это было полезно?

Решение

Главное, что здесь нужно знать, - это то, что существует компонент paginator (используемый в контроллере) и вспомогательный paginator (используемый в представлении).То, что вы используете, - это класс PaginatorHelper, который обрабатывает рендеринг элементов, связанных с разбивкой на страницы.

К сожалению, нет никакого способа сделать то, чего вы хотите достичь с помощью PaginatorHelper.Лучшим подходом, если вы хотите это сделать, было бы расширить класс PaginatorHelper и переопределить numbers() метод для возврата того, что вы хотите.

Я взглянул на этот конкретный метод, и, к сожалению, он не очень хорош - в нем более 100 строк!Однако я создал класс, который создает подклассы PaginatorHelper и переопределяет метод.Это очень много для копирования и вставки, поскольку исходный метод очень длинный, и по этой причине я не поместил его непосредственно в этот ответ.

Вы можете просмотреть его здесь: https://gist.github.com/2037902

Вам также нужно добавить CustomPaginator к списку помощников в контроллере.

Другие советы

Вы можете показать ответ здесь

Custom-Query-Pagination

Вы также можете показать другой результат здесь.

http://www.endyourif.com/custom-pagination-query-in-CakePhp /

<Сильный> Ответ для пользовательской пагинации в торт PHP

Хороший пример того, когда вам понадобится, если базовая БД не поддерживает SQL Limit Syntax.Это верно для DB2 IBM.Вы все еще можете использовать Pagination CakePhp, добавив пользовательский запрос к модели.

Если вам необходимо создать пользовательские запросы для генерации данных, которые вы хотите Paginate, вы можете переопределить методы модели Paginate () и PaginateCount (), используемые логикой контроллера Pagination.Вам также необходимо переопределить CORE PaginateCount (), этот метод ожидает тех же аргументов, что и модель :: Найти («подсчет»).Пример ниже использует некоторые функции Postgres-Specifc, поэтому, пожалуйста, регулируйте соответственно в зависимости от того, какую базу данных вы используете.

Спасибо Помогите ли это

Я нашел даже более простой способ добиться того же самого.Вы заметите, что PaginationHelper расширяет AppHelper.Итак, если вы скопируете какие-либо функции из PaginatorHelper в вызовы AppHelper и вызовете их из PaginationHelper, они будут вести себя точно так же и без каких-либо ошибок.

Использование

$numbers_config = array(
"before" => null,
"after" => null,
"separator" => "",
"tag" => "li"
);
echo $this->Paginator->customNumbers($numbers_config);

Код

// /app/View/AppHelper.php

App::uses('Helper', 'View');

class AppHelper extends Helper {

    public function customNumbers($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', 'currentTag' => null
        );
        $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'], $options['currentTag']
        );

        $out = '';

        if ($modulus && $params['pageCount'] > $modulus) {
            $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', 'ellipsis') + 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;
            }
            if ($currentTag) {
                $out .= $this->Html->tag($tag, $this->Html->tag($currentTag, $params['page']), array('class' => $currentClass));
            } else {
                $out .= $this->Html->tag($tag, "<a href='#'>".$params['page']."</a>", 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', 'ellipsis') + array('before' => $separator));
                }
            }

        } else {
            $out .= $before;

            for ($i = 1; $i <= $params['pageCount']; $i++) {
                if ($i == $params['page']) {
                    if ($class) {
                        $currentClass .= ' ' . $class;
                    }
                    if ($currentTag) {
                        $out .= $this->Html->tag($tag, $this->Html->tag($currentTag, $i), array('class' => $currentClass));
                    } else {
                        $out .= $this->Html->tag($tag, $i, array('class' => $currentClass));
                    }
                } else {
                    $out .= $this->Html->tag($tag, $this->link($i, array('page' => $i), $options), compact('class'));
                }
                if ($i != $params['pageCount']) {
                    $out .= $separator;
                }
            }

            $out .= $after;
        }

        return $out;
    }

}

Я нашел еще более простое решение, пользовательский код не требуется, и это будет сделано способом CakePHP, который может не работать в версиях CakePHP 2.0 ниже, потому что я проверил в 2.5...

Для Paginators number() метод, который вы всегда можете переопределить его default array() что похоже:

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

теперь мы можем переопределить эти значения по умолчанию в любое время, когда захотим, просто используйте эти атрибуты в вашем options array() например, в вашем случае:

    $this->Paginator->numbers(
                              array(
                                'separator' => ' - ',
                                'after' => '',
                                'before' => ''
    ));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top