比较两个字段以查看它们是否匹配
Compare two fields to see if they match
我正在考虑验证表单的两个电子邮件字段的最佳方法:我有一个电子邮件字段和一个重新输入的电子邮件字段,我想比较它们以查看它们是否匹配。如果没有,则显示一条错误消息,直到用户在两个字段中正确输入他们的电子邮件。
我知道可以创建自定义字段 classes 以允许自定义验证,但我使用的是 2 个单独的字段,而不是一个,我不确定自定义 class 是否会在这种情况下工作,因为我不只验证一个字段。
我按照此处找到的示例进行操作,其中涉及向表单的提交功能添加自定义验证:https://docs.silverstripe.org/en/3/developer_guides/forms/validation/
但是,我不想重定向到任何地方 -- 我想留在表单上。
如果可以的话,我希望尽可能简单。
这是我目前所拥有的。除了我提到的问题,其他一切正常:
public function DemoForm() {
$fieldsArr = array();
$firstName = new TextField('first_name', 'First Name');
$firstName->setAttribute('placeholder', 'First Name');
array_push($fieldsArr, $firstName);
$lastName = new TextField('last_name', 'Last Name');
$lastName->setAttribute('placeholder', 'Last Name');
array_push($fieldsArr,$lastName);
$companytName = new TextField('company_name', 'Company Name');
$companytName->setAttribute('placeholder', 'Company Name');
array_push($fieldsArr,$companytName);
$email = new EmailField('email', 'Email');
$email->setAttribute('placeholder', 'Email');
array_push($fieldsArr, $email);
$retypeemail = new EmailField('retype_email', 'Retype Email');
$retypeemail->setAttribute('placeholder', 'Retype Email');
array_push($fieldsArr, $retypeemail);
$fields = new FieldList($fieldsArr);
$actions = new FieldList(
new FormAction('submit', 'Submit')
);
$validator = new RequiredFields('first_name', 'last_name', 'email', "retype_email");
return new Form($this, 'DemoForm', $fields, $actions, $validator);
}
public function submit($data, $form) {
if($data['email'] != $data['retype_email']){
$form->addErrorMessage('Email', 'The emails do not match.', 'bad');
return $this->redirectBack();
}
else{
$demoRequest = new DemoFormSubmission();
$demoRequest->FirstName = $data['first_name'];
$demoRequest->LastName = $data['last_name'];
$demoRequest->EmailAddress =$data['email'];
$demoRequest->CompanyName = $data['company_name'];
$demoRequest->write();
$email = new Email();
$email->setTo('sara.dejaneiro@innismaggiore.com');
$email->setFrom($data['email']);
$email->setSubject("Demo request submission");
$messageBody = "
<p><strong>First Name:</strong> {$data['first_name']}</p>
<p><strong>Last Name:</strong> {$data['last_name']}</p>
<p><strong>Email: </strong> {$data['email']}</p>
<p><strong>Company Name:</strong> {$data['company_name']}</p>
";
$email->setBody($messageBody);
$email->send();
return $this->redirect("demo-request-submission-thank-you-page");
}
}
鉴于您对我的评论的回复,我认为您最好选择:
创建您自己的扩展 CompositeField 的表单字段,然后添加自定义验证函数(根据 https://docs.silverstripe.org/en/3/developer_guides/forms/validation/#form-validation)
通过扩展 RequiredFields (https://github.com/silverstripe/silverstripe-framework/blob/3.6.2/forms/RequiredFields.php) and then overloading the PHP method (https://github.com/silverstripe/silverstripe-framework/blob/3.6.2/forms/RequiredFields.php#L82) 创建自定义验证器。
第 2 种方法可能不太繁琐。您可以编写自己的自定义逻辑,然后如果验证失败只是 return "false" 然后 SilverStripe 将取消表单提交和 return 用户到表单,他们的数据仍在表单字段中.
我正在考虑验证表单的两个电子邮件字段的最佳方法:我有一个电子邮件字段和一个重新输入的电子邮件字段,我想比较它们以查看它们是否匹配。如果没有,则显示一条错误消息,直到用户在两个字段中正确输入他们的电子邮件。
我知道可以创建自定义字段 classes 以允许自定义验证,但我使用的是 2 个单独的字段,而不是一个,我不确定自定义 class 是否会在这种情况下工作,因为我不只验证一个字段。
我按照此处找到的示例进行操作,其中涉及向表单的提交功能添加自定义验证:https://docs.silverstripe.org/en/3/developer_guides/forms/validation/
但是,我不想重定向到任何地方 -- 我想留在表单上。
如果可以的话,我希望尽可能简单。
这是我目前所拥有的。除了我提到的问题,其他一切正常:
public function DemoForm() {
$fieldsArr = array();
$firstName = new TextField('first_name', 'First Name');
$firstName->setAttribute('placeholder', 'First Name');
array_push($fieldsArr, $firstName);
$lastName = new TextField('last_name', 'Last Name');
$lastName->setAttribute('placeholder', 'Last Name');
array_push($fieldsArr,$lastName);
$companytName = new TextField('company_name', 'Company Name');
$companytName->setAttribute('placeholder', 'Company Name');
array_push($fieldsArr,$companytName);
$email = new EmailField('email', 'Email');
$email->setAttribute('placeholder', 'Email');
array_push($fieldsArr, $email);
$retypeemail = new EmailField('retype_email', 'Retype Email');
$retypeemail->setAttribute('placeholder', 'Retype Email');
array_push($fieldsArr, $retypeemail);
$fields = new FieldList($fieldsArr);
$actions = new FieldList(
new FormAction('submit', 'Submit')
);
$validator = new RequiredFields('first_name', 'last_name', 'email', "retype_email");
return new Form($this, 'DemoForm', $fields, $actions, $validator);
}
public function submit($data, $form) {
if($data['email'] != $data['retype_email']){
$form->addErrorMessage('Email', 'The emails do not match.', 'bad');
return $this->redirectBack();
}
else{
$demoRequest = new DemoFormSubmission();
$demoRequest->FirstName = $data['first_name'];
$demoRequest->LastName = $data['last_name'];
$demoRequest->EmailAddress =$data['email'];
$demoRequest->CompanyName = $data['company_name'];
$demoRequest->write();
$email = new Email();
$email->setTo('sara.dejaneiro@innismaggiore.com');
$email->setFrom($data['email']);
$email->setSubject("Demo request submission");
$messageBody = "
<p><strong>First Name:</strong> {$data['first_name']}</p>
<p><strong>Last Name:</strong> {$data['last_name']}</p>
<p><strong>Email: </strong> {$data['email']}</p>
<p><strong>Company Name:</strong> {$data['company_name']}</p>
";
$email->setBody($messageBody);
$email->send();
return $this->redirect("demo-request-submission-thank-you-page");
}
}
鉴于您对我的评论的回复,我认为您最好选择:
创建您自己的扩展 CompositeField 的表单字段,然后添加自定义验证函数(根据 https://docs.silverstripe.org/en/3/developer_guides/forms/validation/#form-validation)
通过扩展 RequiredFields (https://github.com/silverstripe/silverstripe-framework/blob/3.6.2/forms/RequiredFields.php) and then overloading the PHP method (https://github.com/silverstripe/silverstripe-framework/blob/3.6.2/forms/RequiredFields.php#L82) 创建自定义验证器。
第 2 种方法可能不太繁琐。您可以编写自己的自定义逻辑,然后如果验证失败只是 return "false" 然后 SilverStripe 将取消表单提交和 return 用户到表单,他们的数据仍在表单字段中.