2013-09-07 3 views
26

В макете Джекилла есть ли способ определить, является ли страница нормальной страницей или почтой? Я хочу отображать заголовки сообщений, но не названия страниц. Например:Jekyll - Изменить макет, если страница - это сообщение?

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

ответ

25

С Джекила 2.0, вы можете использовать Front Matter Defaults:

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 

, то вы можете использовать {{ page.is_post }}, чтобы проверить является ли страница пост.

Понятия не имею, почему Jekyll не устанавливает page.type по умолчанию.

11

Объявление объявления о размещении в передней части не достаточно? Если ваш пост использует post макет вы уверены, что страница является пост и вам не нужно, чтобы добавить дополнительную логику

--- 
layout: post 
--- 

BTW быстрый и грязный (очень грязный) способ определения типа страницы состоит в проверьте путь к странице, как правило, посты в каталоге _posts так что вы можете проверить это

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

Моя раскладка около 50 строк HTML, так что я не хочу в двух экземплярах, которые отличаются только одной строкой , Спасибо за информацию, хотя, вы дали мне идею, как это сделать! – Zaz

+0

@Josh: Вы можете применить макет к другому. – jdh8

7

Вот как я решил эту проблему:

  1. Создать SY MLink от _layouts/post_layouts/main
  2. изменить расположение сообщений в post:

    --- 
    layout: post 
    --- 
    
  3. Добавить если заявление в _layouts/main так:

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


лучший путь для решения этого может быть использование включает и имеет два отдельных макета, например, @dafi.

+6

должен 'layout' быть' page.layout'? – davidtingsu

+0

@ davidtingsu: Исправлено. Извините за медленный ответ. – Zaz

+0

Я не создавал символическую ссылку, сольный шаг 3 отлично работает для меня :) –

2

Сообщения имеют переменную date, а страницы - нет.

Пока не пуленепробиваемым, это решение не требует дополнительной настройки:

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

Сообщения также имеют переменную 'id'. Я лично предпочитаю использовать 'page.id', чтобы проверить, есть ли сообщение. – kimbaudi

2

Самый простой и самый простой способ определить, если его страница или пост является использование page.id.

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

Я лично использую этот метод в моей странице раскладок, чтобы определить, если его страницу или сообщение, так что я могу показать ссылки на предыдущие/следующие сообщения только если его пост.

_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

Работает отлично для условного контента в ответ на вопрос отправлен - спасибо! (Не уверен, почему это нужно было проголосовать, кроме некоторых людей, похоже, нравится делать это на SO.) – SexxLuthor

0

вы можете установить тип, в _config.yml по умолчанию для всех типов:

defaults: 
    - scope: 
     path: "" 
     type: "pages" 
    values: 
     type: "pages" 
Смежные вопросы