我在下面的代码中创建了一个自定义表单类型,它将实体转换为id以创建自动完成字段。
class EntityIdType extends AbstractType
{
/**
* @var EntityManager
*/
private $em;
/**
* @param EntityManager $em
*/
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$transformer = new EntityIdTransformer($this->em,$options['entity_class']);
$builder->addModelTransformer($transformer);
}
}
我还为此表单类型创建了一个自定义窗口小部件,我想获取表示该实体的字符串
{% block entity_id_widget %}
{% spaceless %}
<input type="hidden" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/>
<input autocomplete="off" value="{{ **GET_VALUE_HERE** }}">
{% endspaceless %}
{% endblock %}
更新
EntityIdTransformer的transform方法只返回实体的id,而reverse transform返回与作为参数传递的id相关联的实体
所有这一切的目标是为具有多行的实体创建自动完成输入,并在提交表单时保留更改。如果对于这个例子,任何其他方法都可能更好,我会对它进行更新。
似乎已在公关中添加了entity_identifier
字段类型作为提案,但似乎在不久的将来无法使用
答案 0 :(得分:1)
最后,我能够从DataTransformer中获取字符串返回一个数组,其中包含一个id和一个描述实体的字符串
public function transform($entity)
{
if (null === $entity) {
return "";
}
return array("id" => $entity->getId(), "name" => $entity->__toString());
}
现在渲染我的自定义小部件时,我可以访问这些值
{% block entity_id_widget %}
{% spaceless %}
<input type="hidden" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value.id }}" {% endif %}/>
<input class="blocked" autocomplete="off" {% if value is not empty %}value="{{ value.name }}" {% endif %}>
{% endspaceless %}
{% endblock %}