【问题标题】:Using HTML::Template to add a tag使用 HTML::Template 添加标签
【发布时间】:2017-01-24 15:42:29
【问题描述】:

我正在使用 CGI 和 HTML::Template。我需要在所有包含<form>标签的模板中添加下面的标签(标签应该添加到<form>标签内)。

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

我不想手动编辑所有模板文件。 HTML::Template 有什么方法可以做到这一点吗?在创建 HTML::Template 的构造函数时可以传递的某种类型的钩子?

【问题讨论】:

  • 您不必手动修改所有模板文件。 Perl 具有 HTML 解析器,可以帮助您找到需要进行更改的位置。继续并修复模板一次,而不是每次运行时都修改代码。
  • @SinanÜnür 我下面的例子可以做到这一点
  • @Dr.Avalanche 当然。一般来说,除非必须使用它们,否则我不喜欢 slurpy 方法,但我也对你的答案投了赞成票。
  • 我们在聊天中讨论的解决方案不起作用吗?

标签: perl cgi perl-html-template


【解决方案1】:

HTML::Template 中是否有可用的方法来执行此操作?

又是这个? ;) 不,你需要阅读和操作 DOM 来做你想做的事。 HTML::Template 仅适用于它的特定标签/标记。将$template-&gt;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 参数。

【讨论】:

  • 如果这可能是一个反复出现的问题,不如添加一个标签 然后包含隐藏标签。 (记得正确逃生)
  • @FtLie 他们最后一次问这个问题时说他们根本不想编辑模板文件:编辑并在问题'我不想手动编辑所有模板文件. '
  • @FtLie 对不起,误解了你的意思。是的,这是另一种选择,但问题是为了获得渲染的模板,我们需要对$template-&gt;output 采取行动。在不确切知道模板在做什么的情况下,上述方法实际上是更好的选择。
【解决方案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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2017-10-11
    • 2015-10-31
    相关资源
    最近更新 更多