Perl Dancer 模板页眉、页脚

Perl Dancer Template headers, footers

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

我已阅读模板工具包的文档并完成了以下操作:

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

索引模板中有一个 link 将访问者引导至菜单模板:

<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 位于文件夹视图中。但似乎并没有那么容易! =( 关于如何将代码从一个文件重用到位于同一目录中的另一个文件的任何建议?

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

  1. 另一个模板文件的名称
  2. 在当前模板文件(或包含当前模板文件的另一个模板文件)中定义的块的名称。

所有这些都意味着您当前的计划行不通。 menu.tt 将看不到 index.tt.

中定义的任何块

虽然有几个更好的解决方案。

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

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

p.s。我看到你正在使用 Dancer。我强烈建议切换到 Dancer2。

这就是layouts are for. The idea is that content common to all pages (e.g. header, footer, navbar) goes in the layout and content specific to each page goes in templates called views。视图在其他框架中被称为 "partials",因为它们只包含页面的 部分 的内容。

如果您使用 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>

当您调用 template 'view'; 时,<% content %> 部分将替换为指定的视图。 (在您的情况下,您需要将 <%%> 更改为 [%%],因为您使用的是模板 Toolkit-style 分隔符。)

例如,如果 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>

请注意,已有页脚部分;您只需为 header 和导航栏添加元素。

如果这是新开发,你真的应该使用 Dancer2 而不是 Dancer(幸运的是,两者的布局和视图是相同的)。