我认为在symfony2 Form
和Validator
组件上创建客户端表单验证非常有用。
执行此操作的最佳方法是将验证约束传递给表单视图。 有了这些信息,就可以制作一个模板,将表单字段呈现为:
<div>
<label for="form_email">E-Mail</label>
<input
id="form_email" type="text" name="form[email]" value=""
data-validation-constraints='{"NotBlank":{},"MinLength":{"limit":6}}'
/>
</div>
然后,JavaScript部分将找到具有<input>
属性的所有data-validation-constraints
元素,并为它们创建正确的验证。
要将验证约束传递给表单视图,我认为最好的方法是创建表单类型扩展。这就是我的问题所在:这是正确的方法吗?这怎么可能?
在片刻,我的表单类型扩展名如下:
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormBuilder;
class FieldTypeExtension extends \Symfony\Component\Form\AbstractTypeExtension{
public function getExtendedType(){
return 'field';
}
public function buildView(FormView $view, FormInterface $form)
{
// at this point i didn't find a way to get the
// validation constraints out of the $form
// the `getAllValidationConstraints` here is just an example
$view->set('validation_constraints', $form->getAllValidationConstraints());
}
}
如何从FormInterface对象中获取应用于一个表单字段的所有验证约束?
答案 0 :(得分:2)
检查相应的未解决问题"[Form] JavaScript validation",其中包含对SimpleThingsFormExtraBundle的引用(或者更确切地说是该包的特定开放PR)。
答案 1 :(得分:1)
这是新的Symfony 2软件包,它将表单类型约束转换为JavaScript验证标尺https://github.com/formapro/JsFormValidatorBundle
答案 2 :(得分:0)
你可以做一些更简单的事情:
FieldType已将 attr 属性传递给表单,该表单直接作为 attr var传递给视图。您最好修改此 attr 表单的属性,以便添加 data-validation-constraints 属性,因为它可以避免您需要自定义表单主题来处理你的新变种。
<?php
namespace MyBundle\Form\Type;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilder;
class FieldTypeJsValidationExtension extends AbstractTypeExtension
{
public function buildForm(FormBuilder $builder, array $options)
{
$attr = $builder->getAttribute('attr');
$attr = array_merge(
array(
'data-validation-constraints' => $this->aMethodThatRenderTheFinalContentOfTheValidationAttribute(),
),
$builder->getAttribute('attr')
);
$builder->setAttribute('attr', $attr);
}
public function getExtendedType()
{
return 'field';
}
}