obj ['prop'] вернет значение, только если obj является массивом и нет способа получить свойство объекта, если у нас есть его имя в переменной: obj [propName] вернет null
вы можете использовать точечную нотацию, которая будет проверять как массивы, так и объекты, поэтому obj.name сначала будет искать obj ['name'], затем obj-> name и последний obj-> getName (), это также объясняется далее в документации в разделе Twig для дизайнеров.
Я думаю, что проблема artyv связана с динамическим доступом к свойствам объекта, а не с простым доступом к смещениям / свойствам. См. Мой пример кода.
/* php */
$obj = new stdClass;
$obj->foo = "bar";
$template->render(array('obj, $obj));
/* twig */
{% set prop as "foo" %}
{{ obj.foo }}
// outputs "bar"
{{ obj.$prop }}
// (pseudo-code)
// would compile down to {{ obj.foo }} and output "bar"
jwpage правильно, имя свойства, которое мне нужно получить, находится в другой переменной, поэтому мне нужен эквивалент этого php-кода:
$ obj -> {$ propName}
потому что $ obj - простой объект и не реализует ArrayAccess
Эта функция не будет включена в Twig. Twig - это система шаблонов, а не полноценный язык. Динамические свойства явно выходят за рамки Twig.
Я предполагаю, что компонент сериализатора можно использовать для преобразования вложенных экземпляров stdClass во вложенные массивы.
Я думаю, просто приведя тип stdClass в массив, он будет преобразован. Зачем делать сложнее, чем есть сейчас :)
[~] php -r '$class = new stdClass;$class->prop = "hejsa";print_r((array) $class);'
Array
(
[prop] => hejsa
)
@henrikbjorn : да, приведение типов работает, однако оно не работает рекурсивно, поэтому я предлагал компонент сериализатора. очевидно, если вы знаете, что у вас нет глубоко вложенной структуры, тогда, очевидно, просто приведите к массиву, и все готово.
У меня была такая же проблема, и я решил ее с помощью фильтра. Я знаю, что это неправильный способ делать что-то, но он определенно кажется самым чистым.
В основном это сводится к следующему:
function twig_get_filter()
{
$params = func_get_args();
$object = array_shift($params);
$field = implode('', $params);
return $object->$field;
}
И использовать его можно следующим образом:
{{ object|get(text, '_', language, '_', type) }}
Динамические свойства явно выходят за рамки Twig.
Почему? Я пытаюсь разработать что-то вроде symfony datagrid, и я хотел бы использовать что-то вроде этого:
{# columns #}
{% for name, column in grid.columns %}
<td>{{ column.render(row[name])|raw }}</td>
{% endfor %}
Я не вижу лучшего решения, чем реализовать что-то вроде метода Twig_Template :: getAttribute в моем сетке данных. Мне нравится, насколько это универсально.
Потому что это крайний случай и потому что вы можете легко создать функцию, которая довольно легко делает то, что вы хотите (непроверено):
function twig_array_get_function($array, $name)
{
return $array[$name];
}
Использование:
row|array_get(name)
Да, для массивов это просто. Проблема в том, что мне нужно реализовать также доступ к получателям объектов и т.д., что уже реализовано в Twig (но нет способа использовать этот код).
Хорошие новости! Начиная с версии 1.2, вы можете получить динамический атрибут переменной с помощью новой функции attribute
(см. C609060).
Приятно видеть, что для этого добавлена поддержка. Я только начинаю работать с Twig. Насколько сложно было бы изменить синтаксис на что-то вроде
{{объект. {свойство}}} или {{объект. {метод} (attrs)}}
Я думаю, что это немного чище, чем {{атрибут (объект, метод, аргументы)}}
Может быть, вы могли бы указать мне правильное направление? Я еще не просмотрел весь исходный код.
@ rspenc29 : Я не хочу делать его «чище», так как хочу, чтобы вы дважды подумали, прежде чем использовать это в шаблоне. Это следует использовать с осторожностью, так как в большинстве случаев это запах того, что вы делаете что-то в шаблоне, что должно быть сделано в другом месте.
нет проблем. Я разберусь.
asd посвященный
Вы могли бы попробовать
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html
Самый полезный комментарий
Вы могли бы попробовать
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html