2011-09-11 19 views
11
Aşağıdaki kodu yapmak istiyorum

:Bir değişkenin belirlediği Twig üyesine nasıl erişirim?

{% set rooms = [] %} 
{% set opts = { 
    'hasStudio': 'Studio', 
    'has1Bed': '1 BR', 
    'has2Bed': '2 BR', 
    'has3Bed': '3 BR', 
    'has4BedPlus': '4 BR+' 
} 
%} 
{% for key, val in opts %} 
    {% if bldg.{key} is none %} {# PROBLEM HERE.. HOW TO FIND THIS MEMBER!? #} 
     {{ val }}? 
    {% elseif bldg.{key} %} 
     {{ val }} 
    {% else %} 
     No {{ val }} 
    {% endif %} 
{% endfor %} 

nasıl key değeriyle adlandırılır bldg üyesi özelliklerini diyorlar? Ben

bldg.hasStudio 
bldg.has1Bed 
bldg.has2Bed 
etc.... 

cevap

3

Bunu yapmak için kendi dal uzantısı yazdı.İstediğim şekilde kullanmak olacaktır: Burada

{% set keyVariable = 'propertyName' %} 
{{ obj.access(keyVariable) }} 
{# the above prints $obj->propertyName #} 

öyle:

// filename: Acme/MainBundle/Extension/AccessTwigExtension.php 
namespace Acme\MainBundle\Extension; 

class AccessTwigExtension extends \Twig_Extension 
{ 
    public function getFilters() 
    { 
     return array(
      'access' => new \Twig_Filter_Method($this, 'accessFilter'), 
     ); 
    } 

    public function getName() 
    { 
     return 'access_twig_extension'; 
    } 

    // Description: 
    // Dynamically retrieve the $key of the $obj, in the same order as 
    // $obj.$key would have done. 
    // Reference: 
    // http://twig.sensiolabs.org/doc/templates.html 
    public function accessFilter($obj, $key) 
    { 
     if (is_array($obj)) { 
      if (array_key_exists($key, $obj)) { 
       return $obj[$key]; 
      } 
     } elseif (is_object($obj)) { 
      $reflect = new \ReflectionClass($obj); 
      if (property_exists($obj, $key) && $reflect->getProperty($key)->isPublic()) { 
       return $obj->$key; 
      } 
      if (method_exists($obj, $key) && $reflect->getMethod($key)->isPublic()) { 
       return $obj->$key(); 
      } 
      $newKey = 'get' . ucfirst($key); 
      if (method_exists($obj, $newKey) && $reflect->getMethod($newKey)->isPublic()) { 
       return $obj->$newKey(); 
      } 
      $newKey = 'is' . ucfirst($key); 
      if (method_exists($obj, $newKey) && $reflect->getMethod($newKey)->isPublic()) { 
       return $obj->$newKey(); 
      } 
     } 
     return null; 
    } 
} 

benim programda kullanmak için, ben de benim bağımlılık enjeksiyonuna birkaç satır eklemek zorunda:

//filename: Acme/MainBundle/DependencyInjection/AcmeMainInjection.php 
// other stuff is here.... 
public function load(array $configs, ContainerBuilder $container) 
{ 
    // other stuff here... 
    $definition = new Definition('Lad\MainBundle\Extension\AccessTwigExtension'); 
    $definition->addTag('twig.extension'); 
    $container->setDefinition('access_twig_extension', $definition); 
    // other stuff here... 
2

köşeli parantez kullanın sözdizimi değerlerini almak istiyorum:

+2

Maalesef bu nesneler için diziler için çalışır, ancak :( –

1

bldg[key] Normalde

{% test.getAction() %} 

test nesne ve getAction() fonksiyonudur nokta operatörüyle Nesneleri erişebilirler.

21

Kısa cevap: doğrudan/doğal olarak mümkün ... henüz.

Görünüşe göre, tam olarak bu ihtiyacı karşılayan attribute() adlı Twig 1.2'ye yeni bir işlev eklediler.

Ancak bu güne kadar sadece Twig 1.1.2'yi indirebilirsiniz; Bu yüzden 1.2, muhtemelen bir sürüm numarası bulamıyorum - SF2 ile birlikte gönderilmez. (1.2 şimdi hazır!)

Bunu farklı numaralarla çözmeye çalıştım; 1.2 bunu düzeltecektir.

Yeni sürüm 1.2'de: Özellik işlevi Twig 1.2'ye eklenmiştir.

nitelik değişkenin bir “dinamik” özelliğini erişmek için kullanılabilir :

{{ attribute(object, method) }}

{{ attribute(object, method,arguments) }}

{{ attribute(array, item) }}


Ama olsa neler yapabileceğini, ihtiyacınız olan her şeye dikkat ederek sınıfınıza bir yöntem ekliyor. Böyle bir şey:

php:

class C 
{ 
    public $a = 1; 
    public $b = 2; 

    public function getValueForKey($k) 
    { 
     return $this->$k; 
    } 
} 

[ providing an instance of C to the template as 'obj' ] 

dal:

{% set x = "a" %} 
{{ obj.getValueForKey(x) }} 

irade çıkışı '1'

+0

Teşekkür bilgi için. Bu çözüm ile sorunum dal ihtiyaçları nedeniyle sadece orada getters ile benim varlık sınıfları da bulandırmak istemedim ki onları ... Twil 1.2'de –

+1

özellik özelliği harika –