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();
}
我建议您不要那样进行服务器端验证。
最简单的方法就是使用正确的表单域。例如。 EmailField
和 PhoneNumberField
.
如果这些不能按照您想要的方式验证,只需扩展它们或创建您自己的 FormField
子classes。
以下是 EmailField
的验证方式:https://github.com/silverstripe/silverstripe-framework/blob/3.5/forms/EmailField.php#L39
或者,您也可以通过扩展 Validator
或 RequiredFields
来实现自定义验证器。验证器将应用于整个表单,如果您开始在那里验证单个字段类型,您最好将字段实现为自定义 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 个字符。
希望对您有所帮助。
干杯,
科林
我正在尝试使用 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();
}
我建议您不要那样进行服务器端验证。
最简单的方法就是使用正确的表单域。例如。 EmailField
和 PhoneNumberField
.
如果这些不能按照您想要的方式验证,只需扩展它们或创建您自己的 FormField
子classes。
以下是 EmailField
的验证方式:https://github.com/silverstripe/silverstripe-framework/blob/3.5/forms/EmailField.php#L39
或者,您也可以通过扩展 Validator
或 RequiredFields
来实现自定义验证器。验证器将应用于整个表单,如果您开始在那里验证单个字段类型,您最好将字段实现为自定义 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 个字符。
希望对您有所帮助。
干杯, 科林