Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Yii2 required validation on update

I've Yii2 form containing form fields depending on action of page. Ex. Few fields appears when then action is create and few appears when action is update. I want to add required validation based on this scenario.

Ex.

<?= $form->field($model, 'unique_identifier')->textInput(['maxlength' => 45]) ?>

I am showing this field only when action => 'update'.

Now I want to add required validation for this and I tried this:

[['unique_identifier'], 'required', 'on' => 'update'],

But above validation not working. If I remove on=>update then its validating on both create and update scenario.

Any help would be appreciated.

like image 240
J.K.A. Avatar asked Jun 17 '15 08:06

J.K.A.


People also ask

How to update the database records in yii2 framework?

Yii Framework 2 : Update Query. You can use different type of methods to update the database records in yii2.0 framework. You can use model methods, execute() etc. save() OR update() Using model methods, You can load existing record and update the necessary changes in that.

Can I use the Yii\base\validator without a model?

Note: The yii\base\Validator::skipOnEmpty property is used for yii\base\Model validation only. Using it without a model has no effect. If you need to perform multiple validations against several values, you can use yii\base\DynamicModel which supports declaring both attributes and rules on the fly.

What is the use of eachvalidator in yii2?

Since Yii2 version 2.0.4 there is the EachValidator used to validate each item in an array. The ['integer'] part can be every other validator object that Yii2 offers and can hold the specific arguments for the validator. Like: ['integer', 'min' => 1337].

How to use Yii\base\dynamicmodel() method in a dynamic model?

Its usage is like the following: The yii\base\DynamicModel::validateData () method creates an instance of DynamicModel, defines the attributes using the given data ( name and email in this example), and then calls yii\base\Model::validate () with the given rules.


1 Answers

ActiveRecord does not set scenario automaticaly when you update or create items. You must override update() method in your model and set scenario that you need. E.g. in your case

public function update($runValidation = true, $attributeNames = null)
{
    $this->scenario = 'update';
    return parent::update($runValidation, $attributeNames);
}

Also you can set scenario in your actionUpdate

public function actionUpdate($id)
{
    $model = $this->findModel($id);
    $model->scenario = 'update';
    //load data from request, save model etc.
 }
like image 83
Tony Avatar answered Nov 03 '22 09:11

Tony