我正在使用 CGI 和HTML::Template。我需要在所有包含标签的模板中添加下面的<form>
标签(标签应该添加在<form>
标签内)。
<input type="hidden" value="TO_BE_PARSED_FROM_CGI">
我不想手动编辑所有模板文件。HTML::Template中是否有可用的方法来执行此操作?在创建 HTML::Template 的构造函数时可以传递的某种类型的钩子?
我正在使用 CGI 和HTML::Template。我需要在所有包含标签的模板中添加下面的<form>
标签(标签应该添加在<form>
标签内)。
<input type="hidden" value="TO_BE_PARSED_FROM_CGI">
我不想手动编辑所有模板文件。HTML::Template中是否有可用的方法来执行此操作?在创建 HTML::Template 的构造函数时可以传递的某种类型的钩子?
您不必手动修改所有模板文件。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>
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 参数。