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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
unknownby
Сообщения: 256
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

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

Сообщение unknownby » 2020.01.06, 13:35

Есть фильтры при нажатии на которые срабатывает ajax с POST. А так же есть изменение шаблона вывода для ListView через ajax, тоже передаются данные через POST.

Вопрос вот в чем. Как можно сохранить данные, которые были переданы через фильтры? Если с шаблоном я сделал сохранение в сессию, то с фильтрами так не сработает, т.к. нужно в search передать post(), а если меняется шаблон, то POST со значениями из фильтра теряются.
Может можно как-то записать в сессию значения фильтров и потом из сессии передать их в POST? Пробовал через setBodyParams
Контроллер

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

public function actionProducts($url)
    {
        $model = $this->findModelCategory($url);
        $searchModel = new ProductsSearch;
        $settings = Settings::findOne(Settings::SETTING_DEFAULT);
        $session = Yii::$app->session;
        $session->remove('options');
        $itemView = ($session->has('itemViews')) ? $session->get('itemViews') : '_product_item';

        if(\YIi::$app->request->isAjax){
            \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

//            if(\Yii::$app->getRequest()->post()['ProductsSearch']['options']){
//                $session['options'] = [
//                'options' => \Yii::$app->getRequest()->post()['ProductsSearch']['options'],
//            ];
//                $session->set('options', \Yii::$app->getRequest()->post()['ProductsSearch']['options']);
//            }
//            if($session->has('options')){
//                \Yii::$app->getRequest()->setBodyParams(['ProductsSearch' => [$session->get('options')]]);
//            }

            if(\Yii::$app->getRequest()->post('itemViews')){
                $session->set('itemViews', \Yii::$app->getRequest()->post('itemViews'));
            }
            $itemView = ($session->has('itemViews')) ? $session->get('itemViews') : '_product_item';

            $dataProvider = $searchModel->search(\Yii::$app->getRequest()->post(), $model->productscategory_id);

            return $this->renderAjax('_listview_products', [
                'dataProvider' => $dataProvider,
                'itemView' => $itemView,
            ]);
        }

        $dataProvider = $searchModel->search(\Yii::$app->getRequest()->post(), $model->productscategory_id);

        return $this->render('products', [
            'model' => $model,
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
            'settings' => $settings,
            'itemView' => $itemView,
	]);
    }

dmg
Сообщения: 677
Зарегистрирован: 2012.10.15, 03:09

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

Сообщение dmg » 2020.01.06, 14:07

Если у вас есть значения фильтров в сессии, то почему бы их не передать в метод search, вместо post() ?

unknownby
Сообщения: 256
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

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

Сообщение unknownby » 2020.01.06, 14:20

dmg писал(а):
2020.01.06, 14:07
Если у вас есть значения фильтров в сессии, то почему бы их не передать в метод search, вместо post() ?
Над этим думал уже, может еще какие-нибудь варианты есть?

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2020.01.06, 14:50

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

$.ajax({
  type: "POST",
  url: url,
  data: $('#form1, #form2').serialize()+"&itemView="+itemView,
  success: function(data)
     {
          console.log(data); 
     } 
});

unknownby
Сообщения: 256
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

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

Сообщение unknownby » 2020.01.06, 17:00

yiiliveext писал(а):
2020.01.06, 14:50

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

$.ajax({
  type: "POST",
  url: url,
  data: $('#form1, #form2').serialize()+"&itemView="+itemView,
  success: function(data)
     {
          console.log(data); 
     } 
});
У меня два ajax-а написаны в разных местах. Для фильтров написан в фильтрах, а для смены itemView в файле с отображением ListView.

Фильтров может не быть, т.к. в админке можно их выключить.
Вот фильтров

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

$js = "
    var checkboxes = [];
    $('input[type=checkbox]').on('click', function(){
        var selection = $(this).val();
        var id = $(this)[0].id;
        var check = $(this)[0].checked;
        var value = id.split('-');
        if(check){
            checkboxes.push(selection + '-' + value[2]);
        } else {
            checkboxes.splice(checkboxes.indexOf(selection + '-' + value[2]), 1);
        }

        $.ajax({
            type: 'POST',
            url: '".$productscategory_url."',
            data: '".$searchModelName."[options]=' + checkboxes,
            success: function(result){
                $('#lestview-products').html(result);
            },
        });
    });";
