2013-04-29 69 views
3

我正在使用模板工具包和perl来生成网页。如果数组中存在该值,我将有一个ID号的数组,用于打开和关闭复选框。我想知道是否有一种更有效的方法可以在页面加载时打开和关闭一组复选框。有一些先前的代码,它在我得到之前加载时感觉很迟钝。我不想再等待等待时间。使用模板工具包勾选复选框而不使用多个循环

这工作:

<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个ID。这意味着FOREACH将为每个复选框循环10次,以验证单个ID。

我一直试图使用模板工具包:: EXIST和类似的方法来检查ID是否在阵列中,但它没有按照我想要的方式工作。

这不起作用:这会勾选不在范围内的值的复选框。

<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> 

回答

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 2013-04-29 21:16:43

+0

我结束了使用哈希的建议。还废弃了静态复选框的想法,以支持创建复选框排序列表的选择列表。 – Vongrats 2013-05-14 15:37:00

0

我喜欢用HTML :: FillInForm一起模板::工具包对于这种类型的问题。

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);