2016-09-16 81 views
-1

我正在使用CGI和HTML::Template。我需要在所有包含<form>標記的模板中添加以下標記(標記應添加在<form>標記內)。使用HTML :: Template添加標籤

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

我不想手動編輯所有模板文件。 HTML::Template有沒有可用的方法來做到這一點?我可以在創建HTML :: Template的構造函數時傳遞一些類型的鉤子?

+0

您不必手動修改所有模板文件。 Perl有HTML解析器,可以幫助您找到需要進行更改的位置。繼續修復模板***一次***,而不是修改您的代碼,以便每次都運行它。 –

+0

@SinanÜnür我下面的例子可以做到這一點 –

+0

@ Dr.Avalanche Sure。總的來說,我不喜歡唾棄的方法,除非你必須使用它們,但也要投票給你答案。 –

回答

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 ::模板中可用的方法來做到這一點?

這又是什麼? ;)不,你需要閱讀和操作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> 

編輯。

由於我們不知道您在模板中做了什麼,所以最簡單的方法是對現有代碼的輸出進行任何更改。這意味着您可以安全地將上述方法添加到上述方法之前,您目前正在打印模板的輸出。您可以使用提供的代碼作爲一次性更新來實際將更改寫回到您的模板,而值可以是HTML :: Template參數而不是foo

+0

如果這可能是一個反覆出現的問題,而是添加一個標籤,然後包含隱藏的標籤。 (記得要正確地逃脫) – FtLie

+0

@FtLie上次他們問這個問題時,他們表示他們根本不想編輯模板文件:編輯和問題'我不想手動編輯所有模板文件。 ' –

+0

@FLLie對不起,誤解了你的觀點。是的,這是另一種選擇,但問題是爲了獲得渲染模板,我們需要對'$ template-> output'進行操作。如果不清楚模板在做什麼,上述方法實際上是更好的選擇。 –