将 EntityType 与文本输入一起使用
use the EntityType with text input
我创建了一个 EntityType
表格,您可以在其中添加您对活动的参与字段和您的位置。不幸的是,字段的数量和名称在页面上动态更新,因此在创建表单时,我没有所有可用的字段(或者更糟糕的是,一些字段不再存在)
为简单起见,我想使用一个简单的文本类型,我的 javascript 可以在其中输入一个 Id
数字和 link 来自数据库的相应元素。
代码很简单
class FieldPositionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('position', EntityType::class, [
'class' => Position::class,
'choice_label' => 'name'
])
->add('field', EntityType::class, [
'class' => Field::class,
'choice_label' => 'id'
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Participation::class,
]);
}
}
但我更喜欢 TextType
.
而不是 EntityType
我想我需要对 setter 进行一些修改,但我不知道如何像 EntityType
那样将 Id 转换为实体。
Link 对于查询构建器:https://symfony.com/doc/current/reference/forms/types/entity.html#ref-form-entity-query-builder
如评论中所述,尝试使用它。我不能再阻止你了,因为我没有看到你的其余逻辑,但为了限制实体字段中显示的条目,它看起来像这样:
$builder->add('users', EntityType::class, [
'class' => User::class,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.username', 'ASC');
},
'choice_label' => 'username',
]);
正如 Cerad, the dataTransformer 所建议的那样是解决方案。
所以为了 position
,我创建了一个 dataTransformer
class PositionToIdTransformer implements DataTransformerInterface
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function transform($position)
{
if (null === $position) {
return '';
}
return $position->getId();
}
public function reverseTransform($id)
{
if (!$id){
return;
}
$position = $this->em->getRepository(Position::class)->find($id);
if (null === $position){
throw new TransformationFailedException(sprintf("the position '%s' does not exist!", $id));
}
return $position;
}
}
我在 formBuilder
中使用的:
class FieldPositionType extends AbstractType
{
private $pt; //PositionToIdTransformer
public function __construct(PositionToIdTransformer $pt)
{
$this->pt = $pt;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('position', TextType::class)
;
$builder->get('position')->addModelTransformer($this->pt);
}
}
它就像一个魅力!
我创建了一个 EntityType
表格,您可以在其中添加您对活动的参与字段和您的位置。不幸的是,字段的数量和名称在页面上动态更新,因此在创建表单时,我没有所有可用的字段(或者更糟糕的是,一些字段不再存在)
为简单起见,我想使用一个简单的文本类型,我的 javascript 可以在其中输入一个 Id
数字和 link 来自数据库的相应元素。
代码很简单
class FieldPositionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('position', EntityType::class, [
'class' => Position::class,
'choice_label' => 'name'
])
->add('field', EntityType::class, [
'class' => Field::class,
'choice_label' => 'id'
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Participation::class,
]);
}
}
但我更喜欢 TextType
.
EntityType
我想我需要对 setter 进行一些修改,但我不知道如何像 EntityType
那样将 Id 转换为实体。
Link 对于查询构建器:https://symfony.com/doc/current/reference/forms/types/entity.html#ref-form-entity-query-builder
如评论中所述,尝试使用它。我不能再阻止你了,因为我没有看到你的其余逻辑,但为了限制实体字段中显示的条目,它看起来像这样:
$builder->add('users', EntityType::class, [
'class' => User::class,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.username', 'ASC');
},
'choice_label' => 'username',
]);
正如 Cerad, the dataTransformer 所建议的那样是解决方案。
所以为了 position
,我创建了一个 dataTransformer
class PositionToIdTransformer implements DataTransformerInterface
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function transform($position)
{
if (null === $position) {
return '';
}
return $position->getId();
}
public function reverseTransform($id)
{
if (!$id){
return;
}
$position = $this->em->getRepository(Position::class)->find($id);
if (null === $position){
throw new TransformationFailedException(sprintf("the position '%s' does not exist!", $id));
}
return $position;
}
}
我在 formBuilder
中使用的:
class FieldPositionType extends AbstractType
{
private $pt; //PositionToIdTransformer
public function __construct(PositionToIdTransformer $pt)
{
$this->pt = $pt;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('position', TextType::class)
;
$builder->get('position')->addModelTransformer($this->pt);
}
}
它就像一个魅力!