在Form中使用DataTransformer后访问twig中的实体属性

时间:2014-01-07 15:11:54

标签: php symfony symfony-forms

我在下面的代码中创建了一个自定义表单类型,它将实体转换为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字段类型作为提案,但似乎在不久的将来无法使用

1 个答案:

答案 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 %}