Вот для смены

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

$js = "
    $('#th-list').on('click', function(){
        $.ajax({
            type: 'POST',
            url: '".$productscategory_url."',
            data: { itemViews: '_product_item'},
            success: function(result){
                $('#lestview-products').html(result);
            },
        });
    });
    $('#th').on('click', function(){
        $.ajax({
            type: 'POST',
            url: '".$productscategory_url."',
            data: { itemViews: '_product_item_th'},
            success: function(result){
                $('#lestview-products').html(result);
            },
        });
    });
    
";

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2020.01.06, 17:15

И что вам мешает сделать общую функцию отправки запроса, которая будет собирать POST data из отмеченных фильтров (если они есть) и вида отображения?
Пы.Сы. Зачем вы дублируете код при смене представления? Повесьте обработчик на класс, например, item-view-select, и добавьте в элемент атрибут data-view_name, в котором храните наименование представления (data-view_name="_product_item" или data-view_name="_product_item_th"), отправляйте передавая $(this).data('view_name')
Пы.Сы.Сы. Раз уж используете jQuery, то используйте его на полную.
Вот это

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

var selection = $(this).val();
var id = $(this)[0].id;
var check = $(this)[0].checked;
var value = id.split('-');
    if(check){
        checkboxes.push(selection + '-' + value[2]);
    } else {
        checkboxes.splice(checkboxes.indexOf(selection + '-' + value[2]), 1);
    }
можно переписать так

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

var selection = $(this).val();
var value = selection + '-' + $(this).attr('id').split('-').pop();
    if($(this).prop('checked')){
        checkboxes.push(value);
    } else {
        checkboxes.splice($.inArray(value, checkboxes), 1);
    }
Так гораздо понятнее и симпатичнее, правда? ;)

unknownby
Сообщения: 256
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

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

Сообщение unknownby » 2020.01.06, 20:01

yiiliveext писал(а):
2020.01.06, 17:15
Пы.Сы. Зачем вы дублируете код при смене представления? Повесьте обработчик на класс, например, item-view-select, и добавьте в элемент атрибут data-view_name, в котором храните наименование представления (data-view_name="_product_item" или data-view_name="_product_item_th"), отправляйте передавая $(this).data('view_name')
Переписал, так получше. Чтоб один обработчик был, вместо двух как было раньше.

Код не дублировался при смене представления. Этот код находится на одном уровне с ListView. В представлениях только код, для отображения информации о товаре.

Переписывать код "красивее" пока что нет смысла, там своя "уникальная" :D система определения и записывания информации в массив данных, который должен быть передан в search.
yiiliveext писал(а):
2020.01.06, 17:15
И что вам мешает сделать общую функцию отправки запроса, которая будет собирать POST data из отмеченных фильтров (если они есть) и вида отображения?
Тут мешает то, что AJAX, который отправляет данные на сервер по фильтрам находится в файле с фильтрами (чтобы при отсутствии фильтров не было ничего связанного с ними), а AJAX, который отправляет тип представления находится в файле, в который вынесен ListView.

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2020.01.06, 20:57

unknownby писал(а):
2020.01.06, 20:01
Переписывать код "красивее" пока что нет смысла, там своя "уникальная" :D система определения и записывания информации в массив данных, который должен быть передан в search.
Тот код, что красивее, делает абсолютно то же что и ваш, но лучше читается. Это при условии, что ваши чекбоксы выглядят как-то так (как я понимаю из кода)

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

<input type="checkbox" id="my-filter-2" value="13" >
<input type="checkbox" id="my-filter-4" value="14" >
<input type="checkbox" id="my-filter-6" value="16" >
Тут мешает то, что AJAX, который отправляет данные на сервер по фильтрам находится в файле с фильтрами (чтобы при отсутствии фильтров не было ничего связанного с ними), а AJAX, который отправляет тип представления находится в файле, в который вынесен ListView.
Не мешает, делаете функцию в основном файле представления, которая проверяет checkboxes и itemView на !== undefined и отправляет смерженные данные на бекенд.

