2013-04-29 67 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);