2013-04-29 12 views
3

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

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

<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 считывает значение выделенных строк/checkbox, обрабатывает хэш-массив и передает его на 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> 

ответ

3

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

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

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

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

(Не уверен в синтаксисе, так как это число. Вы, возможно, придется использовать несколько иной код шаблона, но идея имеет.) – ikegami

+0

Я закончил с использованием хэш, как предложено. Также убрали идею статических флажков в пользу списка выбора, который создал отсортированный список флажков. – Vongrats

0

Мне нравится использовать 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); 
Смежные вопросы