Skip to main content
2 of 2
added 8 characters in body
Alex89
  • 183
  • 1
  • 8

I ended up using the Ad Hoc Validation method of Yii2, here is the link for documentation: https://www.yiiframework.com/doc/guide/2.0/en/input-validation#ad-hoc-validation

My code for validation:
Plugin.php

class Plugin extends \craft\base\Plugin

{
    public function init()
{
    parent::init();

    $this->setComponents([
        'form1Validator' => Form1Validator::class,
        ...
    ]);

    Event::on(
        SaveController::class,
        SaveController::EVENT_BEFORE_SAVE_ENTRY,
        function(SaveEvent $event) {
            try {
                $response = null;
                switch($event->entry->section->handle) {
                    case 'form1':
                        $response = Plugin::getInstance()->form1Validator->validate($event->entry);
                        break;
                    ...
                        }
                }
                if(!isset($response) || !$response['success']){
                    $event->isValid = false;
                    $event->entry->addErrors($response['errors']);
                }
            } catch (\Exception $e) {
                $event->isValid = false;
                $event->entry->addError('exception', $e->getMessage());
                return;
            }
        }
    );
}

}

Form1Validator.php

class Form1Validator
{
 public function validate(Entry $entry)
{
    $model = new DynamicModel(
        [
            'formGender' => $entry->formGender,
            'formFirstName' => $entry->formFirstName,
            'formLastName' => $entry->formLastName,
            'formEmailAddress' => $entry->formEmailAddress,
            'formPhoneNumber' => $entry->formPhoneNumber,
        ]
    );

    if(!$model
        ->addRule(['formGender', 'formFirstName', 'formLastName', 'formEmailAddress'], 'required')
        ->addRule('formGender', 'in', ['range' => ['male', 'female']])
        ->addRule('formEmailAddress', 'email')
        ->addRule('formPhoneNumber', 'match', ['pattern' => '/^[0-9]+$/'])
        ->validate()
    ) {
        return [
            'success' => false,
            'errors' => $model->getErrors(),
        ];
    }

    return [
        'success' => true,
        'errors' => [],
    ];
    }
}
Alex89
  • 183
  • 1
  • 8