Yii2 PHP Как исправить формирование url из-за фильтров в searchController?

В общем, имеется view в которой есть listView и activeForm, все обернуто в pjax, при попытке ввести новый фильтр ( к примеру "От 1000 до 10000" route в url строится как /site/catalog?start_retail[]=1000&end_retail[]=10000. Сейчас все верно, но когда я хочу ввести другой диапазон чисел, у меня получается что get параметры не заменяются, а генерируются /site/catalog?start_retail[]=1000&end_retail[]=10000&start_retail[]=99999&end_retail[]=999999

CatalogController
public function actionGet()
    {
        $model = $this->modelFindBySlug($this->slug);

        $searchModel = new ProductCatalogSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams,$model->id);

        $brands = $model->brands;
        $weights = $model->weights;


        $test['start'] = Yii::$app->request->get('ProductCatalogSearch')['start_retail_price'];
        $test['end'] = Yii::$app->request->get('ProductCatalogSearch')['end_retail_price'];

        if($test['start']){
            $defaultPrice['min'] = $test['start'];
        }else{
            $defaultPrice['min'] = $model->minPrice;
        }

        if($test['end']){
            $defaultPrice['max'] = $test['end'];
        }else{
            $defaultPrice['max'] = $model->maxPrice;
        }

        $defaultPrice['max'] = $model->maxPrice;

        return $this->render('get',[
            'model' => $model,
            'dataProvider' => $dataProvider,
            'search' => $searchModel,
            'brands' => $brands,
            'weights' => $weights,
            'defaultPrice' => $defaultPrice
        ]);
    }


View Get.php
<?php

use yii\widgets\ListView;
use yii\widgets\Pjax;

$this->title = 'Каталог';
Yii::$app->view->params['page'] = 'list';

?>
<?php Pjax::begin(['id' => 'catalogPjax','options' => ['class'=> 'pjaxContainer','timeout' => 2000, 'enableReplaceState' => true, 'clientOptions' => ['method' => 'GET']]])?>
    <div class="col-lg-3">
        <div class="filter">
            <?= Yii::$app->controller->renderPartial('filters/_filter',['model' => $search,'brands' => $brands, 'weights' => $weights,'defaultPrice' => $defaultPrice]) ?>
        </div>
    </div>
    <div class="col-lg-9">
        <div class="filter-panel clearfix">
            <h1><?= $model->name ?></h1>
        </div>
        <ul class="list-items row">
                <?php echo ListView::widget([
                    'dataProvider' => $dataProvider,
                    'itemView' => '_item',
                ]); ?>
        </ul>
    </div>
<?php Pjax::end();?>


Particle _filter.php
<?php

use common\helpers\Formatter;
use yii\bootstrap\Html;
use yii\helpers\ArrayHelper;
use yii\widgets\ActiveForm;

$autolick = <<<JS
    $('.filter_input').change(function() {
        $('#filterButton').click();
    });
JS;

$this->registerJs($autolick);

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

<button data-pjax=0 id="filterButton" class="hidden"></button>

<h3>Производитель</h3>

<ul>
    <?= $form->field($model, 'brand_id')->checkboxList(ArrayHelper::map($brands, 'id', 'name'), [
        'itemOptions' => ['class' => 'filter_input'],
    ])->label(false) ?>
</ul>

<h3>Цена <span> (тг) </span></h3>

<hr>
<span>От:</span>
<?= $form->field($model, 'start_retail_price')->textInput(['class' => 'filter_input', 'value' => $defaultPrice['min']])->label(false) ?>
<span>По:</span>
<?= $form->field($model, 'end_retail_price')->textInput(['class' => 'filter_input', 'value' => $defaultPrice['max']])->label(false) ?>
<hr>

<?php if ($weights) : ?>

    <h3>Вес упаковки</h3>
    <ul>
        <?= $form->field($model, 'weight_net')->checkboxList(ArrayHelper::map($weights, 'weight_net', 'weight_net'), [
            'item' => function ($index, $label, $name, $checked, $value) {
                return Html::checkbox($name, $checked, ['label' => Formatter::asWeight($label), 'id' => $index, 'value' => $value, 'class' => 'filter_input']);
            }
        ])->label(false) ?>
    </ul>

<?php endif; ?>

<?php ActiveForm::end(); ?>


Теперь вопрос, как в ActiveForm обозначить, что атрибут не может быть массивом, и заменялся при изменении данных в нем?
  • Вопрос задан
  • 386 просмотров
Пригласить эксперта
Ответы на вопрос 2
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Где-то лидирующего слеша не хватает, вероятно в экшене формы.
action="some-controller/some-action" - ведет на текущийUrl/some-controller/some-action
action="/some-controller/some-action" - ведет на домен/some-controller/some-action
yii тут не при чем, как и php
Ответ написан
@cheshirko
понимаю что вопрос старый, но отпишу, вдруг кому пригодится:

проблема решается добавлением в поля эктив форм атрибута name, тогда он перестает отображать массивом
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы