2016-05-03 3 views
3

Я изучаю Perl и использую Dancer в качестве веб-рамки. У меня есть два вида (файлы tt), которые должны использовать одну и ту же навигацию. Итак, было бы здорово начать изучать, как управлять шаблонами для навигации и нижних колонтитулов.Perl Dancer Шаблоны, нижние колонтитулы

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

+0

Примечание: имена пакетов в Perl начинаются с заглавных букв по соглашению. – simbabque

+0

@ Это помогло мне, потому что я потерялся, прочитав документацию, когда искал ссылку. :) Отправьте ответ. – simbabque

+0

@simbabque Я изначально разместил ссылку Dancer2 и изменил ее ... пришлось копать немного, чтобы найти версию Dancer1. Так что, наверное, я обманул? ;-) – ThisSuitIsBlackNot

ответ

4

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

3

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

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

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

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

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

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

p.s. Я вижу, вы используете Танцовщицу. Я настоятельно рекомендую переключиться на Dancer2.

+0

Пока неясно, использует ли ОП танцор или танцор2. – simbabque

+0

Я не думаю, что это важно. Нет никакой разницы между обработкой макетов в двух версиях, не так ли? –

+2

@simbabque: «Использовать Dancer»: синтаксис '; ', который четко показывает Dancer 1. – choroba

Смежные вопросы