Search code examples
yii2rules

Yii2 Model Rules are not Firing on Post


I have quite a simple form using Yii2 but for some reason my model rules are nor firing when I hit the submit button. Below is my UI form.

<?php
$form = ActiveForm::begin(['id' => 'paperadduserform',])
?>
      <?= $form->field($registerModel, 'userFirstname')->textInput(
        [placeholder' => 'Enter first name',
        class'=>'form-control form-control-sm border-primary',
        maxlength'=>'40'])->label(false); ?>

      <?= $form->field($registerModel, 'userLastname')->textInput(
        [placeholder' => 'Enter last name',
        class'=>'form-control form-control-sm border-primary',
        maxlength'=>'40'])->label(false); ?>

      <?= Html::submitButton('Add Reviewer', ['id'=>'registerBtn','class' => 'btn btn-primary btn-xl']) ?>

<?php ActiveForm::end() ?>

This is my Model class which contains the Rules.

class PaperAddUserForm extends Model
{
    public $userFirstname;
    public $userLastname;

    public function rules()
    {
        return [
            ['userFirstname', 'trim'],
            ['userFirstname', 'required'],
            ['userFirstname', 'string', 'min' => 1, 'max' => 40],

            ['userLastname', 'trim'],
            ['userLastname', 'required'],
            ['userLastname', 'string', 'min' => 1, 'max' => 40],
        ];
    }


    private function addUser($role)
    {
        try {
            $user = new User();
            $user->user_firstname = $this->userFirstname;
            $user->user_lastname = $this->userLastname;
            $user->save(false);

            $auth = \Yii::$app->authManager;
            $authorRole = $auth->getRole($role);
            $auth->assign($authorRole, $user->getId());

        } catch (Exception $e) {
            throw $e;
        }
    }


    public function paperAddReviewer()
    {
        $this->addUser(AuthRolesEnum::OC_REVIEWER);
        return true;
    }
}

This is part of my Controller class.

public function actionAddReviewer()
{
    $registerModel = new PaperAddUserForm();

    if ($registerModel->load(Yii::$app->request->post()) && $registerModel->paperAddReviewer()) {
        return $this->redirect(['/paper/reviewer/reviewer']);
    }

    return $this->render('/paper/reviewer/add-reviewer',
        [
            'registerModel' => $registerModel,
        ]);
}

But when I run the application, the fields are not marked as required when I leave them empty. When I hit the submit button it tries to save to the DB, it does not give me the 'Field is Required' error message.


Solution

  • You are not calling yii\base\Model::validate() method anywhere. The rules are not applied if you just define them. The definition is used when validation is triggered.

    If your model extends yii\db\ActiveRecord then the validate() method is called during its save() method unless you've passed false in its $runValidation parameter.

    But in case your model extends yii\base\Model directly, you have to call the validate() method explicitly.

    In your case you can add the validate() call in your controller like this:

    if (
        $registerModel->load(Yii::$app->request->post()) 
        && $registerModel->validate()
        && $registerModel->paperAddReviewer()
    ) {
        return $this->redirect(['/paper/reviewer/reviewer']);
    }
    

    Or you can make it part of your PaperAddUserForm::paperAddReviewer() method like this:

    public function paperAddReviewer()
    {
        if (!$this->validate()) {
            return false;
        }
        $this->addUser(AuthRolesEnum::OC_REVIEWER);
        return true;
    }