Perl Dancer模板页眉,页脚

时间:2016-05-03 15:32:32

标签: perl templates template-toolkit dancer

我正在学习Perl并使用Dancer作为Web框架。 我有两个视图(tt文件)应该共享相同的导航。 因此,开始学习如何管理导航和页脚模板会很棒。

我已阅读Template Toolkit的文档,并且我已完成以下操作:

我已将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>

我想将index.tt中的导航代码重用到menu.tt中,所以我将index.tt中的导航代码包装成以下内容:

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

为了最终在menu.tt文件中包含该代码,我写了以下内容(导航代码应该在哪里):

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

文件index.ttmenu.tt位于文件夹视图中。但它似乎并不那么容易! =(关于如何将代码从一个文件重用到另一个文件的任何建议,该文件位于同一目录中?

2 个答案:

答案 0 :(得分:5)

这是layouts的用途。这个想法是所有页面共有的内容(例如页眉,页脚,导航栏)都在布局中,每个页面特有的内容都在名为views的模板中。视图在其他框架中称为“部分”,因为它们只包含页面的部分的内容。

如果您使用dancer命令行实用程序来设置应用程序,则默认布局为views/layouts/main.tt,如下所示:

<!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 %>时,template 'view';部分将替换为指定的视图。 (在您的情况下,您需要将<%%>更改为[%%],因为您使用的是模板工具包样式的分隔符。)

例如,如果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而不是Dancer(幸运的是,布局和视图在两者中都是相同的。)

答案 1 :(得分:3)

[% INCLUDE %]指令的参数可以用两种方式解释。

  1. 另一个模板文件的名称
  2. 当前模板文件(或包含当前模板文件的另一个模板文件)中定义的块的名称。
  3. 所有这些都意味着您当前的计划无法运作。 menu.tt无法看到index.tt中定义的任何块。

    但是有一些更好的解决方案。

    首先,考虑将导航代码移动到第三个单独的模板文件中。然后,您可以INCLUDE将此模板同时放入index.ttmenu.tt

    其次,你可以使用Dancer&#34; layout&#34;特征。这是一个包含在视图模板周围的模板。通常,布局模板包含导航和所有标准页面家具(如页眉和页脚)。它还包含[% content %]指令。呈现视图时,呈现的版本将放入[% content %]指令位置的布局模板中。有关详细信息,请参阅Layouts中的Dancer::Tutorial部分。

    P.S。我看到你正在使用Dancer。我强烈建议您切换到Dancer2。