Pregunta

Quiero hacer el siguiente código:

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

¿Cómo llamo a las propiedades de miembro de bldg que se nombran por el valor de key?Quiero obtener los valores de

 bldg.hasStudio
 bldg.has1Bed
 bldg.has2Bed
 etc....
¿Fue útil?

Solución 2

Escribí mi propia extensión twig para hacer esto.Lo usarías de la manera que yo quisiera:

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

Aquí está:

// 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;
    }
}

Para usarlo en mi programa, también tuve que agregar algunas líneas a mi inyección de dependencia:

//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...

Otros consejos

Respuesta corta: no es directa / nativa posible ... todavía.

Aparentemente, agregaron una nueva función a Twig 1.2 llamada atributo () que aborda exactamente esa necesidad.

Pero como hasta el día de hoy solo puedes descargar Twig 1.1.2; por lo que es probable que 1.2 no se envíe con SF2, aunque no puedo encontrar un número de versión. (¡1.2 ya está disponible!)

Traté de resolver eso con diferentes trucos, pero fue en vano; 1.2 lo solucionará.

Nuevo en la versión 1.2: la función de atributo se agregó en Twig 1.2.

El atributo se puede utilizar para acceder a un atributo "dinámico" de una variable:

{{ attribute(object, method) }}

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

{{ attribute(array, item) }}


Pero lo que puedes hacer es agregar un método a tu clase que se encargue de lo que necesites. algo así:

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' ]

ramita :

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

generará '1'

Utilice la sintaxis de corchetes: bldg[key]

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top