Использование HTML::Template для добавления тега
Я использую CGI и HTML:: Template. Мне нужно добавить тег ниже во всех шаблонах, которые содержат <form>
тег (тег должен быть добавлен внутри <form>
тег).
<input type="hidden" value="TO_BE_PARSED_FROM_CGI">
Я не хочу редактировать все файлы шаблонов вручную. Есть ли какой-либо метод, доступный в HTML:: Template для этого? Какой-то тип хука, который я могу передать при создании конструктора HTML::Template?
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>
Есть ли какой-либо метод, доступный в 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.