unknownby
Сообщения: 256
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

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

Сообщение unknownby » 2020.01.06, 21:21

yiiliveext писал(а):
2020.01.06, 20:57
Тот код, что красивее, делает абсолютно то же что и ваш, но лучше читается. Это при условии, что ваши чекбоксы выглядят как-то так (как я понимаю из кода)
Чекбоксы выглядят совсем по другому. У меня реализован checkboxList. И сколько фильтров, столько таких списков.
Там можно было бы уменьшить его, но пока работает не стоит трогать, если всё заработает вместе, можно и сократить немного код :D
yiiliveext писал(а):
2020.01.06, 20:57
Не мешает, делаете функцию в основном файле представления, которая проверяет checkboxes и itemView на !== undefined и отправляет смерженные данные на бекенд.
У меня есть представление products, внутри него отображаются представления "_specifications" и "_listview_products". Первое фильтры, второе ListView.
При AJAX-е у меня обновляется только "_listview_products"

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

return $this->renderAjax('_listview_products', [
                'dataProvider' => $dataProvider,
                'itemView' => $itemView,
            ]);
Если я выношу к примеру AJAX в представление products, то после одного изменения шаблона представления не работает AJAX больше.

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

<?php
$js = "
    $('.item-view-select > span').on('click', function(){
        $.ajax({
            type: 'POST',
            url: '".$productscategory_url."',
            data: { itemViews: $(this).data('view_name')},
            success: function(result){
                $('#lestview-products').html(result);
            },
        });
    });
";

$this->registerJs($js);
?>
P. S. Как вариант сделать общую отправку в представлении _listview_products

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2020.01.06, 21:48

unknownby писал(а):
2020.01.06, 21:21

Чекбоксы выглядят совсем по другому. У меня реализован checkboxList. И сколько фильтров, столько таких списков.
Там можно было бы уменьшить его, но пока работает не стоит трогать, если всё заработает вместе, можно и сократить немного код :D
Не суть. Суть в том, что последняя цифра после "-" в айди чекбокса - это айди фильтра, с которого и формируется массив checkboxes.
У меня есть представление products, внутри него отображаются представления "_specifications" и "_listview_products". Первое фильтры, второе ListView.
При AJAX-е у меня обновляется только "_listview_products"
Потому что элемент с классом "item-view-select" должен быть в представлении products (или отдельном представлении _items-view-selector), а не _listview_products.

unknownby
Сообщения: 256
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

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

Сообщение unknownby » 2020.01.07, 13:42

yiiliveext писал(а):
2020.01.06, 21:48
Не суть. Суть в том, что последняя цифра после "-" в айди чекбокса - это айди фильтра, с которого и формируется массив checkboxes.
Формирование специфическое этого value

Переделал вот так контроллер и всё работает отлично :D
Дописал комментарии, чтоб понятно было. Может будут предложения по улучшению? ;)

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

public function actionProducts($url)
    {
        $model = $this->findModelCategory($url);
        $searchModel = new ProductsSearch;
        $settings = Settings::findOne(Settings::SETTING_DEFAULT);
        $session = Yii::$app->session;
        $itemView = ($session->has('itemViews')) ? $session->get('itemViews') : '_product_item';

        if(\YIi::$app->request->isAjax){
            \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
//Тут определение переменной для смены представления
            if(\Yii::$app->getRequest()->post('itemViews')){
                $session->set('itemViews', \Yii::$app->getRequest()->post('itemViews'));
            }
            $itemView = ($session->has('itemViews')) ? $session->get('itemViews') : '_product_item';
//Установка в сессию массива options
            if(\Yii::$app->getRequest()->post()['ProductsSearch']['options'] && empty(\Yii::$app->getRequest()->post('itemViews'))){
                $session['options'] = ['options' => \Yii::$app->getRequest()->post()['ProductsSearch']['options'], ];
            }
//Вот тут творится магия  :D 
            if($session->has('options')){
            //Если было установление значений в сессию, тогда нужно установить в setBodyParams значения, которые есть в getBodyParams + новые значения для post(), которые указаны были в сессии с параметром options
                Yii::$app->request->setBodyParams(array_merge(Yii::$app->request->getBodyParams(), ['ProductsSearch' => $session->get('options')]));
            }
            $dataProvider = $searchModel->search(\Yii::$app->getRequest()->post(), $model->productscategory_id);

            return $this->renderAjax('_listview_products', [
                'dataProvider' => $dataProvider,
                'itemView' => $itemView,
            ]);
        }
//Удаление значения из options если вдруг перешли на другую категорию или обновили эту же категорию.
        $session->remove('options');
        $dataProvider = $searchModel->search(\Yii::$app->getRequest()->post(), $model->productscategory_id);

        return $this->render('products', [
            'model' => $model,
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
            'settings' => $settings,
            'itemView' => $itemView,
	]);
    }
