Фильтрация yii2 выдает ошибку Call to a member function isAttributeRequired() on null

547
17 сентября 2017, 01:54

Пытаюсь сделать фильтрацию на yii2. Есть поле формы в ней 3 input(type="radio") , каждый инпут должен искать товары с ценой в данном диапазоне. Вот код контроллера где выполняется поиск :

public function actionFilter()
        {
            $filter = trim(Yii::$app->request->get('filter'));
            $this->setMeta('MAC-SHOPPER | ' . $filter);
            if (!$filter) {
                return $this->render('filter');
            }
/*
            if ($filter <= 15) {
            $query = Product::find()->where(['<=', 'price', 15]);
            }*/
            $model = new Product();
            if($Button1) {
                $query = Product::find()->where(['between', 'price', "0", "50" ])->all();
            }
            //Создаем объект класса Pagination
            //Передаем тотал каунт - общее количество записей, которыe мы вытащим
            $pages = new Pagination(['totalCount' => $query->count(), 'pageSize' => 2, 'forcePageParam' => false, 'pageSizeParam' => false]);
            //Выполняем сам запрос
            //offset - с какой записи начинать
            //limit - количество записей
            $products = $query->offset($pages->offset)->limit($pages->limit)->all();
            return $this->render('filter', compact('products', 'pages', 'filter', 'model'));
        }

Код модели товаров :

<?php
    namespace app\models;
    use yii\db\ActiveRecord;
    //класс для таблицы категории
    class Product extends ActiveRecord
    {
        public $Button1;
        public $Button2;
        public $Button3;
        public $radioButtonList;

        //Поведение для картинок
             public function behaviors()
        {
            return [
                'image' => [
                    'class' => 'rico\yii2images\behaviors\ImageBehave',
                ]
            ];
        }


        public static function tableName()
        {
            return 'product';
        }
        public function getCategory()
        {
            //Связь таблиц, один продукт может иметь одну категорию (hasOne()) 
            return $this->hasOne(Category::className(), ['id' => 'category_id']);
        }

    }
?>

И код самой формы :

<?php $form = ActiveForm::begin([
                                'id' => 'task-form',
                                'action' => \yii\helpers\Url::to(['category/filter']),
                                ]  
                                )?>


                         <?= $form->field($model, 'radioButtonList')
                                ->radioList([
                                    'Button1' => 'от 0-1500',     
                                    'Button2' => 'от 3000-5000',
                                    'Button3' => 'от 5000-20000'
                                ],[
                                    'id' => 'radio_button',
                                ]); ?>
                            <?= Html::submitButton('Найти', ['class' => 'btn btn-success']);?>
                        <?php $form = ActiveForm::end() ?>

Как мне поместить в свойства $Button1,$Button2,$Button3 price из таблицы товаров, чтобы при клике на определенный инпут он выводил товары как сделано в условии контроллера(то есть по диапазону цены)

Answer 1

Значит, идем в документацию, видим:

The data item used to generate the radio buttons. The array values are the labels, while the array keys are the corresponding radio values.

Значит, radioList первым параметром, ожидает от вас, массив где ключи это ЗНАЧЕНИЯ инпута, а значения массива - это labels (этикетка/описание).

Собственно, если вы загляните в html, что выходит из вашего кода:

$form->field($model, 'radioButtonList')
->radioList([
    'Button1' => 'от 0-1500',     
    'Button2' => 'от 3000-5000',
    'Button3' => 'от 5000-20000'
]);

То увидите примерно:

<label>от 0-1500</label>
<input  type="radio" value="Button1" name="radioButtonList"/>
<label>от 3000-5000</label>
<input type="radio" value="Button2" name="radioButtonList"/>
<label>от 5000-20000</label>
<input type="radio" value="Button3" name="radioButtonList"/>

Что будет если запостить такую форму? Ну к примеру постом? Что получите?

Вы получите в переменой $_POST по ключу radioButtonList значение Button1, Button2 или Button3.

И как же нам получить значение?

Из массива на прямую - $_POST['radioButtonList']

Через метод фреймворка - Yii::$app->request->post('radioButtonList')

Загрузить в модель -

$model = new Product();
if($model->load(Yii::$app->request->post())){
   ... $model->radioButtonList;
}

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

Причина ваших проблем (мне кажется, что та же причина, почему вам не хотят помогать тут) - вам стоит изучить документацию, и повторить примеры которые в ней. Это вообще как минимум. (хотя бы - ссылка).

READ ALSO
Opencart модификация сайта

Opencart модификация сайта

Подскажите как в opencart сделать следующий функционал (можно готовые модули) сайт по продажи купонов:

181
RedBeanPHP ввод данных в кастомную таблицу

RedBeanPHP ввод данных в кастомную таблицу

Доброго времени сутокЧастенько делал регистрации на RedBeanPHP, и в данной ситуации тоже, но большое НО

232
Время отсчёта PHP

Время отсчёта PHP

ЗдравствуйтеИ так, назрел вопрос

248