2013-09-07 5 views
26

In einem Jekyll-Layout gibt es eine Möglichkeit zu erkennen, ob die Seite eine normale Seite oder ein Post ist? Ich möchte Posttitel, aber keine Seitentitel anzeigen. Gefällt mir:Jekyll - Layout ändern, wenn Seite ein Post ist?

{% if page.is_post? %} 
    <h2>{{ page.title }}</h2> 
{% endif %} 
{{ content }} 

Antwort

25

Seit Jekyll 2.0 können Sie Front Matter Defaults verwenden:

defaults: 
    - 
    scope: 
     path: ""  # empty string for all files 
     type: posts # limit to posts 
    values: 
     is_post: true # automatically set is_post=true for all posts 

dann können Sie {{ page.is_post }} verwenden um zu überprüfen, ob die Seite Post ist.

Keine Ahnung, warum Jekyll page.type nicht standardmäßig festgelegt.

11

Ein Post-Layout in der Front zu deklarieren ist nicht genug? Wenn Ihr Beitrag verwendet ein post Layout Sie sind sicher, dass die Seite ein Beitrag ist und Sie brauchen keine zusätzliche Logik hinzufügen

--- 
layout: post 
--- 

BTW schnell und schmutzig (sehr schmutzig) Art und Weise den Seitentyp zu bestimmen, besteht zu überprüfen Sie die Seitenpfad, in der Regel unter der Beiträge _posts Verzeichnis, so können Sie es überprüfen

{% if page.path contains '_posts' %} 
This page is a post 
{% else %} 
This page is a normal page 
{% endif %} 
+0

Mein Layout etwa 50 Zeilen HTML ist, so will ich nicht zwei Kopien, die nur von einer Linie abweichen . Danke für die Info, du hast mir eine Idee gegeben, wie das geht! – Zaz

+0

@Josh: Sie können ein Layout auf ein anderes anwenden. – jdh8

7

Hier ist, wie ich das Problem gelöst:

  1. erstellen sy MLINK von _layouts/post_layouts/main
  2. Ändern Sie das Layout der Beiträge zu post:

    --- 
    layout: post 
    --- 
    
  3. eine if-Anweisung in _layouts/main wie so hinzufügen:

    {% if page.layout == 'post' %} 
        <h2>{{ page.title }}</h2> 
    {% endif %} 
    


A besserer Weg um dies zu lösen, könnte es sein, Includes zu verwenden und zwei separate Layouts zu haben, wie zum Beispiel @dafi.

+6

sollte "Layout" 'page.layout' sein? – davidtingsu

+0

@davidtingsu: Behoben. Entschuldigung für die langsame Antwort. – Zaz

+0

ich nicht schaffen einen Symlink, Solo Schritt 3 funktionieren für mich :) –

2

Beiträge kommen mit einer date Variable, während Seiten nicht.

Während nicht kugelsicher Diese Lösung erfordert keine zusätzliche Konfiguration:

{% if page.date %} 
    <h2>{{ page.title }}</h2> 
{% endif %} 
+0

Beiträge auch mit einem 'id' Variable kommen. Ich persönlich bevorzuge es, page.id zu verwenden, um zu prüfen, ob es ein Post ist. – kimbaudi

2

Die einfachste und direkteste Weg, um zu bestimmen, ob seine eine Seite oder ein Beitrag ist page.id zu verwenden.

{% if page.id %} 
    This is a post 
{% endif %} 

ich persönlich diese Methode in meiner Layouts Seite verwenden, wenn sich eine Seite, um zu bestimmen oder per Post, so kann ich Links zeigen zum vorherigen/nächsten Beiträge Wenn es nur ein Beitrag.

_layouts/default.html

<!DOCTYPE html> 
<html lang="en"> 

{% include head.html %} 

<body> 

{% include header.html %} 

{{ content }} 

<!-- If this is a post, show previous/next post links --> 
{% if page.id %} 

{% if page.previous.url %} 
<a href="{{page.previous.url}}">{{page.previous.title}}</a> 
{% endif %} 

{% if page.next.url %} 
<a class="button is-link ellipsis" title="{{page.previous.title}}" href="{{page.next.url}}">{{page.next.title}}</a> 
{% endif %} 

{% endif %} 

{% include footer.html %} 

</body> 
</html> 
+0

Funktioniert perfekt für bedingte Inhaltsanzeige als Antwort auf die gestellte Frage - Danke! (Nicht sicher, warum dies abgelehnt werden sollte, abgesehen von einigen Leuten, die es anscheinend genießen, dies auf SO zu tun.) – SexxLuthor

0

Sie können für alle Arten Art, in _config.yml Standardwerte gesetzt:

defaults: 
    - scope: 
     path: "" 
     type: "pages" 
    values: 
     type: "pages"