Silverstripe - return 验证后的表单数据

Silverstripe - return form data after validation

我正在尝试使用 phone 和电子邮件字段的自定义验证来进行服务器端验证。我正在表单操作中进行自定义验证。

首先,这是执行此操作的正确位置吗?其次,如果是这样,如果不符合验证,我如何才能将数据 return 发送到表单?

目前它将清除整个表格。

public function doSubmitForm($data, Form $form) {

        if (!preg_match("/^[\+_a-z0-9-'&=]+(\.[\+_a-z0-9-']+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i",$data['Email'])) {
            $form->addErrorMessage('Email', 'Invalid email', 'bad');
        return $this->redirectBack();
        }
        if (!preg_match("/^((?:\+)|0)(\d{9,14})$/i",$data['Phone'])) {
            $form->addErrorMessage('Phone', 'Please match the correct format eg: 0821234567', 'bad');
        return $this->redirectBack();
        }

        $form->sessionMessage('Thank you for your submission','alert alert-success');

    return $this->redirectBack();   
    }

我建议您不要那样进行服务器端验证。 最简单的方法就是使用正确的表单域。例如。 EmailFieldPhoneNumberField.

如果这些不能按照您想要的方式验证,只需扩展它们或创建您自己的 FormField 子classes。

以下是 EmailField 的验证方式:https://github.com/silverstripe/silverstripe-framework/blob/3.5/forms/EmailField.php#L39

或者,您也可以通过扩展 ValidatorRequiredFields 来实现自定义验证器。验证器将应用于整个表单,如果您开始在那里验证单个字段类型,您最好将字段实现为自定义 class(这样您就有了一个可重用的组件)。

前几天我不得不为 phone 个数字实现 10 个字符的长度。

https://github.com/sheadawson/silverstripe-zenvalidator

我通过 composer 包含了上面的模块,并遵循了 README 中的设置。

我为管理界面创建了一个 getCMSValidator() 方法

public function getCMSValidator() {
    $validator = ZenValidator::create();
    $validator->setConstraint('Phone', Constraint_length::create('range', 10, 10)->setMessage('Phone numbers must be 10 digits in length'));
    $validator->setConstraint('PhoneAH', Constraint_length::create('range', 10, 10)->setMessage('Phone numbers must be 10 digits in length'));
    $validator->setConstraint('PhoneMobile', Constraint_length::create('range', 10, 10)->setMessage('Mobile numbers must be 10 digits in length'));
    $validator->disableParsley();
    return $validator;
}

前端只需创建一个 $validator 然后将其添加到表单中

$validator = ZenValidator::create();
$validator->setConstraint('Phone', Constraint_length::create('range', 10, 10)->setMessage('Phone numbers must be 10 digits in length'));
$validator->disableParsley();

$Form = new Form($this, 'FormName', $fields, $actions, $validator);

我花了大约 20 分钟在大约 5 或 6 种不同的表单上实现最少 10 个和最多 10 个字符。

希望对您有所帮助。

干杯, 科林