проверка не работает после настройки сценария

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

        class BaseBroadcast extends BaseActiveRecord
    {
      const SCENARIO_UPDATE = 'update';
      const SCENARIO_CREATE = 'create';


/**
 * @inheritdoc
 */
public function rules()
{
    return [
        [
            [
                'freight_charges_unit',
                'requested_response_date',
                'close_reason'
            ],
            'required'
        ],
       ......
    ];
}

/**
 * @return array
 */
public function scenarios(): array
{
    parent::scenarios();
    return [
        self::SCENARIO_UPDATE => ['close_reason'],
        self::SCENARIO_CREATE => ['freight_charges_unit','requested_response_date']

    ];
}

}

и я использовал сценарий создания, например

$model = new Broadcast();
$model->scenario = Broadcast::SCENARIO_CREATE;

этот и сценарий обновления, например

$model = Broadcast::findOne(['id' => $id]);
$model->scenario = Broadcast::SCENARIO_UPDATE;

это.

я включил проверку на стороне клиента в своих формах

 <?php $form = ActiveForm::begin(['action' => ......,
    'enableClientValidation' => true,]) ?>

person Ajith Lal    schedule 26.04.2017    source источник
comment
Так что же происходит? Эти поля больше не проверяются в соответствии со сценариями?   -  person Bizley    schedule 26.04.2017
comment
да. когда я нажимаю «Отправить» с обязательным полем, так как оно пусто, форма отправляется   -  person Ajith Lal    schedule 26.04.2017
comment
Вам не нужно устанавливать 'enableClientValidation' => true - это значение по умолчанию, и эта строка parent::scenarios(); ничего не делает. В любом случае, не могли бы вы показать код действия контроллера, который работает на этой модели?   -  person Bizley    schedule 26.04.2017
comment
обновить действие сценария public function actionClose($id) { $model = Broadcast::findOne(['id' => $id]); $model->status = Broadcast::STATUS_CLOSED; $model->scenario = Broadcast::SCENARIO_UPDATE; if ($model->load(post()) && $model->update(true, ['close_reason', 'status'])) { \setFlash('success', Yii::t('company', 'Broadcast Closed Successfully!!!')); return $this->redirect(Yii::$app->request->referrer); } return $this->render('_closeReasonForm', ['model' => $model]); }   -  person Ajith Lal    schedule 26.04.2017
comment
Не уверен, что такое post(), но выглядит нормально. Можешь показать и _closeReasonForm? Обновите вопрос с ним, трудно читать код без форматирования.   -  person Bizley    schedule 26.04.2017
comment
попробуйте вызвать функцию правил после вызова функции сценария и используйте 'on' => 'update' после вашего правила проверки   -  person Vishva G    schedule 26.04.2017


Ответы (1)


Попробуйте этот заказ на модели

const SCENARIO_UPDATE = 'update';
const SCENARIO_CREATE = 'create';


public function scenarios()
{
    return [
        self::SCENARIO_UPDATE => ['close_reason'],
        self::SCENARIO_CREATE => ['freight_charges_unit','requested_response_date']
    ];
}

public function rules()
{
  return [
            [['freight_charges_unit','requested_response_date'], 'required','on' => 'create'],
            [['close_reason'], 'required','on' => 'update'],
    ];
}

И это в контроллере

$model = new Broadcast(['scenario' => 'create']);

//для обновления

$model = $this->findModel($id);

$model->scenario = 'обновить';

person Vishva G    schedule 26.04.2017