Сохранение значений

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Сохранение значений

Сообщение yiiliveext »

unknownby писал(а): 2020.01.16, 12:29 Осталось посчитать количество страниц maxPage :)
Я проверил, если должно быть 2 страницы и указана двойка, то всё хорошо.
Буду сейчас считать, но где лучше это сделать? Думаю парсить url, который приходит в loadPage и дальше что-то делать.
Уберите это свойство вообще, без него должно прекрасно работать. У меня работает, но я напрямую подключал infinitescroll.js, не через расширение, хотя разницы быть не должно.
Добавил вот что

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

$('.listview_products').data('infinitescroll', null);
В null должно сбрасываться при дестрое, там устаревшая версия этого плагина используется, так что это просто баг там такой скорее всего:)
Там, кстати, в этом расширении не работает подгрузка при клике на Load more. Если сами не нашли как сделать то добавтьте в конфиг пейджера

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

'linkOptions' => ["onclick" => "event.preventDefault();$('.listview_products').infinitescroll('retrieve')"]
Последний раз редактировалось yiiliveext 2020.01.16, 12:45, всего редактировалось 1 раз.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Сохранение значений

Сообщение unknownby »

yiiliveext писал(а): 2020.01.16, 12:35
unknownby писал(а): 2020.01.16, 12:29 Осталось посчитать количество страниц maxPage :)
Я проверил, если должно быть 2 страницы и указана двойка, то всё хорошо.
Буду сейчас считать, но где лучше это сделать? Думаю парсить url, который приходит в loadPage и дальше что-то делать.
Уберите это свойство вообще, без него должно прекрасно работать. У меня работает, но я напрямую подключал infinitescroll.js, не через расширение, хотя разницы быть не должно.
Если убираю, не работает. Скорее баг :D
У меня в проекте через расширение, а там jquery.infinitescroll.js которое берется из @bower/jquery-infinite-scroll

Я делаю специально автоматическую подгрузку, чтобы не надо было нажимать на кнопку "Загрузить еще". Потому что если будет меньше чем 20 товаров, тогда будет предупреждение "Your nextSelector found no elements". Если после фильтров выдало 20+ товаров, то пользователь 100% листает вниз, а там автоматическая подругзка сработает сразу. :D
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Сохранение значений

Сообщение yiiliveext »

unknownby писал(а): 2020.01.16, 12:44
yiiliveext писал(а): 2020.01.16, 12:35
unknownby писал(а): 2020.01.16, 12:29 Осталось посчитать количество страниц maxPage :)
Я проверил, если должно быть 2 страницы и указана двойка, то всё хорошо.
Буду сейчас считать, но где лучше это сделать? Думаю парсить url, который приходит в loadPage и дальше что-то делать.
Уберите это свойство вообще, без него должно прекрасно работать. У меня работает, но я напрямую подключал infinitescroll.js, не через расширение, хотя разницы быть не должно.
Если убираю, не работает. Скорее баг :D
У меня в проекте через расширение, а там jquery.infinitescroll.js которое берется из @bower/jquery-infinite-scroll
Значит делаете

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

<div class="products" data-max_page="<?=$dataProvider->getPagination()->getPageCount()?>">
и

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

'maxPage': $('.products', data).data('max_page')
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Сохранение значений

Сообщение unknownby »

yiiliveext писал(а): 2020.01.16, 13:01 Значит делаете

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

<div class="products" data-max_page="<?=$dataProvider->getPagination()->getPageCount()?>">
и

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

'maxPage': $('.products', data).data('max_page')
Не хочет работать

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

<?=$dataProvider->getPagination()->getPageCount()?>
Хотя всё логично же, можно даже через контроллер передавать переменную эту, но выдает 0
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Сохранение значений

Сообщение yiiliveext »

unknownby писал(а): 2020.01.16, 14:37 Не хочет работать

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

<?=$dataProvider->getPagination()->getPageCount()?>
Хотя всё логично же, можно даже через контроллер передавать переменную эту, но выдает 0
Чудес не бывает, посмотрите отладчиком или через Yii::debug на каком этапе возвращает ноль.
В самой верстке, которая ajax-ом прилетает, тоже 0? Если там нормально, то поменяйте

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

'maxPage': $('.products', data).attr('data-max_page')
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Сохранение значений

