Silverstripe - 验证后返回表单数据

时间:2017-03-15 07:55:29

标签: php forms validation silverstripe

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

首先,这是正确的地方,其次是如果是这样的话,如果数据不符合验证,我如何才能将数据返回到表单?

目前它将清除整个表格。

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();   
    }

2 个答案:

答案 0 :(得分:2)

我建议你不要那样做服务器端验证。 最简单的方法就是使用正确的表单字段。例如。 EmailFieldPhoneNumberField

如果这些没有验证您想要的方式,只需扩展它们或创建自己的FormField子类。

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

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

答案 1 :(得分:1)

前几天我必须为电话号码实现10个字符的长度。

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

我通过composer包含了上面的模块,并按照自述文件中的设置进行了操作。

对于管理界面,我创建了一个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分钟来实施最低10&约5或6种不同形式的最多10个字符。

我希望这会有所帮助。

干杯, 科林