2016-09-16 5 views
-1

저는 CGI와 HTML::Template을 사용하고 있습니다. <form> 태그 (태그는 <form> 태그 안에 추가되어야 함)가 포함 된 모든 템플릿에 아래 태그를 추가해야합니다.HTML :: 템플릿을 사용하여 태그 추가

<input type="hidden" value="TO_BE_PARSED_FROM_CGI"> 

모든 템플릿 파일을 수동으로 편집하고 싶지 않습니다. 이 작업을 수행하려면 HTML::Template에서 사용할 수있는 방법이 있습니까? HTML :: Template 생성자를 생성하는 동안 전달할 수있는 후크 유형

+0

모든 템플릿 파일을 수동으로 수정할 필요는 없습니다. Perl에는 변경 사항이 필요한 위치를 찾는 데 도움이되는 HTML 파서가 있습니다. ************************************************************************************************************** –

+0

@ SinanÜnür 아래 예제를 통해 –

+0

@ Dr.Avalanche 확인해보십시오. 일반적으로, 나는 그들을 사용하지 않으면, 뻔뻔스런 방법의 팬이 아니지만, 당신의 답변도 투표했다. –

답변

2

모든 템플릿 파일을 수동으로 수정할 필요는 없습니다. Perl에는 변경 사항이 필요한 위치를 찾는 데 도움이되는 HTML 파서가 있습니다. 계속해서 매번 실행될 때마다 코드를 수정하는 대신 템플릿을 한 번 수정하십시오. 아래에서는 설명 목적으로 \*DATA을 사용하지만 템플릿 파일 목록은 어디서나 올 수 있습니다.

먼저 파일을 백업하십시오 (버전 제어 시스템의 분기에서이 작업을 수행하는 것이 더 좋습니다).

#!/usr/bin/env perl 

use utf8; 
use strict; 
use warnings; 
use open qw[ :std :encoding(UTF-8) ]; 

use HTML::TokeParser::Simple; 

run(\@ARGV); 

sub run { 
    my $argv = shift; 
    my $parser = HTML::TokeParser::Simple->new(handle => \*DATA); 

    while (my $token = $parser->get_token) { 
     print $token->as_is; 
     if ($token->is_start_tag('form')) { 
      print qq{\n<input type="hidden" name="sid" value="<TMPL_VAR NAME=SID>">\n}; 
     } 
    } 
} 

__DATA__ 
<h3>Here is a form:</h3> 

<form 
    method="POST" 
    action="https://example.com/action-action-action.pl" 
    id="action" 
    name="actionable_form"> 

<label for="date">Date:</label> 
<input type="date" name="date" id="date"> 

<input type="submit"> 

</form> 
1

HTML :: Template에서 사용할 수있는 방법이 있습니까?

다시? ;) 아니요, 원하는 것을하기 위해 DOM을 읽고 조작해야합니다. HTML :: Template은 특정 태그/마커에서만 작동합니다. $template->output()을 변수에 저장하십시오. Mojo::DOM과 같은 구문 분석기로 변수를 읽고 양식의 인스턴스를 찾고 콘텐츠를 추가하십시오.

#!/usr/bin/perl 
use strict; 
use warnings; 
use Mojo::DOM; 

# fake output of $template->output; 

my $html = << 'HTML'; 
    <html> 
    <head> 
     <title>test</title> 
    </head> 
    <body> 
     <form method="post"> 
     <input type="text" id="name"> 
     </form> 
    </body> 
    </html> 
HTML 

# you say you want to parse this from CGI 
my $value ='foo'; 

# what you want to add 
my $addme = "<input type='hidden' value='$value'>"; 

my $dom = Mojo::DOM->new(); 

$dom->parse($html)->at('form')->child_nodes->first->append($addme)->root; 
print $dom; 

인쇄 :

<html> 
    <head> 
      <title>test</title> 
     </head> 
     <body> 
      <form method="post"> 
      <input type="hidden" value="foo"><input id="name" type="text"> 
      </form> 
     </body> 
    </html> 

편집이 예는 솔루션을 보여줍니다.

템플릿에서 수행중인 작업을 잘 모르기 때문에 기존 코드의 출력 결과를 기반으로하는 것이 가장 좋습니다. 앞서 말한 방법을 안전하게 추가 할 수 있다는 의미는 현재 템플릿의 출력물을 인쇄하고 있다는 것입니다. 하나의 업데이트로 제공된 코드를 사용하여 실제로 템플릿에 변경 사항을 다시 쓸 수 있으며 foo이 아닌 값이 HTML :: Template 매개 변수가 될 수 있습니다.

+0

이 문제가 계속되는 경우 숨겨진 태그를 포함하는 태그를 추가하십시오. – FtLie

+0

@FtLie 그들이이 질문을 한 마지막 질문은 템플릿 파일을 전혀 편집하고 싶지 않다는 것입니다. 편집 및 질문에서 '나는 모든 템플릿 파일을 수동으로 편집하고 싶지 않습니다. ' –

+0

@FtLie 죄송합니다. 귀하의 의견이 잘못 이해되었습니다. 네, 또 다른 옵션이지만 문제는 렌더링 된 템플릿을 얻기 위해'$ template-> output'에 따라 행동해야한다는 것입니다. 템플릿이 무엇을하는지 정확하게 알지 못하면 위의 방법이 실제로 더 나은 선택입니다. –