Scenario. Models

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
gbushmakin
Сообщения: 15
Зарегистрирован: 2019.06.20, 12:38

Scenario. Models

Сообщение gbushmakin » 2019.10.16, 17:42

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

В частности столкнулся с тем, что одна форма будет иметь поле ARTICUL и это поле должно быть проверено моделью на факт отсутствия данного значения в таблице бд. И оно должно быть обязательным.

А вторая форма будет на редактирование уже имеющей строки в таблице.

Проблема в том, что до конца не могу понять SCENARIO. Как понять формам, что одна из них включает в себя обработку с ARTICUL'ом, а другая нет?

Модель:

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

    const SCENARIO_NEWGOODS = 'newGoods';
    const SCENARIO_EDITGOODS = 'editGoods';
    
    public static function tableName()
    {
        return "goods";
    }

    public function rules() {
        return [
            [['QUANTITY', 'PRICE', 'DESCRIPTION', 'PRODUCT_NAME'], 'default'],
            [['ARTICUL', 'QUANTITY', 'PRICE'], 'required'],
            ['ARTICUL', 'validateArticul'],
        ];
    }

    public function scenarios()
    {
        $scenarios = parent::scenarios();
        $scenarios[static::SCENARIO_NEWGOODS] = ['ARTICUL', 'QUANTITY', 'PRICE', 'DESCRIPTION', 'PRODUCT_NAME'];
        $scenarios[static::SCENARIO_EDITGOODS ] = ['QUANTITY', 'PRICE'];
        return $scenarios;
    }

    public function validateArticul()
    {
        $articul = Unloading::find()
            ->where(['ARTICUL' => $this->ARTICUL])
            ->all();

        if ($articul) {
            $this->addError('ARTICUL', 'Товар с таким артикулом уже есть на складе.');
        }
    }
 
В контроллере:

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

// в форме с добавлением нового содержится это:
$modelUpdate->scenario = 'newGoods';

//  с редактированием это:
$modelUpdate->scenario = 'editGoods';

gbushmakin
Сообщения: 15
Зарегистрирован: 2019.06.20, 12:38

Re: Scenario. Models

Сообщение gbushmakin » 2019.10.16, 17:47

И ещё.. подскажите, как в validateArticul() добавить значение Артикула? До этого объявлял в начале кода $ARTICUL, но позже возникли некоторые проблемы.

someweb
Сообщения: 544
Зарегистрирован: 2017.03.09, 10:12

Re: Scenario. Models

Сообщение someweb » 2019.10.16, 17:56

А форме надо знать?
Не рендрите инпут при editGoods.
Для уникальности есть готовый валидатор - https://www.yiiframework.com/doc/guide/ ... ors#unique

Лучше сделайте уникальный индекс на поле ARTICUL not null. (По вашему алгоритму артикул нельзя будет отредактировать)
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

gbushmakin
Сообщения: 15
Зарегистрирован: 2019.06.20, 12:38

Re: Scenario. Models

Сообщение gbushmakin » 2019.10.16, 18:02

someweb писал(а):
2019.10.16, 17:56
А форме надо знать?
Не рендрите инпут при editGoods.
Для уникальности есть готовый валидатор - https://www.yiiframework.com/doc/guide/ ... ors#unique

Лучше сделайте уникальный индекс на поле ARTICUL not null. (По вашему алгоритму артикул нельзя будет отредактировать)
В будущем артикулы возможно будут повторяться, в зависимости от категории. Именно поэтому нужно сделать это самому, прописав определённые условия

gbushmakin
Сообщения: 15
Зарегистрирован: 2019.06.20, 12:38

Re: Scenario. Models

Сообщение gbushmakin » 2019.10.17, 09:54

someweb писал(а):
2019.10.16, 17:56
Не рендрите инпут при editGoods.
И что вы имели ввиду в этом предложении?

gbushmakin
Сообщения: 15
Зарегистрирован: 2019.06.20, 12:38

Re: Scenario. Models

Сообщение gbushmakin » 2019.10.17, 10:38

В общем в двух словах о вопросе, он о том, как для одной формы определить обязательные (required) поля И проверить Артикул на отсутствие в бд, а другая форма не должна проверять в бд (но она так же содержит в себе артикул, но уже не проверяет) и у неё немного другие поля должны быть. В общем по хорошему было бы разделить на два public function rules() и прописать что нужно для одной и отдельно что нужно для другой. Как это сделать с помощью сценарий?

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

Re: Scenario. Models

Сообщение yiiliveext » 2019.10.17, 10:50

В сценарии указываете поля, которые будут проверяться в правилах. Правила для полей не указанных в сценарии будут игнорироваться.

gbushmakin
Сообщения: 15
Зарегистрирован: 2019.06.20, 12:38

Re: Scenario. Models

Сообщение gbushmakin » 2019.10.17, 11:11

yiiliveext писал(а):
2019.10.17, 10:50
Правила для полей не указанных в сценарии будут игнорироваться.
Так вот если мне в обеих формах нужно передавать артикул, только в одной нужно проверить в бд, а в другой нет?

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

Re: Scenario. Models

Сообщение yiiliveext » 2019.10.17, 11:18

Значит в одном сценарии будет артикул, а в другом нет. Можно еще кастомно для каждого правила указывать используя свойство on
Читайте документацию https://www.yiiframework.com/doc/guide/ ... ure-models

Ответить