Сообщение unknownby »

yiiliveext писал(а): 2020.01.16, 15:40 Чудес не бывает, посмотрите отладчиком или через Yii::debug на каком этапе возвращает ноль.
В самой верстке, которая ajax-ом прилетает, тоже 0? Если там нормально, то поменяйте
На разных этапах возвращает 0.
1. Сразу через контроллер 0
2. Внутри представления основного 0
3. Внутри представления listView 0
4. В самом listView (запихнул в layout) тоже 0
Нашел вот что $dataProvider->prepare();
Через контроллер возвращается значение в этой теме

P.S. сейчас еще всё перепроверю

Оставил вот так

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

$('.products', data).data('max_page')
Представление с listView

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

<?php
use yii\widgets\ListView;
use nirvana\infinitescroll\InfiniteScrollPager;
$dataProvider->prepare();
?>
<div class="products" data-max_page="<?=$dataProvider->getPagination()->getPageCount()?>"></div>
<?= ListView::widget([
    'id' => 'listview-products',
    'options' => ['class' => 'listview_products'],
    'itemOptions' => ['class' => 'item'],
    'dataProvider' => $dataProvider,
    'pager' => [
        'class' => InfiniteScrollPager::className(),
        'widgetId' => 'listview-products',
        'itemsCssClass' => 'listview_products',
        'pluginOptions' => [
            'contentSelector' => '.listview_products',
             'loading' => [
                'msgText' => "<em>Загрузка товаров...</em>",
                'finishedMsg' => "<em>Товаров больше нет!</em>",
            ],
        ],
    ],
    'itemView' => $itemView,
    'layout' => '<div class="row">{items}</div>{pager}',
])?>
Последний раз редактировалось unknownby 2020.01.16, 16:03, всего редактировалось 1 раз.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Сохранение значений

Сообщение yiiliveext »

Это оно и есть, это ж до листвью вызывается, поэтому prepare еще не сделан.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Сохранение значений

Сообщение unknownby »

yiiliveext писал(а): 2020.01.16, 16:03 Это оно и есть, это ж до листвью вызывается, поэтому prepare еще не сделан.
Или прям внутри листа сделать и без prepare()
P.S. без prepare() не получится видимо :D

Если никаких косяков не будет замечено, то залью на демо потом
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Сохранение значений

Сообщение unknownby »

yiiliveext писал(а): 2020.01.16, 16:03 Это оно и есть, это ж до листвью вызывается, поэтому prepare еще не сделан.
Если интересно, что вышло по итогу и как выглядит Демо категория на сайте
Убрал кнопку, чтоб не было видно её. Как при видимой, так и при состоянии "disabled". От кривых пальчиков юзеров :D
Кстати там можно в инициализации в loadPage поубирать многие вещи, они инициализируются в ListView. Но я пока не стал ничего убирать :D
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Сохранение значений

Сообщение yiiliveext »

unknownby писал(а): 2020.01.16, 21:30
yiiliveext писал(а): 2020.01.16, 16:03 Это оно и есть, это ж до листвью вызывается, поэтому prepare еще не сделан.
Кстати там можно в инициализации в loadPage поубирать многие вещи, они инициализируются в ListView.
Нельзя, если удаляете инстанс, то все теряется.
Но можно так

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

     function loadPage(url) {
         $.get(url, function(data) {
            $('.listview_products').html($('.listview_products', data).html());
            $('.listview_products').infinitescroll('bind');
            $('.listview_products').infinitescroll({
                state: {
                    isDestroyed: false,
                    isDone: false,
                    currPage: 1,
                },
                maxPage: $('.products', data).data('max_page'),
            }, function() {});
         });
     }
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Сохранение значений

Сообщение unknownby »

yiiliveext писал(а): 2020.01.17, 11:59 Нельзя, если удаляете инстанс, то все теряется.
Но можно так

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

     function loadPage(url) {
         $.get(url, function(data) {
            $('.listview_products').html($('.listview_products', data).html());
            $('.listview_products').infinitescroll('bind');
            $('.listview_products').infinitescroll({
                state: {
                    isDestroyed: false,
                    isDone: false,
                    currPage: 1,
                },
                maxPage: $('.products', data).data('max_page'),
            }, function() {});
         });
     }
