На главной странице сайта - блога выводится 7 статей.
Я реализовал кнопку "Показать больше" при помощи стандартного виджета пагинации.
Для этого я скрыл все кнопки пагинации кроме последней кнопки "Следующая".
Затем я перехватил событие "click" на этой кнопке и с помощью Ajax запроса вставляю содержимое следующей страницы в конец текущей.
Все было бы ни чего, только вот незадача.
На первой странице пагинации у меня выводится 7 статей, (и это количество выводимых статей нельзя изменить, такой дизайн).
Так как сайт бар на первой странице имеет такую же высоту как и контентная область, то для вывода следующих страниц у меня освобождается свободное место для статей, и получается, что на всех последующих старницах мне нужно выводить не 7 а 9 статей.
Но виджет пагинации уже посчитал все статьи и разбил их на страницы и при клике на кнопку "Показать еще" выводит 7 статей вместо 9, а мне нужно именно 9 (для того, что бы не ломать дизайн сайта).
Как можно решить эту проблему?
Если есть какие предложения буду рад подсказке.
Как изменить стандартную работу виджета пагинации Yii2?
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: Как изменить стандартную работу виджета пагинации Yii2?
Много текста, но нет кода)
Покажите свой код как выводите, вам подскажут ошибки и лучшие практики)
Покажите свой код как выводите, вам подскажут ошибки и лучшие практики)
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: Как изменить стандартную работу виджета пагинации Yii2?
Я просто не знаю что имено показывать, так как все реализованно стандартным виджетом
вот так я вывожу кнопку покузато больше:
Код: Выделить всё
<div id="pagerBlock">
<?= \yii\helpers\Html::beginForm(['/site/show-more'], 'post', ['id' => 'showMoreForm']); ?>
<?= \yii\helpers\Html::endForm(); ?>
<?php
echo \yii\widgets\LinkPager::widget([
'pagination' => $pagination,
'activePageCssClass' => 'disabled',
'nextPageCssClass' => 'older_posts showMore',
'nextPageLabel' => '<span>Show More</span>',
'prevPageCssClass' => 'disabled',
'disableCurrentPageButton' => true,
'linkContainerOptions' => ['class' => 'displayNone'],
'options' => [
'class' => 'uk-pagination uk-text-center showMoreContainer'
]
]);
?>
</div>
Код: Выделить всё
function getURLParameter(url, name) {
return (RegExp(name + '=' + '(.+?)(&|$)').exec(url)||[,null])[1];
}
function showMore(e){
e.preventDefault();
var url = $(e.target).attr('href');
var page = getURLParameter(url, 'page');
$('#nextPage').val(page);
var form = $('#showMoreForm')[0];
var fd = new FormData(form);
$.ajax({
url: '/site/show-more?page=' + page,
data: fd,
processData: false,
contentType: false,
type: 'POST',
success: function(data){
$('#pagerBlock').remove();
$('#tm-middle').append(data);
$('.older_posts.showMore').on('click', showMore);
}
});
}
$('.older_posts.showMore a').on('click', showMore);
Код: Выделить всё
public function actionShowMore(){
if (Yii::$app->request->isAjax && Yii::$app->request->isPost){
$data = Article::getLast(7);
$lastArticles = $data['articles'];
$pagination = $data['pagination'];
return $this->renderAjax('show-more',[
'lastArticles' => $lastArticles,
'pagination' => $pagination,
]);
}
}
Код: Выделить всё
public static function getLast($limit)
{
$query = Article::find()->where(['article.active' =>'1'])->joinWith('author')->andWhere(['user.published' => 1])->orderBy(['sort' => SORT_DESC, 'date' => SORT_DESC]);
$countQuery = clone $query;
$pages = new Pagination(['totalCount' => $countQuery->count(), 'pageSize'=>$limit]);
$pages->pageSizeParam = false;
// limit the query using the pagination and retrieve the articles
$articles = $query->offset($pages->offset)
->limit($pages->limit)
->all();
$data['articles'] = $articles;
$data['pagination'] = $pages;
return $data;
}
Последний раз редактировалось webgrig 2018.07.18, 22:44, всего редактировалось 1 раз.
Re: Как изменить стандартную работу виджета пагинации Yii2?
Напомню суть вопроса.
Мне нужно, изменить стандаретую работу класса yii\data\Pagination таким образом,
что бы на первой странице пагинации он выдавал 7 статей, а на всех последующих 9.
Мне нужно, изменить стандаретую работу класса yii\data\Pagination таким образом,
что бы на первой странице пагинации он выдавал 7 статей, а на всех последующих 9.
Re: Как изменить стандартную работу виджета пагинации Yii2?
Такое вообще возможно.
Если да, то хотябы подскажите в каком направлении копать.
Если да, то хотябы подскажите в каком направлении копать.
Re: Как изменить стандартную работу виджета пагинации Yii2?
Вот решение:
Анализируем переменную $limit, которая пришла в качестве параметра при вызове метода getLast($limit).
И с ее помощью изменяем зачение $pages->offset
7 - это количество элементов на первой странице.
Анализируем переменную $limit, которая пришла в качестве параметра при вызове метода getLast($limit).
И с ее помощью изменяем зачение $pages->offset
Код: Выделить всё
$pagesOffset = ($limit <= 7) ? $pages->offset + (7 - $limit) : $pages->offset - ($limit - 7);
$articles = $query->offset($pagesOffset)
->limit($pages->limit)
->all();