Forms 检查特定验证组在Symfony表格中是否有效?
我正在构建一个复杂的symfony表单,它有点长,并且包含其他嵌入表单。因此,表单在UI中以单独的选项卡显示,以使其更可读,更方便用户使用 因为表单很长并且在UI中是分开的,所以在填充表单时可能会遗漏一些内容,或者只是插入了一些不正确的内容。此时验证将启动并阻止表单保存。验证本身是配置好的,并且可以完美地工作 我这里的问题是,我有一个巨大的表单,分为多个选项卡,在某个地方有一个错误,我需要浏览每个选项卡,以准确地查看出了什么问题。我在考虑用另一种颜色制作包含有错误字段的特定选项卡,这样它就可以脱颖而出,省去你想知道哪里出了问题以及它在哪里的时间 据我所见,我有两个选择:Forms 检查特定验证组在Symfony表格中是否有效?,forms,validation,symfony,Forms,Validation,Symfony,我正在构建一个复杂的symfony表单,它有点长,并且包含其他嵌入表单。因此,表单在UI中以单独的选项卡显示,以使其更可读,更方便用户使用 因为表单很长并且在UI中是分开的,所以在填充表单时可能会遗漏一些内容,或者只是插入了一些不正确的内容。此时验证将启动并阻止表单保存。验证本身是配置好的,并且可以完美地工作 我这里的问题是,我有一个巨大的表单,分为多个选项卡,在某个地方有一个错误,我需要浏览每个选项卡,以准确地查看出了什么问题。我在考虑用另一种颜色制作包含有错误字段的特定选项卡,这样它就可以脱
{%if not form.children.FIELD_NAME.vars.valid%}
这要花很长时间才能完成,只有在这是唯一可能的方式时我才会这么做validation\u groups=>array('Default','my\u tab\u name')
并对每个选项卡的字段进行逻辑分组李>
我真的希望使用第二种方法,但我似乎不知道如何检查验证组,即my_tab_1
是否包含任何错误。我知道我可以这样做:
$validator = $this->get('validator');
$my_tab_1 = $validator->validate($entity, null, array('my_tab_1'));
$my_tab_2 = $validator->validate($entity, null, array('my_tab_2'));
$my_tab_3 = $validator->validate($entity, null, array('my_tab_3'));
// so on
但是表单已经通过$form->validate()
进行了验证,使用这种方法将触发N次不必要的验证
因此,这里的问题是如何从细枝模板检查特定的验证组是否有效?如果不可能,是否可以从控制器
获取它,并将其作为变量传递,而不进行另一次验证
我不认为我需要发布FormType
s,因为它们是长的、嵌套的,可能只会让您感到困惑。但是,这是父窗体的一个过于简化的版本:
class CompanyType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('address')
->add('representedBy')
->add('category')
->add('phone')
->add('member', new MemberType())
->add('contacts', new ContactType())
->add('notes', new NoteType())
// and a couple more embedded form types.
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'App\FooBundle\Entity\Company',
'cascade_validation' => true
));
}
/**
* @return string
*/
public function getName()
{
return 'app_company';
}
}
如果有人有更好的想法或解决方案,我将不胜感激 首先,您可以用两种不同的方式使用选项卡: a) 使用javascript。选项卡的所有内容都加载一次,可以在页面源中找到。除一个选项卡外,所有选项卡内容均隐藏 b) 与链接和PHP。在这种情况下,每个选项卡都是另一个带有另一个URL的网页 (希望你能理解其中的区别) 我的高级表单总是使用第二种方法。因此,对于每个页面,我只添加formtype中所有formfields的一部分。对于每个页面,我也使用一个验证组。这已经足以编辑现有实体 但问题是一个新的实体。您可能希望避免在数据库中使用部分填充的实体,因此您需要验证并存储会话中的每个“步骤”,并且在用户完成最后一个步骤(验证没有问题)后,您可能希望将所有表单字段一次性存储到数据库中 craueformflowbundle使用此方法 要获取formfields的一部分,只需在formType中使用一个开关或为每个步骤创建一个formType
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class CompanyType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
switch ($options['flow_step']) {
case 1:
$builder
->add('company')
->add('origin')
;
break;
case 2:
$builder
->add('contactPerson', NULL, array('label' => 'Volledige naam'))
->add('email', 'email', array('label' => 'Email'))
->add('telephone', NULL, array('label' => 'Telefoonnummer'))
;
break;
}
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Company',
'flow_step' => 1
));
}
/**
* @return string
*/
public function getName()
{
return 'appbundle_company';
}
}
看看craueformflowbundle:谢谢你的建议。不幸的是,我不能将表单分成多个步骤,因为表单背后有一些业务逻辑,它根据业务规则执行一些额外的表单验证。