Верхние и нижние колонтитулы шаблона Perl Dancer

Я изучаю Perl и использую Dancer в качестве веб-фреймворка. У меня есть два представления (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.tt и menu.tt находятся в представлениях папок. Но, похоже, не все так просто! = (Любые предложения о том, как повторно использовать код из одного файла в другой, который находится в том же каталоге?


person Chüngel    schedule 03.05.2016    source источник
comment
Примечание. Имена пакетов в Perl по соглашению начинаются с заглавных букв.   -  person simbabque    schedule 03.05.2016
comment
@ Держу пари, потому что я потерялся, читая документацию, когда искал ссылку. :) Отправьте ответ.   -  person simbabque    schedule 03.05.2016
comment
@simbabque Изначально я разместил ссылку на Dancer2 и изменил ее ... пришлось немного покопаться, чтобы найти версию Dancer1. Так что, наверное, я обманул ?? ;-)   -  person ThisSuitIsBlackNot    schedule 03.05.2016
comment
@Это должно быть. Но это нормально. Очень хороший ответ. :)   -  person simbabque    schedule 03.05.2016
comment
Не связано, но ваш конфигурационный файл неверен (YAML, к сожалению, чувствителен к пробелам): директивы start_tag и end_tag должны иметь больший отступ, чем директива template_toolkit.   -  person ThisSuitIsBlackNot    schedule 03.05.2016


Ответы (2)


Для этого нужны макеты. Идея состоит в том, что контент, общий для всех страниц (например, верхний колонтитул, нижний колонтитул, панель навигации), размещается в макете, а контент, специфичный для каждой страницы, помещается в шаблоны, называемые просмотров. В других фреймворках представления называются «частичными», потому что они содержат контент только для части страницы.

Если вы используете утилиту командной строки 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';. (В вашем случае вам нужно будет изменить <% и %> на [% и %], поскольку вы используете разделители в стиле Template Toolkit.)

Например, если 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 (к счастью, макеты и представления являются то же самое в обоих).

person ThisSuitIsBlackNot    schedule 03.05.2016

Аргумент директивы [% INCLUDE %] можно интерпретировать одним из двух способов.

  1. Имя другого файла шаблона
  2. Имя блока, который определен в текущем файле шаблона (или в другом файле шаблона, который включает текущий файл шаблона).

Все это означает, что ваш текущий план не сработает. menu.tt не увидит никаких блоков, определенных внутри index.tt.

Однако есть несколько лучших решений.

Во-первых, подумайте о переносе кода навигации в третий, отдельный файл шаблона. Затем вы можете INCLUDE этот шаблон в index.tt и menu.tt.

Во-вторых, вы можете использовать функцию «макета» Dancer. Это шаблон, который обернут вокруг ваших шаблонов представления. Обычно шаблон макета содержит навигацию и всю стандартную мебель страницы (например, верхние и нижние колонтитулы). Он также содержит директиву [% content %]. Когда представление визуализируется, обработанная версия помещается в шаблон макета в месте директивы [% content %]. См. Раздел Макеты в Dancer :: Tutorial для получения дополнительной информации.

p.s. Я вижу, вы используете Dancer. Очень рекомендую перейти на Dancer2.

person Dave Cross    schedule 03.05.2016
comment
Пока не ясно, использует OP Dancer или Dancer2. - person simbabque; 03.05.2016
comment
Я не думаю, что это важно. Нет никакой разницы между обработкой макетов в двух версиях, не так ли? - person Dave Cross; 03.05.2016
comment
@simbabque: Там use Dancer ':syntax'; ясно показывает Dancer 1. - person choroba; 03.05.2016
comment
@choroba правильно, я это перечитал. В этом случае ссылка на документацию: metacpan.org/pod/ раздача / Dancer / lib / Dancer /. Но я согласен, что по концепции нет никакой разницы. Но ссылка на документы D2 может запутать читателей. - person simbabque; 03.05.2016
comment
Обновлено для использования ссылок Dancer. - person Dave Cross; 03.05.2016
comment
Мне нравится последняя строчка. :) - person simbabque; 03.05.2016