Я занимаюсь разработкой приложения Catalyst, которое использует Template::Toolkit
в качестве движка шаблонов.Одна страница нуждается в списке равных элементов ввода.Они могут быть взяты из массива, но мне нужен и порядок сортировки, и описательная метка для элемента.
Для того, чтобы иметь порядок сортировки, я бы использовал массив.Для хранения дополнительного значения на ключ идеально подходит хеш.Как совместить оба в ТТ ?Я мог бы использовать обе вещи, но это выглядит некрасиво и может привести к ошибкам при изменении полей.
Однако я предпочитаю делать это в TT, потому что как описания, так и порядок элементов формы являются интерфейсной вещью.
Вот как я бы сделал это на чистом Perl:
#!/usr/bin/perl -w
use 5.10.0;
# definition of description and order in 1 step
my @fields = (
property_foo => "Some property",
property_bar => "Important field",
property_baz => "Something else",
);
# extract information
my %descriptions = @fields;
my @order = @fields[grep {($_ + 1) % 2} 0..(scalar @fields - 1)];
say "=== natural perl sort order ===";
foreach (keys %descriptions) {say $_};
say "=== wanted output ===";
foreach (@order) {
say $descriptions{$_} . ": [label for $_]";
}
Выходы:
=== natural perl sort order ===
property_baz
property_foo
property_bar
=== wanted output ===
Some property: [label for property_foo]
Important field: [label for property_bar]
Something else: [label for property_baz]
Вот что я пишу в своем шаблоне:
[%
order = (
property_foo,
property_bar,
property_baz,
);
descriptions = {
property_foo => "Some property",
property_bar => "Important field",
property_baz => "Something else",
}
FOREACH property IN order %]
[% descriptions.$property %]: <input name="[% property %]" />
[% END %]
Однако действительно некрасиво иметь одну и ту же информацию (список полей) дважды.Я хочу избежать редактирования списка дважды, и с более длинным списком полей это становится действительно раздражающим (около 20 элементов, недостаточно длинных, чтобы выполнять некоторые операции с базой данных).