Как изменить стандартную работу виджета пагинации Yii2?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
webgrig
Сообщения: 163
Зарегистрирован: 2015.10.29, 21:34

Как изменить стандартную работу виджета пагинации Yii2?

Сообщение webgrig »

На главной странице сайта - блога выводится 7 статей.
Я реализовал кнопку "Показать больше" при помощи стандартного виджета пагинации.
Для этого я скрыл все кнопки пагинации кроме последней кнопки "Следующая".
Затем я перехватил событие "click" на этой кнопке и с помощью Ajax запроса вставляю содержимое следующей страницы в конец текущей.
Все было бы ни чего, только вот незадача.
На первой странице пагинации у меня выводится 7 статей, (и это количество выводимых статей нельзя изменить, такой дизайн).
Так как сайт бар на первой странице имеет такую же высоту как и контентная область, то для вывода следующих страниц у меня освобождается свободное место для статей, и получается, что на всех последующих старницах мне нужно выводить не 7 а 9 статей.
Но виджет пагинации уже посчитал все статьи и разбил их на страницы и при клике на кнопку "Показать еще" выводит 7 статей вместо 9, а мне нужно именно 9 (для того, что бы не ломать дизайн сайта).
Как можно решить эту проблему?
Если есть какие предложения буду рад подсказке.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Как изменить стандартную работу виджета пагинации Yii2?

Сообщение Dominus »

Много текста, но нет кода)
Покажите свой код как выводите, вам подскажут ошибки и лучшие практики)
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
webgrig
Сообщения: 163
Зарегистрирован: 2015.10.29, 21:34

Re: Как изменить стандартную работу виджета пагинации Yii2?

Сообщение webgrig »

Dominus писал(а): 2018.06.23, 02:34 Много текста, но нет кода)
Покажите свой код как выводите, вам подскажут ошибки и лучшие практики)
Я просто не знаю что имено показывать, так как все реализованно стандартным виджетом
вот так я вывожу кнопку покузато больше:

Код: Выделить всё

<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>
вот так я перехватываю событие 'onclick' на этой кнопке

Код: Выделить всё

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,
        ]);
    }
}
а вот метод getLast который возвращает содержимое текущей страницы и переменную $pagination, которую мы передаем виджету \yii\widgets\LinkPager на странице.

Код: Выделить всё

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 раз.
webgrig
Сообщения: 163
Зарегистрирован: 2015.10.29, 21:34

Re: Как изменить стандартную работу виджета пагинации Yii2?

Сообщение webgrig »

Напомню суть вопроса.

Мне нужно, изменить стандаретую работу класса yii\data\Pagination таким образом,
что бы на первой странице пагинации он выдавал 7 статей, а на всех последующих 9.
webgrig
Сообщения: 163
Зарегистрирован: 2015.10.29, 21:34

Re: Как изменить стандартную работу виджета пагинации Yii2?

Сообщение webgrig »

Такое вообще возможно.
Если да, то хотябы подскажите в каком направлении копать.
webgrig
Сообщения: 163
Зарегистрирован: 2015.10.29, 21:34

Re: Как изменить стандартную работу виджета пагинации Yii2?

Сообщение webgrig »

Вот решение:
Анализируем переменную $limit, которая пришла в качестве параметра при вызове метода getLast($limit).
И с ее помощью изменяем зачение $pages->offset

Код: Выделить всё

$pagesOffset = ($limit <= 7) ? $pages->offset + (7 - $limit) : $pages->offset - ($limit - 7);

$articles = $query->offset($pagesOffset)
      ->limit($pages->limit)
      ->all();
7 - это количество элементов на первой странице.
Ответить