Template-Toolkit и сложные переменные - PullRequest
4 голосов
/ 11 ноября 2011

Скажем, я работаю в Perl, используя Catalyst . Я назначаю массив хешей переменной, т.е.:

my @array = ($some_hash); 
$c->stash->{foo}->{bar} = \@array;

Как выбрать элемент из $ some_hash, например, 'id', в Template Toolkit ? В Perl я могу получить к нему доступ через $c->stash->{foo}->{bar}->[0]->id ...

Вся помощь очень ценится, и я немного новичок в Perl, так что, если что-то выглядит неуместно, пожалуйста, дайте мне знать. Заранее спасибо ...

Ответы [ 5 ]

11 голосов
/ 11 ноября 2011

Template Toolkit использует унифицированный синтаксис для доступа к элементам сложных структур. Это должно делать то, что вы хотите:

[% foo.bar.0.id %]
4 голосов
/ 11 ноября 2011

Следующий тип полезен, когда вы хотите разобраться, что происходит в сложных структурах данных в TT :

[% USE Dumper; Dumper.dump_html(foo) %]

.. посмотрите, какие данные TT считает, что у вас есть:

[% foo %]

... или дальше по кроличьему уорну:

[% FOREACH x IN foo.keys; 
USE Dumper; Dumper.dump_html(foo.$x);
foo.$x ; # to see what kind of ref it is
END %]
2 голосов
/ 21 ноября 2011

Я ценю, что вы использовали известные foo и bar методы / ключи в вашем примере.

Одна ошибка в ТТ - это столкновение имени и имени хеш-ключа VMethod. Возможно ли, что имя вашего ключа конфликтует с одним из встроенных ТТ VMethods? .first, .last, .length или даже .keys являются кандидатами для этого, и , возможно, есть и другие .

Это может привести к неожиданным результатам, особенно если вы добавите Автоматическое продвижение Скалярного списка в виртуальные методы Поведение.

Решением этой проблемы является использование item() VMethod, то есть:

[% foo.item("bar").0.id %]
0 голосов
/ 21 ноября 2011

Возможно ли, что вы установили локальную переменную TT с именем foo где-то в существующем коде?Если это произойдет, вы можете получить некоторые загадочные результаты в духе «Я согласен, что это должно работать; но это не так».

Один из способов проверить это - сделать ваш foo явным, т.е.:

[% c.stash.foo.bar.0.id %]

Если это приводит к результату, то где-то возникла проблема с пространством имен.

0 голосов
/ 14 ноября 2011

Так как $some_hash кажется благословенным от вашего доступа к нему в Perl, я бы попробовал что-то вроде

[% foo.bar.0.id() %]

и посмотрите, работает ли это.

...