2016-05-03 2 views
3

J'apprends Perl et utilise Dancer comme framework web. J'ai deux vues (fichiers tt) qui devraient partager la même navigation. Donc, ce serait génial de commencer à apprendre comment gérer les modèles pour la navigation et les pieds de page.Perl Dancer En-têtes de modèles, pieds de page

J'ai lu la documentation de la boîte à outils de modèle et je l'ai fait ce qui suit:

J'ai changé le fichier config.yml à:

#template: "simple" 

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

J'ai défini les modèles dans la fichier .pm:

package proyecto; 
use Dancer ':syntax'; 

our $VERSION = '0.1'; 

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


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

true; 

Il y a un lien dans le modèle d'index diriger le visiteur vers le modèle de menu:

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

Je voudrais réutiliser le code de navigation de index.tt dans menu.tt, donc je l'ai enveloppé le code de navigation index.tt avec les éléments suivants:

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

Pour inclure enfin que code dans le fichier menu.tt, je l'ai écrit ce qui suit (où le code de navigation doit être):

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

les fichiers index.tt et menu.tt sont situés dans les vues du dossier. Mais il semble que ce ne soit pas si facile! = (Toute suggestion sur la façon de réutiliser le code d'un fichier à un autre qui est situé dans le même répertoire?

+0

Remarque: Les noms de package en Perl commencent par des majuscules par convention. – simbabque

+0

@Ceci me parie parce que je me suis perdu en lisant la documentation quand je cherchais le lien. :) Poster une réponse. – simbabque

+0

@simbabque J'ai d'abord posté un lien dans Dancer2 et l'ai changé ... j'ai dû creuser un peu pour trouver la version Dancer1. Donc je suppose que j'ai triché ?? ;-) – ThisSuitIsBlackNot

Répondre

4

C'est ce que layouts sont pour. L'idée est que le contenu commun à toutes les pages (par exemple en-tête, pied de page, barre de navigation) va dans la mise en page et le contenu spécifique à chaque page va dans des modèles appelés views. Les vues sont appelées "partiels" dans d'autres cadres car elles ne contiennent que le contenu de partie de la page.

Si vous utilisez l'utilitaire de ligne de commande dancer pour configurer votre application, la mise en page par défaut est views/layouts/main.tt et ressemble à ceci:

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

La section <% content %> est remplacée par la vue spécifiée lorsque vous appelez template 'view';. (Dans votre cas, vous devrez changer <% et %> à [% et %] puisque vous utilisez les délimiteurs Template Toolkit style.)

Par exemple, si views/index.tt est:

<h1>Hello, World!</h1> 

appelant template 'index'; dans un itinéraire rend ce qui suit:

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

Notez qu'il ya déjà une section de pied de page; il suffit d'ajouter des éléments pour un en-tête et une barre de navigation.

S'il s'agit d'un nouveau développement, vous devriez vraiment utiliser Dancer2 au lieu de Dancer (heureusement, les mises en page et les vues sont les mêmes dans les deux cas).

3

L'argument de la directive [% INCLUDE %] peut être interprétée de deux façons.

  1. Le nom d'un autre modèle fichier
  2. le nom d'un bloc qui est défini dans le fichier de modèle en cours (ou dans un autre fichier modèle qui a inclus le fichier modèle actuel).

Tout cela signifie que votre plan actuel ne fonctionne pas menu.tt ne verra aucun bloc défini à l'intérieur index.tt.

Cependant, il existe quelques meilleures solutions.

Tout d'abord, envisagez de déplacer le code de navigation dans un troisième fichier modèle distinct. Vous pouvez alors INCLUDE ce modèle dans les deux index.tt et menu.tt.

Deuxièmement, vous pouvez utiliser la fonction «mise en page» de Dancer. Ceci est un modèle qui est enroulé autour de vos modèles d'affichage. Généralement, le modèle de présentation contient la navigation et tous les meubles de page standard (comme les en-têtes et les pieds de page). Il contient également une directive [% content %]. Lorsqu'une vue est rendue, la version rendue est placée dans le modèle de présentation à l'emplacement de la directive [% content %]. Voir la section Layouts dans Dancer::Tutorial pour plus d'informations.

p.s. Je vois que tu utilises Dancer. Je recommande fortement de passer à Dancer2.

+0

Il n'est pas encore clair si OP utilise Dancer ou Dancer2. – simbabque

+0

Je ne pense pas que ça compte. Il n'y a pas de différence entre le traitement des mises en page dans les deux versions, n'est-ce pas? –

+2

@simbabque: Il y a 'use Dancer ': syntaxe';' qui montre clairement Dancer 1. – choroba