Постраничная разбивка в Yii
29 июня 2010
Упоминание о простейшей постраничной разбивке в документации к последним версиям Yii было заменено работой с компонентами zii. Да, в API всё осталось, но шансы наткнуться на нужный класс снизились, поэтому опишу простейшую постраничную разбивку на примере.
Контроллер:
function actionIndex(){ $criteria = new CDbCriteria(); $count=Article::model()->count($criteria); $pages=new CPagination($count); // элементов на страницу $pages->pageSize=10; $pages->applyLimit($criteria); $models = Article::model()->findAll($criteria); $this->render('index', array( 'models' => $models, 'pages' => $pages )); }
Шаблон view:
foreach($models as $model): // выводим модели <?endforeach // рисуем пейджер <?$this->widget('CLinkPager', array( 'pages' => $pages, ))
Комментарии RSS по email OK
А если там в базе миллион записей? Это же они все будут в память выбираться в указанном выше примере. Есть ли возможность заюзать этот пейджер без предварительной выборки всех записей?
Вячеслав, спасибо. Чуть ошибся с кодом. Поправил. Теперь будет выбираться только необходимый минимум.
Как бы нет
оно как раз выбирает по 10))) передаем параметры в
$pages
мы добавляем к
$criteria
Limit 10 и какойто там offset
По мне так лучше в контроллере сделать так:
Блин. Пока писал уже поправили.
maxx
Спасибо, проверку на пустоту убрал.
Александр, а чего это так случилось, что вроде класс и не deprecated, а в документации yii даются ссылки на zii.
Быть может намекнуть Квану, что это как бы неправильно ;)
А еще, я как-то упустил момент, когда CFileHelper обрёл copyDirectoryRecursive и findFilesRecursive, вроде как функциональность новая, а чейнджлоге не было.
Мне правда больше нравится $this->paginate($count,10)->applyLimit($criteria) хоть оно и deprecated
$this->paginate ?
Кстати, похожым образом еще и сортировку можно делать:
idle
Вообще он не в документации был, а в гайде по созданию блога. Блог перевели на zii. Описание обновили. Соответственно часть с применением пейджинга была потеряна.
Кстати, смотрю в API по CPagination примера-то нет. Подумываю туда этот пример засунуть.
CFileHelper вроде всегда умел рекурсивно удалять и копировать папки, да ещё и фильтровать то, что копирует. Я его в сборщике релизов YiiExt применил ещё когда Yii был 1.0.
Максим
Ну, сортировка таким образом жизнь особо не упрощает.
А почему так нельзя?
Было бы не плохо, если бы в CLinkPager был какой нибудь флаг, что бы можно было его поставить в true и результат работы виджета не выводился сразу через echo, а возвращался через return. Иначе, если надо выводить пейджинг сверху снизу, то каждый раз все будет просчитываться заново. А так сунул в переменную и выводишь ее сколько надо раз. Единственное, что будут траблы с id.
Блин. Ступил. Надо было смотреть выше в класс CWidget.
Tokolist
Так можно, хотя способ этот появился гораздо позже и используется в основном с всякими CListView и CGridView.
Добавил пример в API. С релизом будет показываться на сайте.
а как пагиновать не ActiveRecord объекты а например, обычный массив?
Его и вручную достаточно просто:
Можно, конечно, в компонент оформить.
конкретно мне непонятно как applyLimit (например 20 айтемов на странице) реализовать в таком случае
Через array_slice.
круто
Нет простого примера для ajax пагинации/сортировки?
Вот вопрос Например есть category и post; Они связаны, как через категорий пагиновать post?
как думаете можно пагтновать посты?
В смысле постранично разбивать? Попробуйте выборку сделать из постов, а не из категорий.
Спасибо большое! Долго искал, как можно сделать постраничную навигацию без CActiveDataProvider!
Читал книгу, дошёл до сортировки и пагинации, не понял, начал гуглить. Как мы определяем, на какой странице находимся, ведь в действие не приходят никакие пареметры? Может, конечно, что-то неправильно понял, ведь изучаю пока на теории и вид ссылок пагинации не видел. Но информацию о смещении в действии я не вижу.
Приходят. Сделайте
var_dump()
для$_GET
и$_POST
.Всем доброго времени суток! Прошу помочь с пагинацией.... есть галерея работающая без БД, просто читает картинки из папки, и выводит их на экран. В галерее не было сортировки по порядку. Прикрутил. Но теперь пагинация не работает. может Вы подскажите что изменить или новую пагинацию прикрутить. только не знаю как. заранее спасибо.
Den, и при чём тут Yii?
Просто смотрю тут вменяемые люди общаются на других форумах люди не охотно хотят помочь. Очень извиняюсь если порчу всю картину своим постом!
Разбирайтесь. Кода многовато, чтобы сходу подсказать. Отлаживать, к сожалению, некогда.
добрый день! у меня такой вопрос, можно ли изменить ссылку пагинации, т.е. есть такая ссылка tema.da/kategoriya/62 а когда навожу на пагинацию то создается такая tema.da/kategoriya/62.html?page=2, можно ли как то управлять этим?
Да, в URL manager правил добавить.
подробней пожалуйста
А что нибудь для бесконечного скрола можно готовое найти?
Странно ,в качестве оптимизации ,не правильнее будет сначала найти все статьи как вы делали. $models = Article::model()->findAll($criteria); а потом просто $count=count($models); вместо $count=Article::model()->count($criteria); ?
Владимир, конечно же не правильнее. Так у вас выберется полностью 10000 статей и сделается от них
count
.Ну получает $count=Article::model()->count($criteria); вы посчитываете количество(1ое обращение к БД), предположим по критериям выбрано 999, Потом $models = Article::model()->findAll($criteria); вы опять обращаетесь к базе, и Criteria вы же нигде не меняете, как было оно такое же для первого запроса, так и для второго. и тоже отберет 999?
А подсчет количества элементов у обычного массива,(т.к. он в памяти) быстрее чем подсчёт через обращение к БД.
Э, нее. Общее количество используется только для рассчёта количества страниц. Выгружается реально 10 записей (или сколько там на страницу).
А ну тогда да, а то по коду смотришь и думаешь что criteria не меняется
Владимир, не рановато курс затеяли? Качественно будет или как у народа в прошлые разы?
Я курс нигде кроме своего сайта, не обьявлял, так как до своего сайта руки не доходят, не успеваю, а курс всё таки надо качественно подготовить, сделал страничку чтобы уже поисковики индексировали. И программа курса возможно будет совершенно другая, к примеру есть высоконагруженный проект и уже становится понятно что от ActiveRecord придется полностью отказаться, сервер прямо на глазах сыплется от нехватки памяти. Если вы не против, я вышлю пару уроков вам для оценки стоит ли так делать или нет. Не хочу людей учить не правильным вещам.
Это хорошая идея. Почта у меня тут: http://rmcreative.ru/author
Добрый день уважаемому сообществу. Заранее прощу прощения, если вопрос сформулирую некорректно, поскольку я в yii пока новичок. Вопрос такой. в main.php rules = array( ... '<language:(ru|ua|en)>/akti//'=>'akti/index', '<language:(ru|ua|en)>/akti//'=>'akti/index', ) страница вида localhost/kodeksi.com/ru/akti/grazhdanskijj-kodeks-ukrainy.html работает нормально. Подключаю Пагинацию и получаю localhost/kodeksi.com/ru/akti.html?akt=grazhdanskijj-kodeks-ukrainy&page=2. Такой вариант тоже работает. А вот localhost/kodeksi.com/ru/akti/grazhdanskijj-kodeks-ukrainy/page/2.html
Ошибка 404 Невозможно обработать запрос "ru/akti/grazhdanskijj-kodeks-ukrainy/page/2".
Подскажите, пожалуйста, что я не так делаю. Заранее спасибо.
Нужно прописать выше стандартные правила, которые генерятся через
yiic webapp
и модифицировать их добавив язык.Спасибо. проблему решил.
Добрый день. У меня страницы делятся и выводятся по категориям.
В категориях пейджер выводит больше страниц чем надо (пустые страницы).
Подскажите как это исправить?
Критерий надо строить до
count
.Возможно ли в "applyLimit" указать два и вольше критерий запросов. Я к примеру сделал поиск по сайту и у меня есть несколько обращений в базу данных, потом я просто делаю слияние массивов в count, а вот как в "applyLimit" это указать?
подскажите, чуть не в тему правда. прикрутил Yii::import('zii.widgets.CListView'); class TbListView extends CListView как мне установить правила формирования ссылок. Спасибо =)
только сильно не ругайте
А вот такие правила верны? 'news/<page:\d+>'=>'news/page/<page:\d+>', 'news/page/<page:\d+>'=>'post/index',
Так и в пейджере и на сайте ссылки отображаются как news/page/1
приветствую
подскажите как настроить чтобы перекидывало на страницу с ошибкой 404, когда лимит страниц превышается
допустим /index.php?page=1 для первой страницы /index.php?page=10 для последней страницы
/index.php?page=100 все равно выдает последнюю страницу, то есть /index.php?page=10
как это исправить, чтобы выдавалась ошибка 404 ?
Доброго времени суток. Возникла проблема с пагинацией в GridView
localhost/tourlandia.com.ua/dashboard/suppliers/view/ajax/yw0/Shambala%5Bid%5D//Shambala%5Btourlandia_id%5D//Shambala%5Btitle%5D/Tatonka/Shambala%5Bopt_e%5D//Shambala%5Bopt_uah%5D//Shambala%5Brrc_e%5D//Shambala%5Brrc_uah%5D//Shambala%5Bqty_dnepr%5D//Shambala%5Bqty_kiev%5D//Shambala_page/2/supplayer/Shambala.html на локальной машине все в порядке, но при переносе на хостинг // читаются сервером как одна и поэтому пара ключ значение работаю неправильно.
Не подскажете, где нужно поменять настройки?
Заранее спасибо и извините за беспокойство.
Александр, не понял, в чём именно проблема. Давайте лучше на форум.
Спасибо большое! Очень познавательно. То что нужно...
А для динамических данных лучше использовать курсоры: plutov.by/post/cursor_pagination
Не понимаю как в примере работает $criteria, ведь она по сути у нас "пустая", мы же не указывали никаких условий. Почему здесь $models = Article::model()->findAll($criteria); вытащиться 10 обектов? Как работает вот эта строка $pages->applyLimit($criteria); ?
А понял, именно эта строка $pages->applyLimit($criteria); и устанавливает limit = 10. Можно же вместо неё просто написать $criteria->limit = 10; ? Это будет идентично?
Roma, в случае limit да, в случае offset нет.
А как сделать, чтобы были только две кнопки - вперед и назад? В этом случае можно не делать запрос, выводящий количество всех статей, а достачно посчитать, сколько выдало на текущей страцние. Например, если выдало 10 постов, и всего надо 10, то наверняка и на следущей странице будут посты, значит делает активной кнопку вперед
Вперёд-назад — это просто OFFSET в запросе.
Добрый день уважаемый Александр!
Можете глянуть, в чем может быть проблема? yiiframework.ru/forum/viewtopic.php?f=3&t=20687&e=1&view=unread#unread
Авторы данных блогов ответов не дали, при всем к ним уважении, на fl.ru обратился, там тоже как то глухо, посмотрите пожалуйста!
Подскажите пожалуйста! А как Yii 2 сделать ЧПУ разбивку по страницам? Сейчас страница добавляется через &.
И еще одни вопрос, какие настройки будут правильными в urlManager. Ведть сейчас получается что под каждый адрес нужно дублировать страницу с указанием /page/, то есть: было 'test/' => 'test/letter', а нужно будет сделать 2 строки 'test//<page:\d+>' => 'test/letter',
В Yii1 такого делать не нужно было!
Ведть сейчас получается что под каждый адрес нужно дублировать страницу с указанием /page/, то есть: было test/' => test/letter а нужно будет сделать 2 строки test/ => test/letter test/<page:\d+> => test/letter
Можно ли написать универсальное правило?
Сделал по примеру и у меня почему то лимит записей возводится в квадрат, и столько записей на странице отображает. Почему так?
Интересует как сделать в постраничной навигации для gridview параметр - сколько строк выводить на одной странице (5, 10, 20, 100). Можно ли это сделать стандартными средствами yii2?
Да.