3

我正在使用 Template Toolkit 和 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。

我一直在尝试使用 Template Toolkit::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> 
4

2 回答 2

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
于 2013-04-29T19:02:52.383 回答
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 );
于 2013-04-29T19:25:33.420 回答