2

モジュールHTML::Templateを使用して、次のようなフォーマットされたテーブルを作成しています ( array を使用@rows):

my $tmpl = HTML::Template->new(filehandle => \*DATA);
$tmpl->param(ROWS => \@rows); 
print $tmpl->output;

__DATA__ 
<table border="1"> 
<TMPL_LOOP ROWS> 
  <tr> 
  <TMPL_LOOP CELLS> 
    <td><TMPL_VAR CELL></td> 
  </TMPL_LOOP>
  </tr> 
</TMPL_LOOP>
</table>

ただし、テーブルのいくつかの要素のハイパーリンクを作成したいと考えています。要素がリンクされているアドレスは、そのセルのテキストとテーブルの列によって異なります。 例: 行に要素がある場合、Home, Office, Travel, Playそれらを にリンクしwww.mywebsite.com/Home、のハイパーリンクを付けないwww.mywebsite2.com/Officeようにします。HTML::Template で作成されたテーブルにそのようなハイパーリンクを作成するにはどうすればよいですか?www.mywebsite3.com/PlayTravel

4

1 に答える 1

4

編集:更新された質問と質問の作成者によるコメントに基づいて、Template::Toolkitを使用するように回答を書き直しました。

# Your app sets up whatever data structure it wants to pass to the tempalte, for example,
my @rows = [
    [ # cells in row #1
        { url => 'www.mywebsite.com/Home', label => 'Home' },
        { url => 'www.mywebsite2.com/Office', label => 'Office' },
    ],
    [ # cells in row #2
        { url => 'www.mywebsite3.com/Play', label => 'Play' },
        { label => 'Travel' },
    ],
];

# No need to print, prints to STDOUT automatically by default
my $tmpl = Template->new;
$tmpl->process(\*DATA, { rows => \@rows })
    || die $tmpl->error();

__DATA__ 
<table border="1">
[% FOR row IN rows %] 
  <tr> 
  [% FOR cell IN row %] 
    <td>
    [% IF cell.url %]
      <a href="http://[% cell.url | url %]">[% cell.label | html %]</a>
    [% ELSE %]
      [% cell.label | html %]
    [% END %]
    </td> 
  [% END %]
  </tr> 
[% END %]
</table>

Template::Toolkit には、Perl と同じ機能が多数あります (実際、Perl ブロッ​​クを有効にするとまったく同じですが、お勧めしません)。

それぞれの中に[% %]ディレクティブを入れます。ディレクティブがなく、 を使用して割り当てが実行されない場合=、そのブロックは変数ルックアップとして扱われ、テンプレートに渡された値はそこでテキストに補間されます。変数のルックアップを行う場合、ピリオドを使用してルックアップを区切ることで、複雑なデータ構造全体を調べることができます。例えば、

[% rows.0.0.label %]

上記の例に挿入すると、「ホーム」が出力されます。

上記の| urland| html表記は、出力をクリーンアップして、ブロック内の値が適切な URL または HTML として出力されるようにするフィルターを追加し[% %]ます (通常、XSS やその他の出力形式エラーを回避します)。

Template Toolkit は、Perl ほど厳密ではなく、どのように動作するかについて少しあいまいで不正確な場合があるため、少し注意が必要な場合があります。また、特にアプリで何度も呼び出す場合は、少しパフォーマンスの問題になる可能性がありprocess()ます (テンプレートを別のテンプレートに埋め込むと、かなり高速になる傾向があります)。ただし、ほとんどのテンプレートの問題ではかなりうまく機能し、Web デザイナーと作業する必要がある場合でもインターフェイスはそれほど怖くありません.

Template::Toolkit を使用している場合は、チュートリアルを読んで感覚をつかむことを強くお勧めします。

元の回答:

ローン・シェパードのコメントが答えです:

モジュールHTML::Templateを使用して、次のようなフォーマットされたテーブルを作成しています ( array を使用@rows):

my $tmpl = HTML::Template->new(filehandle => \*DATA);
$tmpl->param(ROWS => \@rows); 
print $tmpl->output;

__DATA__ 
<table border="1"> 
<TMPL_LOOP ROWS> 
  <tr> 
  <TMPL_LOOP CELLS> 
    <td><a href="http://www.mywebsite.com/<TMPL_VAR CELL ESCAPE=HTML>"><TMPL_VAR CELL ESCAPE=HTML></a></td> 
  </TMPL_LOOP>
  </tr> 
</TMPL_LOOP>
</table>

ハイパーリンク用の HTML を追加するだけです。HTML::Templateのドキュメントによると、<TMPL_VAR ...>属性内にビットを配置できます。

補足として、ESCAPE=HTML出力を既にサニタイズしていることが確実でない限り、追加することも良い考えです ( Web アプリケーションに対するクロスサイト スクリプティング攻撃などを防ぎます)。

于 2012-07-28T19:26:37.797 に答える