@stalkerxxl

Фиксированные значения для dropdown (больше 2-ух) — в E-NUM или куда?

Всем привет! Возник такой вопрос:
1) есть порядка 10 таблица (сущностей)....
2) в каждой из них - все стандартно (CRUD и т.д.)
3) в каждой таблице есть по 2-3 поля, которые состоят из "более чем двух вариантов".. Чтоб было понятно:
- есть таблица Orders..
- у каждого Ордера есть status с вариантами: live, error, new, canceled

Хочу в GridView в фильтре выводить те статусы, которые есть в значениях колонки status
а вот при добавлении Ордера и редактировании - уже нужно выводить ВСЕ варианты...

Пока все сделано "как обычно" - во ввьюхах прописаны жестко "ручками".. но это - "костыль"... Хочется от него избавится
'filter' => Html::activeDropDownList($searchModel, 'status', ['active' => 'Active', 'live' => 'Live', 'error'=>'Error'], ['class' => 'form-control', 'prompt' => 'Все']),


Вопрос: где "зафиксировать все возможные варианты"?
В модели, конечно, можно сделать в rules что-то типа:
[
    // проверяет, что значение "level" равно Live, Active или Error
    ['level', 'in', 'range' => [Live, Active, Error]],
]

Я ж правильно понимаю, что это более-менее безопасный способ и "посторонний статус" в БД не пройдет?
https://www.yiiframework.com/doc/guide/2.0/ru/tuto...

Но как потом вытащить эти все разрешенные варианты для отображения в Форме редактирования/добавления и в filter GridView?
Не знаю...

Также, думал, запихнуть все доступные варианты в E-NUM поле "status" таблицы Orders - но опять же не знаю как вытаскивать все доступные варианты...

Подскажите true way решение этой задачи...

Прошу строго не судить - с ООП вообще знаком недавно.. с Yii - 3 недели =)
  • Вопрос задан
  • 83 просмотра
Решения вопроса 2
slo_nik
@slo_nik Куратор тега Yii
Добрый вечер.
Я бы сделал немного по другому.
В модели объявил бы константы, каждая из которых соответствовала бы какому-то статусу.
Названия не использовать, только числовые значения. Поле в таблице под статус сделать smallint(6), NULL нет, по умолчанию 0.
Вот как-то так:
const STATUS_LIVE = 0;
const STATUS_ERROR = 1;
/* и так далее */

public function rules()
{
   return [
            ['status', 'integer'],
            ['status', 'default', 'value' => self::STATUS_LIVE],
            ['status', 'in', 'range' => array_keys(self::getStatusesArray())],
   ];
}

/* метод использовать при выводе статуса в view.php*/
public function getStatusName()
{
   return ArrayHelper::getValue(self::statusesArray(), $this->status);
}

public static function getStatusesArray()
{
     return [
        self::STATUS_LIVE => 'Live',
       self::STATUS_ERROR => 'Error',
       /* и так далее */
    ];
}

В gridView
'filter' => YOUR_MODEL_NAME::getStatusesArray()
В dropDown формы
$form->field($model, 'status')->dropDownListYOUR_MODEL_NAME::getStatusesArray(), ['prompt' => 'Select'])
Ответ написан
@Arik
?
class MyModel extends ActiveRecord {
    const STATUS_LIST = ['active' => 'Active', 'live' => 'Live', 'error'=>'Error'];
}


1.
'filter' => Html::activeDropDownList($searchModel, 'status', MyModel::STATUS_LIST, ['class' => 'form-control', 'prompt' => 'Все']),


2.
[
    // проверяет, что значение "level" равно Live, Active или Error
    ['level', 'in', 'range' => array_keys(static::STATUS_LIST)],
]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы