• Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

    @EVOSandru6 Автор вопроса
    В моем случае action вообще не указан и все запросы идут на текущую страницу.
  • Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

    @EVOSandru6 Автор вопроса
    2. пункт решил правкой в компоненте:

    $items[$key] = $name['label']['asc'];
    $items['-' . $key] = $name['label']['desc'];


    на

    $items[$key] = $name['label'] . ' По возрастанию';
    $items['-' . $key] = $name['label'] . ' По Убыванию';


    В общем сортировка проходит только в таком варианте:

    <?php $form = ActiveForm::begin([
    //        'options' => ['data-pjax' => true ],
    //         'method' => 'post',
            'method' => 'get',
        ]); ?>


    Получается, что без перезагрузки страницы нельзя ее провести?

    Если я раскомменчиваю:

    'options' => ['data-pjax' => true ],

    Ничего не происходит.

    В соответствии от метода запроса не забываю менять в контроллере:

    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);


    На

    $dataProvider = $searchModel->search(Yii::$app->request->post());


    Мой быдловариант кстати работал как и Ваш, расчитанный на Get запрос. Но..

    В обоих вариантах происходит дублирование нескольких записей. Не могу понять, с чем это связано. Причем без DropDownSorter , соответственно без сортировки, данные фильтруются нормально и не дублируются.
  • Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

    @EVOSandru6 Автор вопроса
    Попробовал немного набыдлокодить в контроллере:

    if(Yii::$app->request->post('sort')) {
    
                $sort = Yii::$app->request->post('sort');
                switch($sort) {
                    case 'id': default:
                        $defaultOrder = [
                            'name' => SORT_ASC,
                        ];
                        break;
                    case '-id':
                        $defaultOrder = [
                            'name' => SORT_DESC,
                        ];
                        break;
                    case 'name':
                        $defaultOrder = [
                            'name' => SORT_ASC,
                        ];
                        break;
                    case '-name':
                        $defaultOrder = [
                            'name' => SORT_DESC,
                        ];
                        break;
                }
                $dataProvider->sort = [
                    'attributes' => [
                        'id',
                        'name'
                    ],
                    'defaultOrder' => $defaultOrder
                ];
                // My::printArr($_POST)
                // echo $sort;
                // $dataProvider->sort = Yii::$app->request->post('sort');
            }


    Сортировка проходит, но почемуто сами записи в dataProvider стали дублироваться( НЕ все, а некоторые.
  • Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

    @EVOSandru6 Автор вопроса
    Под switch/case я подразумеваю отдельные случаи конфигурации объекта $dataProvider->sort в контроллере
  • Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

    @EVOSandru6 Автор вопроса
    О как, передал провайдер, в селект наборе теперь все необходимые поля.

    1. $attributes каким образом передать в виджет?

    2. Что-то не так с кодировкой (код страницы), с чем может быть связано?:

    <select id="list_form_sort" class="js-dropdown-box" name="sort">
    <option value="id">�</option>
    <option value="-id">�</option>
    <option value="name">�</option>
    <option value="-name">�</option>
    </select>


    3. sort работает теперь только если убить PJAX и полностью перейти на метод GET. Возможно ли подружить переданный параметр sort с постом?

    В контроллере такая штука не прокатит:

    if(Yii::$app->request->post('sort'))
                $dataProvider->sort = Yii::$app->request->post('sort');


    Ибо слева ожидается объект, я ему передаю строку.
    Кроме как через switch/case можно реализовать?
  • Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

    @EVOSandru6 Автор вопроса
    Максим Федоров, Это через History API на js?

    Если я правильно понимаю, нужно перехватить данные через afterPjax

    Изначально не хотел методом гет фильтровать, ибо параметры в адресной строке наклыдывались друг на друга при каждй фильтрации. Что не очень красиво. Может есть вариант избежать дублирования без перебора. Буду искать.
  • Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

    @EVOSandru6 Автор вопроса
    Пра вопросов.

    1. В кой параметр виджета вставлять массив с данными:

    [
                'name' => 'name от а до я',
                '-name' =>  'от я до а',
                'id' => 'id по возрастанию',
                '-id' => 'id по убыванию'
            ]


    2. В Вашем примере ловлю :

    The "sort" property must be set.

    Возможно это связано с 1.
  • Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

    @EVOSandru6 Автор вопроса
    Стандартно класс не подцепился. поищу на гиттхабе.
  • Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

    @EVOSandru6 Автор вопроса
    В общей форме фильтрации пишу:

    <?= Html::dropDownList('sort', null, [
                'name' => 'name от а до я',
                '-name' =>  'от я до а',
                'id' => 'id по возрастанию',
                '-id' => 'id по убыванию'
            ], [
                'class'=>'form-control input-lg search-select',
                'title'=>'Please select a lunch ...',
            ]) ?>


    Если убиваю PJAX, то могу отловить, что пришло:

    Array
    (
        [_csrf] => OXRia3ZFU1pfMiYhFwkYbhQ6LVkFEx1ic0UQHBgzYgp.JSwhByAUPQ==
        [sort] => name
        [ProductsSearch] => Array
            (
                [range_price] => 5,50000
                [range_sale] => 5,100
                [category_id] => 
                [brand_id] => 
            )
    )


    Т.е. sort все же пришел. Но работает он только если в адресной строке его добавить в виде get параметра.

    Можно ли с постов его как то подуржить?

    Ибо при сортировке нужно сохранить фильтрацию.
  • Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

    @EVOSandru6 Автор вопроса
    Благодарю.

    А как должен выглядеть этот селект? С привязкой к $model поисковой формы или в виде Html:: независимого от формы поля.
  • Как в Yii2 выполнить сортировку для dataProvider из _search файла с ActiveForm?

    @EVOSandru6 Автор вопроса
    Благодарю,

    А как будет выглядеть этот селект? С привязкой к $model поисковой формы или в виде Html:: независимого от формы поля.

    Как вариант.

    Может я чего-то не понял, но в таком случае:

    1. Потеря фильтра
    2. Перезагрузка страницы

    Или этого можно избежать в данном контексте?
  • Как в Yii2 custom фильтр _search файла с помощью pjax, чтобы ListView и GridView обновлялись без перезагрузки страницы?

    @EVOSandru6 Автор вопроса
    Максим Тимофеев, Благодарю, Максим, забыл вот что:

    'options' => ['data-pjax' => true ],

    в форме указать
  • Как в Yii2 custom фильтр _search файла с помощью pjax, чтобы ListView и GridView обновлялись без перезагрузки страницы?

    @EVOSandru6 Автор вопроса
    Благодарю. Частично решил добавлением формы и ListView в единый pjax. При этом форма отправляется методом post. Страница обновляется быстро, ноперезагрузка все же есть.
  • Yii2 фильтры для товаров?

    @EVOSandru6
    EVOSandru6, OffersSearch

    class OffersSearch extends Offers
    {
        public $id;
        public $name;
    
        public $date_from_start;
        public $date_from_finish;
    
        public $date_to_start;
        public $date_to_finish;
    
        public $brand_id;
        public $place_id;
        public $category_id;
    
        public $range_price;
        public $range_sale;
    
        /*id
        exist*/
    
        public function rules()
        {
            return [
                [['id', 'brand_id', 'category_id', 'place_id'] ,'integer'],
                [['name'], 'string'],
                [[ 'date_from_start', 'date_from_finish', 'date_to_start', 'date_to_finish'], 'safe'],
            ];
        }
    
        public function scenarios()
        {
            // bypass scenarios() implementation in the parent class
            return Model::scenarios();
        }
    
        public function search($params)
        {
            $query = Offers::find();
    
            // add conditions that should always apply here
    
            $dataProvider = new ActiveDataProvider([
                'query' => $query,
            ]);
    
            $this->load($params);
    
            if (!$this->validate()) {
                // uncomment the following line if you do not want to return any records when validation fails
                // $query->where('0=1');
                return $dataProvider;
            }
    
            $query->andFilterWhere([
                'id' => $this->id,
                'brand_id' => $this->brand_id,
            ]);
    
            if($this->category_id) {
                $category = CategoryOffers::findOne($this->category_id);
                $query->andFilterWhere([
                    'category_id' => array_merge([$category->id], $category->children()->select('id')->column())
                ]);
            }
    
            if($this->place_id) {
                $place = Places::findOne($this->place_id);
                $query->andFilterWhere([
                    'place_id' => array_merge([$place->id], $place->children()->select('id')->column())
                ]);
            }
    
            if($this->range_price) {
                $range = explode(';', $this->range_price);
                $query->orFilterWhere([
                    'and',
                    ['>=','price',$range[0]],
                    ['<=','price',$range[1]]
                ]);
            }
    
            if($this->range_sale) {
                $range = explode(';', $this->range_sale);
                $query->orFilterWhere([
                    'and',
                    ['>=','price',$range[0]],
                    ['<=','price',$range[1]]
                ]);
            }
    
            $query
                ->andFilterWhere(['like', 'LOWER(name)', mb_strtolower($this->name)])
                ->andFilterWhere(['>=', 'date_from_stamp', $this->date_from_start ? strtotime($this->date_from_start . ' 00:00:00') : null])
                ->andFilterWhere(['<=', 'date_from_stamp', $this->date_from_finish ? strtotime($this->date_from_finish . ' 23:59:59') : null])
           ;
            return $dataProvider;
        }
    }


    Если поможещь c Pjax-ом комрад, буду очень благодарен.
    Может Максим Тимофеев прокомментирует мою проблему?
  • Yii2 фильтры для товаров?

    @EVOSandru6
    LucasP,

    Могу скинуть черновик и надеюсь на помощь в pjax.

    У меня есть виджет . который кушает критерию для dataProvider

    Суть виджета в том, что у него есть стандартный searchModel, а dataProvider выстраивается относительно критеориев, которые ему подкидываются, например - офферы как товары, или офферы как услуги, или офферы определенного поставщика.

    Подключаю так:

    <?=\app\widgets\offers\OffersWidget::widget([
        'conditions'=>$conditions,
    ])?>


    class OffersWidget extends Widget
    {
        public $conditions;
    
        public function run()
        {
            $searchModel = new OffersSearch();
            $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    
            if($conditions = $this->conditions)
            {
                foreach($conditions as $item) {
                    $dataProvider->query->andWhere($item);
                }
            }
            return $this->render('index', [
                'dataProvider' => $dataProvider,
                'searchModel' => $searchModel,
            ]);
        }
    
        public function init()
        {
            parent::init();
            $view = Yii::$app->getView();
            $this->registerAssets();
            // $view->registerJs($this->getJs());
            // $this->sourcePath = __DIR__ . "/assets";
        }
    
        public function registerAssets()
        {
             $view = $this->getView();
             OffersAssets::register($view);
        }
    }


    index.php в виджете

    <div class="page-container ptb-60">
        <div class="container">
            <div class="row row-rl-10 row-tb-20">
                <div class="page-sidebar col-md-4 col-xs-12">
                    <aside class="sidebar blog-sidebar">
                        <div class="row row-tb-10">
                            <div class="col-xs-12">
                                <div class="widget best-rated-deals panel pt-20 prl-20">
                                    <h3 class="widget-title h-title">
                                        <?=Yii::t('app','filter')?>
                                    </h3>
                                    <?=$this->render( '_search', [
                                        'model' => $searchModel
                                    ])?>
                                </div>
                            </div>
                        </div>
                    </aside>
                </div>
                <div class="page-content col-xs-12 col-md-8">
    
                    <section class="section deals-area">
    
                        <header class="page-control panel ptb-15 prl-20 pos-r mb-30">
    
                            <ul class="list-control-view list-inline">
                                <li>Варианты отображения:</li>
                                <li>
                                    <a href="<?=Url::current(['display'=>'list'])?>">
                                        <i class="fa fa-bars"></i></a>
                                </li>
                                <li>
                                    <a href="<?=Url::current(['display'=>'grid'])?>">
                                        <i class="fa fa-th"></i></a>
                                </li>
                            </ul>
                        </header>
    
                        <div class="row row-masnory row-tb-20">
                            <?
                            Pjax::begin([
                                'id' => 'notes',
                                'timeout' => false,
                                'enablePushState' => false,
                                // 'clientOptions' => ['method' => 'POST']
                            ]);?>
                              
                                <?/*=ListView::widget([
                                    'dataProvider' => $dataProvider,
                                    // 'entityName' => 'offers',
                                    'itemView' => '@app/modules/offers/views/frontend/default/_view',
                                    'itemOptions' => [
                                        'class' => 'col-sm-6 col-lg-4'
                                    ],
                                ]);*/?>
    
                             <?php Pjax::end() ?>
                        </div>
                    </section>
                </div>
            </div>
        </div>
    </div>


    _search.php в виджете:

    <div class="offers-search">
        <br/>
            <?php yii\widgets\Pjax::begin(['id' => 'search_note']) ?>
            <?php $form = ActiveForm::begin([
                'options' => ['data-pjax' => true ],
                'method' => 'post',
            ]); ?>
    
            <div class="mb-20 p-lg-10">
                <?=$form->field($model, 'range_price')->widget(Slider::classname(),[
                    'name' => 'range_price', // slider
                    'sliderColor' => Slider::TYPE_GREY,
                    'handleColor' => Slider::TYPE_DANGER,
                    'pluginOptions' => [
                        'orientation' => 'horizontal',
                        'handle' => 'round',
                        'min' => 0,
                        'max' => 10000,
                        'step' => 500,
                        'range' => true,
                        'tooltip'=>'always'
                    ],
                ])->label(false);?>
            </div>
    
            <div class="mb-20 p-lg-10">
                <?=$form->field($model, 'range_sale')->widget(Slider::classname(),[
                    'name' => 'range_sale', // slider
                    'sliderColor' => Slider::TYPE_GREY,
                    'handleColor' => Slider::TYPE_DANGER,
                    'pluginOptions' => [
                        'orientation' => 'horizontal',
                        'handle' => 'round',
                        //'handle'=>'triangle',
                        'min' => 0,
                        'max' => 100,
                        'step' => 5,
                        'range' => true,
                        'tooltip' => 'always',
                        'precision' => 2,
                    ],
                ])->label(false);
                ?>
            </div>
    
            <label for=""><?=Yii::t('app','place')?></label>
            <?=AutoCompleteWidget::widget([
                'entity' => 'place',
                'action' => Url::to(['/places/default/autocomplete']),
                'className' => '@app/modules/places/models/Places',
                'attribute'=>'place_id',
                'model'=>$model,
                'form'=>$form,
            ])?>
    
            <?= $form->field($model, 'category_id')->dropDownList(CategoryOffers::getArrayList(), [
                'prompt' => '--'.Yii::t('app','change').'--'
            ]) ?>
    
            <?= $form->field($model, 'brand_id')->dropDownList(Brands::getArrayList(), [
                'prompt' => '--'.Yii::t('app','change').'--'
            ]) ?>
    
            <div class="form-group">
                <?= Html::submitButton(Yii::t('app', Yii::t('app','search')), ['class' => 'btn btn-primary']) ?>
                <?= Html::resetButton(Yii::t('app', Yii::t('app','reset')), ['class' => 'btn btn-default']) ?>
            </div>
    
            <?php ActiveForm::end(); ?>
    
           <?phpyii\widgets\Pjax::end() ?>
    </div>


    Такая конструкиця к сожалению работает только, если поменять в _search.php

    'method' => 'post',

    на:

    'method' => 'get',

    Т.е. происходит перезагрузка страницы после этого изменения.

    Пробовал расшарить Javascript:

    $("#search_note").on("pjax:end", function() {
            $.pjax.reload({
                container:"#notes"
            }); 
        });


    Но это к сожалению работает только если именно загружать данные с формы как CREATE - как описано тут: https://www.google.kz/url?sa=t&rct=j&q=&esrc=s&sou...
  • Yii2 фильтры для товаров?

    @EVOSandru6
    Через контроллер. Почти запилил данную, но не получается pjax-ить. Гетом все норм работает, но страница перезагружается.
  • Как в Yii2 получить в dataProvider все товары всех заказов одним списком?

    @EVOSandru6 Автор вопроса
    EVOSandru6, Прочитал документацию, разобрался. Подскажите пожалуйста - куда копать, чтобы для такого провайдера делать searchModel, если я хочу через форму _search файла менять filterWhere (deafault) и orderBy?

    Я так понимаю, что мой стандартный из печки gii CouponSearch не подойдет.
  • Как в Yii2 получить в dataProvider все товары всех заказов одним списком?

    @EVOSandru6 Автор вопроса
    Благодарю!

    Сработало.

    Поулчается - что в

    return $query->where(['user.id'=>$user_id]);

    user - это таблица? Ибо заработало, когда я прописал сюда именно имя таблицы.

    Еще пожалуйста можете пояснить - каким образом анонимная функция с $query - связана с 'order.user' в joinWith Если я правильно понял - это условие связи - ON