2016-05-03 16 views
3

Ich lerne Perl und benutze Dancer als Web-Framework. Ich habe zwei Ansichten (TT-Dateien), die die gleiche Navigation teilen sollten. Es wäre also großartig zu lernen, wie man Vorlagen für Navigation und Fußzeilen verwaltet.Perl Dancer Template Kopf- und Fußzeilen

Ich habe die Dokumentation für das Template Toolkit gelesen und ich habe folgendes getan:

ich die config.yml-Datei geändert haben:

#template: "simple" 

template: "template_toolkit" 
engines: 
    template_toolkit: 
    start_tag: '[%' 
    end_tag: '%]' 

habe ich die Vorlagen in die definierte .pm Datei:

package proyecto; 
use Dancer ':syntax'; 

our $VERSION = '0.1'; 

get '/' => sub { 
    template 'index'; 
}; 


get '/menu' => sub { 
    template 'menu'; 
}; 

true; 

Es gibt einen Link in der Index-Vorlage die Besucher auf die Menüvorlage Regie:

<li class="active">< a href="/menu">Menu <span class="sr-only"></span></a></li> 

Ich möchte den Navigationscode von index.tt in menu.tt wieder zu verwenden, also habe ich den Navigationscode in index.tt mit den folgenden gewickelt:

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

Um schließlich beinhalten, dass

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

die Dateien index.tt und menu.tt befinden sich in den Ordneransichten: Code in der Datei menu.tt, ich habe (sein sollte, wo die Navigationscode) die folgenden geschrieben. Aber es scheint nicht so einfach zu sein! = (Jeder Vorschlag, wie Code aus einer Datei zur anderen wieder zu verwenden, die im gleichen Verzeichnis befindet?

+0

Hinweis: Paketnamen in Perl beginnen standardmäßig mit Großbuchstaben. – simbabque

+0

@This Wette mich, weil ich verloren habe, die Dokumentation zu lesen, als ich nach dem Link suchte. :) Veröffentlichen Sie eine Antwort. – simbabque

+0

@simbabque Ich habe ursprünglich einen Dancer2-Link gepostet und geändert ... musste ein wenig nachgraben, um die Dancer1-Version zu finden. Also ich denke, ich habe betrogen ?? ;-) – ThisSuitIsBlackNot

Antwort

4

Dies ist, was layouts sind für. Die Idee ist, dass Inhalte, die für alle Seiten (z. B. Kopfzeile, Fußzeile, Navigationsleiste) gemeinsam sind, in das Layout und den spezifischen Inhalt jeder Seite in Vorlagen mit der Bezeichnung views gehen. Ansichten werden in anderen Frameworks "Partials" genannt, da sie nur den Inhalt für Teil der Seite enthalten.

Wenn Sie das dancer Befehlszeilenprogramm verwenden, um Ihre Anwendung einzurichten, ist das Standardlayout views/layouts/main.tt und sieht ungefähr so ​​aus:

<!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> 

Der <% content %> Abschnitt mit der angegebenen Ansicht ersetzt wird, wenn Sie template 'view'; nennen. (In Ihrem Fall müssen Sie <% und %> zu [% und %] ändern, da Sie die Template Toolkit-Stil Trennzeichen verwenden.)

Zum Beispiel, wenn views/index.tt sind:

<h1>Hello, World!</h1> 

Aufruf template 'index'; in einer Route macht folgendes:

<!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> 

Beachten Sie, dass es bereits Fußbereich; Sie müssen nur Elemente für eine Kopfzeile und eine Navigationsleiste hinzufügen.

Wenn dies eine Neuentwicklung ist, sollten Sie anstelle von Dancer wirklich Dancer2 verwenden (zum Glück sind Layouts und Ansichten in beiden gleich).

3

Das Argument der [% INCLUDE %] Richtlinie kann auf eine von zwei Arten interpretiert werden.

  1. Der Name einer anderen Vorlage Datei
  2. der Name eines Block, der in der aktuellen Vorlage-Datei definiert ist (oder in einer anderen Template-Datei, die die aktuelle Vorlage-Datei enthalten ist).

All das bedeutet, dass Ihr aktueller Plan wird nicht funktionieren menu.tt sieht keinen definierten Block innerhalb index.tt.

Es gibt jedoch ein paar bessere Lösungen.

Erstens, ziehen Sie in Betracht, den Navigationscode in eine dritte, separate Vorlagendatei zu verschieben. Sie können dann diese Vorlage in INCLUDE sowohl in index.tt und menu.tt.

Zweitens können Sie Dancers "Layout" -Funktion verwenden. Dies ist eine Vorlage, die um Ihre Ansichtsvorlagen gelegt wird. In der Regel enthält die Layoutvorlage die Navigation und alle Standardseitenmöbel (wie Kopf- und Fußzeilen). Es enthält auch eine [% content %] Direktive. Wenn eine Ansicht gerendert wird, wird die gerenderte Version an der Position der [% content %]-Direktive in die Layoutvorlage eingefügt. Weitere Informationen finden Sie im Abschnitt Layouts in Dancer::Tutorial.

p.s. Ich sehe, dass du Dancer benutzt. Ich würde sehr empfehlen, zu Dancer2 zu wechseln.

+0

Es ist noch nicht klar, ob OP Dancer oder Dancer2 verwendet. – simbabque

+0

Ich glaube nicht, dass das wichtig ist. Es gibt keinen Unterschied zwischen der Handhabung von Layouts in den beiden Versionen, oder? –

+2

@simbabque: Es gibt 'use Dancer ': syntax';' was Dancer 1 deutlich zeigt. – choroba