Пользовательская разбивка на страницы в Cake PHP
-
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
к списку помощников в контроллере.
Другие советы
Вы можете показать ответ здесь
Вы также можете показать другой результат здесь.
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' => ''
));