【问题标题】:Perl Dancer Template headers, footersPerl Dancer 模板页眉、页脚
【发布时间】:2016-08-28 17:59:26
【问题描述】:

我正在学习 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;

索引模板中有一个链接将访问者引导到菜单模板:

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

【问题讨论】:

  • 注意:按照惯例,Perl 中的包名以大写字母开头。
  • @这打赌我,因为我在寻找链接时迷失了阅读文档。 :) 发布答案。
  • @simbabque 我最初发布了一个 Dancer2 链接并对其进行了更改...不得不挖掘一下才能找到 Dancer1 版本。所以我猜我作弊了?? ;-)
  • @这可能是。但没关系。很好的答案。 :)
  • 不相关,但您的配置文件错误(不幸的是,YAML 对空格敏感):start_tagend_tag 指令需要比template_toolkit 指令缩进更多。

标签: perl templates template-toolkit dancer


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    [% INCLUDE %] 指令的参数可以通过以下两种方式之一进行解释。

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

    所有这些都意味着您当前的计划行不通。 menu.tt 不会看到在 index.tt 中定义的任何块。

    不过有几个更好的解决方案。

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

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

    附言我看到你正在使用 Dancer。我强烈建议切换到 Dancer2。

    【讨论】:

    • 目前尚不清楚OP使用的是Dancer还是Dancer2。
    • 我认为这并不重要。两个版本的布局处理没有区别吧?
    • @simbabque:use Dancer ':syntax'; 清楚地显示了 Dancer 1。
    • @choroba 对,我读多了。在这种情况下,文档链接是metacpan.org/pod/distribution/Dancer/lib/Dancer/…。但我同意这个概念没有区别。但是指向 D2 文档的链接可能会让读者感到困惑。
    • 更新为使用 Dancer 链接。
    猜你喜欢
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2020-01-02
    • 1970-01-01
    相关资源
    最近更新 更多