2016-09-16 87 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'进行操作。如果不清楚模板在做什么,上述方法实际上是更好的选择。 –