Подсказку нашел кстати на форуме Как перезагрузить Yii::$app->requests->post()

Фильтры выглядят вот так http://prntscr.com/qkcjsn
И вот как выглядит формирование checkbox-ов https://prnt.sc/qkckhh
Подчеркнул айдишку, которую я забираю в value[2] :D . Это идентификатор фильтра (вес, мощность и т.п.)

В модели поиска

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

if(!empty($this->options)){
            $options = self::parseOptions($this->options);
            foreach($options as $key => $value){
                $query->joinWith(['productsOptions' => function($query) use ($key, $value){
                    $query->andWhere(['in', ProductOptions::TABLE_ALIAS . $key . '.productsoptionvalue_id', $value])
                        ->alias(ProductOptions::TABLE_ALIAS . $key)
                    ;
                }], false, 'LEFT JOIN');
            }
        }
Ну и приватный метод в модели поиска

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

private function parseOptions($options){
        $arr = explode(",",$options);
        $array = [];
        foreach($arr as $value){
            $arr2 = explode("-",$value);
            $array[$arr2[1]][] = $arr2[0];
        }

        return $array;
    }
Расписал чуть подробней, может кому пригодится хоть что-то из всего этого :D

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2020.01.07, 15:57

unknownby писал(а):
2020.01.07, 13:42
yiiliveext писал(а):
2020.01.06, 21:48
Не суть. Суть в том, что последняя цифра после "-" в айди чекбокса - это айди фильтра, с которого и формируется массив checkboxes.
Переделал вот так контроллер и всё работает отлично :D
Дописал комментарии, чтоб понятно было. Может будут предложения по улучшению? ;)
Это костыль. Но раз не хотите делать правильно, то имеете полное право:)

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2020.01.08, 10:13

Вообще передача фильтров и вида отображения POST-ом - само по себе плохая идея. Но раз вы уж этого хотите, как и хотите хранить состояние на сервере, то делайте это хотя бы не таким изуверским способом.

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

public function actionProducts($url)
    {
        $model = $this->findModelCategory($url);
        $searchModel = new ProductsSearch;
        $settings = Settings::findOne(Settings::SETTING_DEFAULT);
        $session = Yii::$app->session;
        $pageState = $session->has('pageState') ? $session->get('pageState') : ['itemViews' => '_product_item'];

        if(\Yii::$app->request->isAjax){
            \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            $pageState = array_merge($pageState, \Yii::$app->getRequest()->post());
            $session->set('pageState', $pageState);
            $dataProvider = $searchModel->search($pageState, $model->productscategory_id);

            return $this->renderAjax('_listview_products', [
                'dataProvider' => $dataProvider,
                'itemView' => $pageState['itemViews'],
            ]);
        }
        
        $session->set('pageState', ['itemViews' => $pageState['itemViews']]);
        $dataProvider = $searchModel->search(\Yii::$app->getRequest()->post(), $model->productscategory_id);

        return $this->render('products', [
            'model' => $model,
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
            'settings' => $settings,
            'itemView' => $pageState['itemViews'],
	]);
    }
    

unknownby
Сообщения: 256
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

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

