SYMFONY FORM ChoiceType, multiple=>true.如何绕过实现数据转换器的需要
SYMFONY FORM ChoiceType, multiple=>true. How to by pass the need to implement Data Transformers
在 SYMFONY FORM 中(不使用 ORM(PDO 用于数据库查询))。
我有一个 class MyEntityType,其中 buildForm 函数具有:
$builder->add('my_attribute',ChoiceType::class,array(
'choices'=>$listForMyAttribute,
'multiple'=>'true',
'attr'=>array('data-native-menu'=>'false'),
'label'=>'Multiple Select on my attribute'
));
我的属性是名为 MyEntity 的实体的数组,其中包含:
/**
* @Assert\NotBlank()
*/
private $myAttribute;
使用 getter 和 setter 变量 $myAttribute。
当我在控制器中提交表单时,它没有通过验证检查并记录了这个错误:
无法反转 属性 路径的值 "myAttribute": 找不到给定值的所有匹配选项。
当我开始围绕此错误消息寻找解决方案时,它会导致 SYMFONY Cookbook 中名为 "How to Use Data Transformers" 的内容;似乎一个解决方案涉及创建新的 Class 并为应该能够以更直接的方式绕过的东西编写大量代码。
有人知道吗?
我的问题是我的数组 $listForMyAttribute 是在 buildForm() 函数中定义的,它的定义依赖于一些条件。
第一次展示这个就满足了做数组的条件
按下提交按钮后,在Controller中重新生成了buildForm,第二次,不满足创建数组$listForMyAttribute[的条件=20=] 与第一次显示时一样。因此,程序 抛出 "contraint not met error",因为无法找到为该字段提交的值。
今天我遇到了完全相同的问题。解决方案很简单,如 1-2-3.
1) 创建实用程序虚拟对象 class DoNotTransformChoices
<?php
namespace AppBundle\DataTransformer;
use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface;
class DoNotTransformChoices implements ChoiceListInterface
{
public function getChoices() { return []; }
public function getValues() { return []; }
public function getPreferredViews() { return []; }
public function getRemainingViews() { return []; }
public function getChoicesForValues(array $values) { return $values; }
public function getValuesForChoices(array $choices) { return $choices; }
public function getIndicesForChoices(array $choices) { return $choices; }
public function getIndicesForValues(array $values) { return $values; }
}
2) 在您的字段中添加以下附加选项:
...
'choice_list' => new DoNotTransformChoices,
...
3) 恭喜!
在 SYMFONY FORM 中(不使用 ORM(PDO 用于数据库查询))。
我有一个 class MyEntityType,其中 buildForm 函数具有:
$builder->add('my_attribute',ChoiceType::class,array(
'choices'=>$listForMyAttribute,
'multiple'=>'true',
'attr'=>array('data-native-menu'=>'false'),
'label'=>'Multiple Select on my attribute'
));
我的属性是名为 MyEntity 的实体的数组,其中包含:
/**
* @Assert\NotBlank()
*/
private $myAttribute;
使用 getter 和 setter 变量 $myAttribute。
当我在控制器中提交表单时,它没有通过验证检查并记录了这个错误:
无法反转 属性 路径的值 "myAttribute": 找不到给定值的所有匹配选项。
当我开始围绕此错误消息寻找解决方案时,它会导致 SYMFONY Cookbook 中名为 "How to Use Data Transformers" 的内容;似乎一个解决方案涉及创建新的 Class 并为应该能够以更直接的方式绕过的东西编写大量代码。
有人知道吗?
我的问题是我的数组 $listForMyAttribute 是在 buildForm() 函数中定义的,它的定义依赖于一些条件。
第一次展示这个就满足了做数组的条件
按下提交按钮后,在Controller中重新生成了buildForm,第二次,不满足创建数组$listForMyAttribute[的条件=20=] 与第一次显示时一样。因此,程序 抛出 "contraint not met error",因为无法找到为该字段提交的值。
今天我遇到了完全相同的问题。解决方案很简单,如 1-2-3.
1) 创建实用程序虚拟对象 class DoNotTransformChoices
<?php
namespace AppBundle\DataTransformer;
use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface;
class DoNotTransformChoices implements ChoiceListInterface
{
public function getChoices() { return []; }
public function getValues() { return []; }
public function getPreferredViews() { return []; }
public function getRemainingViews() { return []; }
public function getChoicesForValues(array $values) { return $values; }
public function getValuesForChoices(array $choices) { return $choices; }
public function getIndicesForChoices(array $choices) { return $choices; }
public function getIndicesForValues(array $values) { return $values; }
}
2) 在您的字段中添加以下附加选项:
...
'choice_list' => new DoNotTransformChoices,
...
3) 恭喜!