2016-05-03 5 views
3

私はPerlを学んでおり、DancerをWebフレームワークとして使用しています。 同じナビゲーションを共有する2つのビュー(ttファイル)があります。 したがって、ナビゲーションとフッターのテンプレートを管理する方法を学ぶのはよいことです。Perlダンサーテンプレートヘッダー、フッター

私はテンプレートツールキットのドキュメントを読んで、私は次のことをやった

私はconfig.ymlファイルを変更した:私は、テンプレートを定義した

#template: "simple" 

template: "template_toolkit" 
engines: 
    template_toolkit: 
    start_tag: '[%' 
    end_tag: '%]' 

.pmファイル:メニューテンプレートへの訪問者を向けるインデックス・テンプレート内のリンクがあります

package proyecto; 
use Dancer ':syntax'; 

our $VERSION = '0.1'; 

get '/' => sub { 
    template 'index'; 
}; 


get '/menu' => sub { 
    template 'menu'; 
}; 

true; 

<li class="active">< a href="/menu">Menu <span class="sr-only"></span></a></li> 

私はmenu.ttにindex.ttからナビゲーションコードを再利用したいと思いますので、私は次のようにindex.ttナビゲーションコードを包みました:

[% BLOCK navigation %] 
#my nav code 
[% END %] 

は最終的にあることを含めるにはmenu.ttファイル内のコード、私は(ナビゲーションコードがあるべき場所)次のことを書いた:

[% navigation = 'index.tt' %] 
[% INCLUDE navigation %] 

ファイルindex.ttmenu.ttがフォルダビューに位置しています。しかし、それは簡単ではないようだ! =(どれでも同じディレクトリに配置されている別のファイルからコードを再利用する方法についての提案?

+0

注:Perlでのパッケージ名は、大文字で始まります。 – simbabque

+0

@私はリンクを探していたときに私がドキュメンテーションを読んでいなくなってしまったので私に賭けました。 :)答えを投稿してください。 – simbabque

+0

@simbabque私はもともとDancer2リンクを投稿し、それを変更しました... Dancer1バージョンを見つけるために少し掘り下げなければならなかった。だから、私は浮気したと思う? ;-) – ThisSuitIsBlackNot

答えて

4

これはlayoutsが対象です。すべてのページ(ヘッダー、フッター、ナビゲーションバーなど)に共通するコンテンツはレイアウトに入り、各ページに固有のコンテンツはviewsというテンプレートに入れられます。ビューは、ページのの部分のコンテンツのみを含んでいるため、他のフレームワークでは「パーシャル」と呼ばれます。

アプリケーションを設定するにはdancerコマンドラインユーティリティを使用する場合は、デフォルトのレイアウトはviews/layouts/main.ttで、次のようになります。あなたはtemplate 'view';を呼び出すとき

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-type" content="text/html; charset=<% settings.charset %>" /> 
    <title>Foo</title> 
    <link rel="stylesheet" href="<% request.uri_base %>/css/style.css" /> 
</head> 
<body> 
    <% content %> 
    <div id="footer"> 
    Powered by <a href="http://perldancer.org/">Dancer</a> <% dancer_version %> 
    </div> 
</body> 
</html> 

<% content %>セクションは、指定されたビューに置き換えられます。 (あなたは、テンプレートツールキットスタイルの区切り文字を使用しているので、あなたのケースでは、あなたは[%%]<%%>を変更する必要があります。)

例えば、views/index.ttがある場合:

呼び出す
<h1>Hello, World!</h1> 

template 'index';は次のようにレンダリングされます。

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
    <title>Foo</title> 
    <link rel="stylesheet" href="http://www.example.com/css/style.css" /> 
</head> 
<body> 
    <h1>Hello, World!</h1> 
    <div id="footer"> 
    Powered by <a href="http://perldancer.org/">Dancer</a> 1.3202 
    </div> 
</body> 
</html> 

すでにフッターセクションがあります。ヘッダーとナビゲーションバーの要素を追加するだけです。

これが新しい開発であれば、実際にはダンサーの代わりにDancer2を使用する必要があります(幸運なことに、レイアウトとビューは両方とも同じです)。

3

[% INCLUDE %]ディレクティブの引数は、次のいずれかの方法で解釈することができます。

  1. 別のテンプレートの名前
  2. 現在のテンプレートファイルに定義されているブロックのファイル名(または別のテンプレートファイルに現在のテンプレートファイルが含まれている)。

すべてのあなたの現在の計画が機能しないことを意味します。menu.ttは、index.tt内に定義されたブロックを表示しません。

しかし、もっと良い解決策がいくつかあります。

まず、第三の、別個の、テンプレートファイルにナビゲーション・コードを移動することを検討してください。 INCLUDEこのテンプレートをindex.ttmenu.ttの両方に入れることができます。

第2に、ダンサーの「レイアウト」機能を使用できます。これは、ビューテンプレートにラップされたテンプレートです。通常、レイアウトテンプレートにはナビゲーションとすべての標準ページの家具(ヘッダーやフッターなど)が含まれています。また、[% content %]ディレクティブも含まれています。ビューがレンダリングされると、レンダリングされたバージョンは[% content %]ディレクティブの場所にあるレイアウトテンプレートにドロップされます。詳細については、Dancer::TutorialLayoutsセクションを参照してください。

p.s.ダンサーを使っているのが分かります。 Dancer2に切り替えることを強くお勧めします。

+0

OPがダンサーかダンサーを使用しているかどうかはまだ分かりません2。 – simbabque

+0

私はそれが重要だとは思わない。 2つのバージョンのレイアウトの処理には違いはありません。 –

+2

@simbabque:ダンサー1を明確に示す構文 ';'を使用しています。 – choroba