Сообщение unknownby » 2020.01.08, 11:42

yiiliveext писал(а):
2020.01.08, 10:13
Вообще передача фильтров и вида отображения POST-ом - само по себе плохая идея. Но раз вы уж этого хотите, как и хотите хранить состояние на сервере, то делайте это хотя бы не таким изуверским способом.
Я сегодня утром подумал, что если два представления работают (если фильтры отображаются), то тогда переменная checkboxes должна присутствовать, а значит я могу её передавать как раньше вы и говорили, передавать сразу две переменные в ajax (чекбоксы и имя представления). Вечером смогу проверить. Но нужно условие, что если она не определена, тогда передавать только смену представления.

Представление (имя представления для ListView) само по себе не передается в search(), оно передается параметром в render-е. В post-е оно не надо. Поэтому если пользователь сменил представление и перешел на другую категорию, я забираю значение из сессии, чтобы был сразу привычный ему интерфейс. В контроллере проверка на наличие переменной в сессии, но вначале проверка на отправку переменной в post-е, т.е. если сработал

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

if(\YIi::$app->request->isAjax)
И если в post-е есть itemViews, тогда устанавливаю новое значение в сессию и потом сразу забираю его в переменную $itemView иначе по-умолчанию значение _product_item

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

if(\Yii::$app->getRequest()->post('itemViews')){
	$session->set('itemViews', \Yii::$app->getRequest()->post('itemViews'));
}
$itemView = ($session->has('itemViews')) ? $session->get('itemViews') : '_product_item';
А это писалось действительно как костыль, чтобы забрать старые значения и передать их всё же в post. И надо заменить это.

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

if(\Yii::$app->getRequest()->post()['ProductsSearch']['options'] && empty(\Yii::$app->getRequest()->post('itemViews'))){
	$session['options'] = ['options' => \Yii::$app->getRequest()->post()['ProductsSearch']['options'], ];
}
if($session->has('options')){
	Yii::$app->request->setBodyParams(array_merge(Yii::$app->request->getBodyParams(), ['ProductsSearch' => $session->get('options')]));
}
У меня раньше в разработке были фильтры, которые отображались всё время (есть вариант, что и их включить придется).
Пример полей: Категория, метка , имя товара, цена, сортировка .
Там был get, но если переделать на post и тоже ajax-ом передавать, то останется только ajax написать, в котором тоже будет проверка на наличие переменной checkboxes

Сейчас я в правильном направлении двигаюсь? :D

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2020.01.08, 12:27

unknownby писал(а):
2020.01.08, 11:42
Сейчас я в правильном направлении двигаюсь? :D
Можно просто взять и заменить ваш метод на предложенный мной. И убедиться, что все работает так же, как и прежде.
Но код стал короче и корректнее.

Минус POST-а в данном случае в том, что не сохраняется история, плюс будут проблемы с пагинацией отфильтрованных результатов, как и с любыми другими GET-запросами с сохранением состояния. Обойти это, конечно, можно, но это ненужная лишняя работа.
Лучшее решение отправлять ajax-запросы GET-ом и делать push state, чтобы при перезагрузке страницы она оказалась в том же состоянии.

unknownby
Сообщения: 256
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

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

Сообщение unknownby » 2020.01.08, 12:47

yiiliveext писал(а):
2020.01.08, 12:27
Минус POST-а в данном случае в том, что не сохраняется история, плюс будут проблемы с пагинацией отфильтрованных результатов, как и с любыми другими GET-запросами с сохранением состояния. Обойти это, конечно, можно, но это ненужная лишняя работа.
Лучшее решение отправлять ajax-запросы GET-ом и делать push state, чтобы при перезагрузке страницы она оказалась в том же состоянии.
Тут кстати вопрос решать буду бесконечной подгрузкой товаров по ajax. Чтоб не было проблем с пагинацией. Присматриваюсь к этому сейчас InfiniteScrollPager
Не очень люблю GET-запросы, пока что буду с POST работать. И если убрать костыль, то пока что мысленно должно работать, но как проверю уже скажу точно :D
yiiliveext писал(а):
2020.01.08, 12:27
Можно просто взять и заменить ваш метод на предложенный мной. И убедиться, что все работает так же, как и прежде.
Но код стал короче и корректнее.
Будет работать корректно, если убрать костыль и передавать checkboxes POST-ом при смене представления.
В том и прикол был, что при смене представления у меня в POST-е не было options. Я их записывал в сессию, если в POST приходили options, а если не было, то сессия НЕ перезаписывалась. Однако если перейти на другую категорию, то значение options из сессии удалялось, чтоб не было отображения по ранее выбранным фильтрам.
Вечером протестирую. Покажу что вышло, если всё пойдет по плану ;)

