2013-03-07 35 views
5

成像,我有一個對象,它可以在一根樹枝模板被稱爲像這樣:樹枝字符串轉換爲對象,它代表

{{ object1.object2.object3.property3A }} 

好,它會告訴我的內容,如果我們使用PHP寫的是:

$object1->getObject2()->getObject3()->getProperty3A(); 

我的問題是,如果我有一個字符串,

$refString="object1.object2.object3.property3A"; 

,然後將其傳遞給小枝,如何庫侖我得到property3A?根據我的經驗,我們可以在php中這樣做:

$refString="object1->getObject2()->getObject3()->getProperty3A()"; 
echo $$refString; 

但我不知道如何使它在樹枝中工作。

+0

它可能會以使用屬性:http://twig.sensiolabs.org/doc/functions/attribute.html,但不知道如何與您的多個電話行爲,你可能需要拆分你的點,然後遞歸調用它。 – catchamonkey 2013-03-07 15:56:25

+0

是的,我已經試過屬性,如果你有property1A,很容易。但功能屬性不適用於多層次。 – ferdinandfly 2013-03-07 15:57:54

+0

因此,您需要自己做的遞歸在第一個點上分開字符串,如果剩餘的右側部分有一個點,則再次遞歸,否則使用點的左側返回屬性,並且在最後一個循環中。 – catchamonkey 2013-03-07 16:05:57

回答

1

我沒有測試過這個,但我認爲它應該做的伎倆。

{# 
    recursively reading attributes from an object 
    ! object1 must be available ! 
    theValue is the value of property3A 
#} 
{% for key in "object1.object2.object3.property3A"|split('.') %} 
    {% if not loop.first %}{# skip the 'object1' part #} 
    {% set theValue = attribute(theValue|default(object1), key) %} 
    {% endif %} 
{% endfor %} 
0

我不認爲有一個「捷徑」來做到這一點樹枝。如果你找不到一個簡單的方法來做到這一點,你可以寫你自己的擴展名,將STRING_TYPE轉換爲VAR_TYPE。

Twig internals可能會讓你走上正軌。 This是樹枝延伸可行的例子,可能會激勵你。

0

我遇到了類似的情況。如果您需要的對象可用於該模板,並且您知道該字符串的名稱,則此答案僅適用於該模板。

在這種情況下,您可以用枝條的全局變量_context訪問對象:

{% set object1 = _context['object1'] %} 

,然後訪問方法和對象變量爲正常:

{{ object1.object2.object3.property3A }}