Проверил, не корректно. Берет ссылку #listview-products ul.pagination li.next a:first с предыдущего и просто прокручиваясь показывает например 2 страницы и вторая страница загрузилась не правильная.
Лучше оставить как есть сейчас :D
Ошибся кстати, не из ListView настройки берутся если дестрой делать, а из корневого виджета. Да и указывать нужно ссылку на следующую страницу правильную.
В моем случае корректно отрабатывает следующий вариант (мало ли кому пригодится в похожей ситуации). Добавлены переводы.

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

function loadPage(url) {
        $.get(url, function(data) {
            $('.listview_products').html($('.listview_products', data).html());
            $('.listview_products').infinitescroll('destroy');
            $('.listview_products').data('infinitescroll', null);

            $('.listview_products').infinitescroll({
                'contentSelector': '.listview_products',
                'loading': {
                    'msgText': '<em>".\Yii::t('main', 'Loading products')."</em>',
                    'finishedMsg': '<em>".\Yii::t('main', 'No more products')."</em>',
                },
                'maxPage': $('.products', data).data('max_page'),
                'itemSelector': '.listview_products >',
                'navSelector': '#listview-products ul.pagination',
                'nextSelector': '#listview-products ul.pagination li.next a:first'
            },function () {});
        });
    }
Вот что по итогу в представлении с ListView (опять же для людей, кому пригодится)

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

<?php
use yii\widgets\ListView;
use nirvana\infinitescroll\InfiniteScrollPager;
$dataProvider->prepare();
?>
<div class="products" data-max_page="<?=$dataProvider->getPagination()->getPageCount()?>"></div>
<?= ListView::widget([
    'id' => 'listview-products',
    'options' => ['class' => 'listview_products'],
    'itemOptions' => ['class' => 'item'],
    'dataProvider' => $dataProvider,
    'pager' => [
        'class' => InfiniteScrollPager::className(),
        'widgetId' => 'listview-products',
        'itemsCssClass' => 'listview_products',
        'linkOptions' => [
            'class' => 'hidden',
        ],
        'disabledPageCssClass' => 'disabled hidden',
        'pluginOptions' => [
            'contentSelector' => '.listview_products',
             'loading' => [
                'msgText' => '<em>'.\Yii::t('main', 'Loading products').'</em>',
                'finishedMsg' => '<em>'.\Yii::t('main', 'No more products').'</em>',
            ],
        ],
    ],
    'itemView' => $itemView,
    'layout' => '<div class="row">{items}</div>{pager}',
])?>
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Сохранение значений

Сообщение yiiliveext »

unknownby писал(а): 2020.01.17, 13:19 Проверил, не корректно. Берет ссылку #listview-products ul.pagination li.next a:first с предыдущего и просто прокручиваясь показывает например 2 страницы и вторая страница загрузилась не правильная.
Да, с фильтрами не будет работать, там path старый остается, можно высчитывать и задавать, но я думаю, что не стоит заморачиваться.
Не удержался, чтобы не попробовать:)

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

    function loadPage(url) {
         $.get(url, function(data) {
            var path = url.indexOf('?') > -1 ? url+'&page=' : url+'?page='; 
            $('.listview_products').html($('.listview_products', data).html());
            $('.listview_products').infinitescroll('bind');
            $('.listview_products').infinitescroll({
                state: {
                    isDestroyed: false,
                    isDone: false,
                    currPage: 1,
                },
                path: [path, '&per-page=8'],
                maxPage: $('.products', data).data('max_page'),
            }, function() {});
         });
     }
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Сохранение значений

Сообщение unknownby »

yiiliveext писал(а): 2020.01.17, 14:04 Да, с фильтрами не будет работать, там path старый остается, можно высчитывать и задавать, но я думаю, что не стоит заморачиваться.
Не удержался, чтобы не попробовать:)
Так работает, но оставим прошлый результат :D
Тему оставлю открытой, мало ли еще вопросы будут в дальнейшем :)
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Сохранение значений

Сообщение yiiliveext »

unknownby писал(а): 2020.01.17, 14:30 Так работает, но оставим прошлый результат :D
Это вы, батенька, зря. Если дублирующийся код можно убрать, то его нужно убрать.
Естественно, что per-page нужно задавать не статически, а как-то так

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

 path: [path, '&per-page=' + $('.products', data).data('per_page'),
Ответить