Использование Template Toolkit для установки флажка без использования нескольких циклов

Я использую Template Toolkit и Perl для создания веб-страницы. У меня есть массив с идентификационными номерами, которые включают и выключают флажки, если это значение существует в массиве. Мне было интересно, есть ли более эффективный способ установить и отключить группу флажков при загрузке страницы. Есть какой-то предыдущий код, и он кажется медленным для загрузки, прежде чем я его получил. Я не хочу увеличивать время ожидания.

Это работает:

<label for="checkFedGround">
    <input type="checkbox" name="Shipping" id="checkFedGround" value="11"
        [% FOREACH ShippingID IN data.ShippingID %]
            [% IF ShippingID == 11 %] checked="checked" 
            [% END %]
        [% END %]
     enabled />             
        FedEx Ground
</label>

Проблема в том, что для каждого из моих типов доставки придется выполнять цикл FOREACH. Мне кажется, будет много ненужной обработки. Допустим, в массиве 30 флажков и 10 идентификаторов. Это означает, что FOREACH будет проходить 10 раз для каждого флажка только для проверки одного идентификатора.

Я пытался использовать Template Toolkit::EXIST и аналогичные методы, чтобы проверить, находится ли идентификатор в массиве один раз, но он не работает так, как я хочу.

Это НЕ работает: это устанавливает флажок для значений, которые не входят в область действия.

<input type="checkbox" name="Shipping" id="checkFedGround" value="11" 
    [% IF (data.ShippingID(11)) %] checked="checked"
[% END %]               
enabled />
FedEx Ground

Кто-нибудь знает лучший способ сделать это?

ОБНОВЛЕНИЕ/РЕШЕНИЕ: Спасибо за совет. Как и предполагалось, я использовал хэш для хранения данных. Я также отказался от идеи использования статических флажков в пользу списка выбора, который создает отсортированный список. JQuery считывает значение выбранных строк/флажков, обрабатывает хеш-массив и передает его в Perl.

<table> ...
    <td> <input type="checkbox" name="ShippingID" value="[% service.ShippingID %]"
        [% IF service.default %] checked="checked" [% END %]
    style="margin: 0px;" />
</td> </table>
....
<select id="ShippingMethodSelect">
    <option value="">Add Shipping Method...</option>
    [% FOREACH service IN data.Shipping %]
        <option value="[% service.ShippingID %]">[% service.description %]</option>
    [% END %]
</select> 

person Vongrats    schedule 29.04.2013    source источник


Ответы (2)


Тогда не используйте массив, используйте хеш.

$data->{ShippingIDs} = { map { $_ => 1 } @ShippingIDs };

Затем вы можете использовать

<input type="checkbox" name="Shipping" id="checkFedGround" value="11" 
    [% IF data.ShippingID.11 %] checked="checked" [% END %]
    enabled />
FedEx Ground
person ikegami    schedule 29.04.2013
comment
(Не уверен в синтаксисе, так как это число. Возможно, вам придется использовать немного другой код шаблона, но идея верна.) - person ikegami; 30.04.2013
comment
В итоге я использовал хэш, как было предложено. Также отказался от идеи статических флажков в пользу списка выбора, который создавал отсортированный список флажков. - person Vongrats; 14.05.2013

Мне нравится использовать HTML::FillInForm вместе с Template::Toolkit для такого рода задач.

use strict;
use warnings;
use Template::Toolkit;
use HTML::FillInForm;

my $template = qq(<label for="checkFedGround">FedEx Ground</label>
    <input type="checkbox" name="Shipping" id="checkFedGround" value="11" enabled />
);
my $params = {}; # Assuming you actually have some other work happening in TT
my $tt = Template::Toolkit->new;
$tt->process( $template, $params, \my $output );
my $form_data = { Shipping => [11,12] };
my $final_html = HTML::FillInForm->fill( \$output, $form_data );
person RickF    schedule 29.04.2013