2014-01-07 87 views
1

下面的代碼創建一個自定義窗體類型,將實體轉換爲ID以創建自動填充字段。在窗體中使用DataTransformer後在樹枝中訪問實體屬性

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

UPDATE

的EntityIdTransformer的變換方法只是返回實體的ID並進行反向變換返回與作爲參數傳遞的ID關聯的實體

所有這些目標都是爲具有多行的實體創建自動完成輸入,並在提交表單時保留更改。如果任何其他方法可能對這個例子更好,我會對其進行評估。

看來,一個entity_identifier字段類型已作爲一個公關提案,但似乎沒有在不久的將來,產品尚未

+0

什麼是字符串你的問題?那個數據轉換器的代碼在哪裏?你有什麼嘗試? – ferdynator

+0

@ byf-ferdy我更新了更多的信息。我認爲autocompleting實體是相當普遍的,但我沒有遇到任何比使用數據轉換器更好的解決方案。它通常很好,但我不知道如何獲取與每個實體相關的字符串,當我渲染小部件時,我只能獲得實體的Id,因爲數據轉換器 –

回答

1

最後我能得到的字符串返回從DataTransformer與數組標識和描述實體

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 %} 
+0

搜索了幾個小時後,我做了同樣的事情。遺憾的是,你無法從表單中訪問實體本身,畢竟它已經加載了實體和結果。 – tftd

相關問題