unknownby
Сообщения: 256
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

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

Сообщение unknownby » 2020.01.08, 22:58

yiiliveext писал(а):
2020.01.08, 12:27
Можно просто взять и заменить ваш метод на предложенный мной. И убедиться, что все работает так же, как и прежде.
Но код стал короче и корректнее.
Как вот это можно сделать корректней и красивей, но не трогая пока chekboxes? :)
Вообще работает хорошо, но ведь два ajax-а как-то не правильно. Буду выводить в отдельную функцию и передавать параметры в неё, но проверки нужно додумать. Красивые проверки не приходят на ум пока что. Оставил два раза переменную $js, т.к. думаю что можно скрывать её, если фильтров нет. При хороших проверках.

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

$js = "
    var checkboxes = [];
    $('input[type=checkbox]').on('click', function(){
        var selection = $(this).val();
        var id = $(this)[0].id;
        var check = $(this)[0].checked;
        var value = id.split('-');
        if(check){
            checkboxes.push(selection + '-' + value[2]);
        } else {
            checkboxes.splice(checkboxes.indexOf(selection + '-' + value[2]), 1);
        }

        $.ajax({
            type: 'POST',
            url: '".$model->productscategory_url."',
            data: '".$searchModelName."[options]=' + checkboxes,
            success: function(result){
                $('#lestview-products').html(result);
            },
        });
    });";
$js .= "
    $('.item-view-select > span').on('click', function(){
        $.ajax({
            type: 'POST',
            url: '".$model->productscategory_url."',
            data: '".$searchModelName."[options]=' + checkboxes + '&itemViews=' + $(this).data('view_name'),
            success: function(result){
                $('#lestview-products').html(result);
            },
        });
    });
";

Можно ли как-то в js написать такую конструкцию? Т.к. в функцию будет приходить checkboxes и view_name, то логичней будет сделать на смену представления проверку. И тогда можно оставить весь js код на странице.

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

($(this).data('view_name') != '') ? '".$searchModelName."[options]=' + checkboxes + '&itemViews=' + $(this).data('view_name') : '".$searchModelName."[options]=' + checkboxes 
Переделал по совету, вынес всё в один файл, а так же смену представления убрал из ListView. Не знаю почему я его туда засунул вообще :D
В контроллере убран костыль с пересохранение в сессию и обратно в POST. Там просто осталось сохранение значения itemViews в сессию :)

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2020.01.09, 09:36

Я так понимаю, что все получилось.
Тогда осталось только переделать на GET.
Но подождем, пока вы пагинацию или инфинит-скролл подключите и сами до этого дойдете :)

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

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

Сообщение yiiliveext » 2020.01.09, 09:42

unknownby писал(а):
2020.01.08, 22:58
Переделал по совету, вынес всё в один файл
Все не надо было, только функционал перезагрузки ajax-ом.

unknownby
Сообщения: 256
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

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

Сообщение unknownby » 2020.01.09, 09:52

yiiliveext писал(а):
2020.01.09, 09:42
Все не надо было, только функционал перезагрузки ajax-ом.
Ну я не удалял, просто убрал рендер файла, сам файл оставил. Сделаю потом снова рендер файла, а JS будет в основном представлении.
Добавлю функцию, чтоб убрать дублирование кода и приделаю подгрузку товаров по инфинит-скролл :D
Тут иногда помогает писать, пока пишешь вопрос уже сам доходишь до ответа и просто не публикуется тема :lol:

Ответить