2016-09-16 8 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確かに。一般的に、私はそれらを使用しなければならない場合を除き、あなたの答えを投票しました。 –

答えて

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 :: 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> 

編集この例では、解決策を示します。

テンプレート内で何をしているのかわからないので、既存のコードの出力に変更を適用するのが一番の方法です。つまり、テンプレートの出力を現在印刷していた時点で、上に示したメソッドを安全に追加できるということです。テンプレートに変更を実際に書き込むために、1回限りの更新として指定されたコードを使用できます。fooではなく値がHTML :: Templateパラメータになります。

+0

この問題が繰り返し発生する可能性がある場合は、というタグを追加し、隠しタグを追加します。 – FtLie

+0

@FtLie彼らが最後にこの質問をしたとき、彼らはテンプレートファイルを編集したくないと述べました。編集して質問しました。「私はすべてのテンプレートファイルを手動で編集したくありません。 ' –

+0

@FtLie申し訳ありませんが、あなたの意見を誤解しました。はい、それは別のオプションですが、レンダリングされたテンプレートを取得するには、 '$ template-> output'を実行する必要があります。テンプレートが何をしているか正確に知らなければ、上記の方法が実際にはより良い選択です。 –

関連する問題