2013-04-29 1 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가 단일 ID의 유효성을 검사하기 위해 각 확인란마다 10 번 반복됩니다.

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

답변

3

그런 다음 해시를 사용하십시오.

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

그럼 당신은 내가 이러한 유형의 문제에 대한 템플릿 :: 툴킷과 함께 HTML :: FillInForm를 사용하려면

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

(이 숫자이기 때문에 구문에 대한 확실하지. 당신은 약간 다른 템플릿 코드를 사용해야 할 수도 있습니다,하지만 아이디어는 보유하고 있습니다.) – ikegami

+0

나는 해시를 사용하여 끝났다. 또한 체크 박스의 정렬 된 목록을 만든 선택 목록에 대한 정적 체크 상자 아이디어를 없앴습니다. – Vongrats

0

를 사용할 수 있습니다. 제안

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