2017-12-18 434 views
4

我面臨一個問題,試圖遍歷樹枝表單主題中的所有表單元素。其實我用這個來遍歷他們:樹枝 - 遍歷表單域

{% for child in form.parent.children %} 

我沒有發現它在文檔,我只是把表單變量,發現道路上的字段。這實際上適用於所有表單,除非表單本身有一個名爲的子項。我不知道這是否是一個錯誤,因爲如果你只是轉儲form對象的結構是在兩種情況下是相同的:

enter image description here

但是,如果您嘗試訪問form.parent.children當它有一個children參數裏面你贏了「T獲得該數組的"children",而直接結果:

enter image description here

正如你在這種情況下看到form.parent.children直接指形式的兒童元素(同已識別r#1592)。如果您嘗試獲得form.parent.children.parent.children,您將再次獲得children元素,因此如果表單包含名爲children的參數,則基本上使用此方法不可能遍歷表單字段。

這是一個錯誤還是我錯過了什麼?也許還有另一種方法來實現我想要的?

回答

3

是的,這是與the way Twig accesses each attribute for convenience相關的名稱衝突,因爲FormView被宣佈爲\ArrayAccessit has priority over object's properties。順便說一下,parentvars屬性也會發生同樣的情況,但現在讓我們專注於解決方案,而不是解決問題。

由於這是一個樹枝的問題,解決方案應針對這個方向。一種解決方法可能是create a custom function是獲得FormView的正確屬性:

public function getFunctions() 
{ 
    return array(
     new TwigFunction('formview_prop', array($this, 'getFormViewProperty')), 
    ); 
} 

public function getFormViewProperty(FormView $formView, string $prop) 
{ 
    // parent, children or vars 
    return $formView->{$prop}; 
} 

所以,使用此功能時,您可以訪問到視圖的屬性,而不是形式的字段(如果有名稱衝突):

{% for child in formview_prop(form, 'parent') %} 

然後,它將遍歷父視圖的所有字段元素(子元素)。但是,我更願意通過創建三個函數formview_parent,formview_childrenformview_vars來代替,並且不要傳遞第二個參數。


在這個意義上,你可能也需要驗證表單是否具有父視圖與否,這樣以來Symfony 2.7.39, 2.8.32, 3.3.14, 3.4.1, 4.0.1 was introduced(如bug修正)的新枝條的測試功能命名爲rootform是避免這種衝突,尤其是對parent物業:

{% if form is rootform %} 
+0

謝謝您的解釋和參考鏈接。 – DrKey