在Symfony2中创建组合的客户端和服务器端验证
我认为在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部分将查找所有具有data-validation-constraints
属性的<input>
元素,并为它们创建正确的验证。
为了将验证约束传递给窗体视图,我认为最好的方法是创建一个窗体类型扩展。 这就是我的问题的重点: 这是正确的方式吗? 这怎么可能?
在这个瞬间,我的表单类型扩展如下所示:
use SymfonyComponentFormFormInterface;
use SymfonyComponentFormFormView;
use SymfonyComponentFormFormBuilder;
class FieldTypeExtension extends SymfonyComponentFormAbstractTypeExtension{
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对象之外的一个窗体域?
检查相应的公开问题“[Form] JavaScript验证”,其中包含对SimpleThingsFormExtraBundle的引用(或者是该包的特定开放PR)。
这是新的Symfony 2包,它将表单类型约束转换为JavaScript验证标尺https://github.com/formapro/JsFormValidatorBundle
你可以做些简单的事情:
FieldType已经将attr属性传递给直接作为attr var传递给表单的表单。 你最好修改这个attr表单的属性,以便添加你的data-validation-constraints属性,因为它可以避免你需要定制表单主题来处理你的新var。
<?php
namespace MyBundleFormType;
use SymfonyComponentFormAbstractTypeExtension;
use SymfonyComponentFormFormBuilder;
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';
}
}
链接地址: http://www.djcxy.com/p/9923.html
上一篇: Create combined client side and server side validation in Symfony2