2013-09-07 26 views
26

Trong bố cục Jekyll, có cách nào để phát hiện xem trang đó là một trang bình thường hay một bài đăng không? Tôi muốn hiển thị tiêu đề bài đăng nhưng không hiển thị tiêu đề trang. Như thế này:Jekyll - Thay đổi bố cục nếu trang là bài đăng?

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

Trả lời

25

Kể từ Jekyll 2.0, bạn có thể sử dụng 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 

sau đó bạn có thể sử dụng {{ page.is_post }} để kiểm tra xem trang này là đường bưu điện.

Không biết tại sao Jekyll không đặt page.type theo mặc định.

11

Tuyên bố bố cục bài trong phần trước là không đủ? Nếu bài viết của bạn sử dụng một bố trí post bạn chắc chắn trang này là một bài và bạn không cần phải bổ sung thêm Logic

--- 
layout: post 
--- 

BTW một (rất bẩn) cách nhanh chóng và dơ bẩn để xác định trang loại bao gồm để kiểm tra đường dẫn trang, nói chung là bài viết được dưới thư mục _posts để bạn có thể kiểm tra xem nó

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

bố trí của tôi là khoảng 50 dòng HTML, vì vậy tôi không muốn hai bản sao mà khác nhau bởi chỉ có một dòng . Cảm ơn các thông tin mặc dù, bạn đã cho tôi một ý tưởng làm thế nào để làm điều này! – Zaz

+0

@Josh: Bạn có thể áp dụng bố cục cho người khác. – jdh8

7

đây là cách tôi giải quyết vấn đề:

  1. Tạo sy mlink từ _layouts/post_layouts/main
  2. Thay đổi cách bố trí của bài viết để post:

    --- 
    layout: post 
    --- 
    
  3. Thêm một câu lệnh if trong _layouts/main như vậy:

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


Một cách tốt hơn để giải quyết điều này có thể được sử dụng bao gồm và có hai bố trí riêng biệt như @ dafi nói mặc dù.

+6

nên 'bố cục' là' page.layout'? – davidtingsu

+0

@davidtingsu: Đã sửa lỗi. Xin lỗi vì sự phản ứng chậm chạp. – Zaz

+0

Tôi không tạo liên kết tượng trưng, ​​bước solo 3 làm việc tốt cho tôi :) –

2

Bài đăng có biến số date, trong khi các trang thì không.

Trong khi không phải đạn, giải pháp này không đòi hỏi cấu hình bổ sung:

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

Bài đăng cũng đi kèm với biến 'id'. Cá nhân tôi thích sử dụng 'page.id' để kiểm tra xem bài đăng của nó có phải không. – kimbaudi

2

Cách dễ nhất và đơn giản nhất để xác định xem một trang hoặc một bài là sử dụng page.id.

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

Cá nhân tôi sử dụng phương pháp này trong trang bố cục để xác định trang hoặc bài đăng của mình để tôi chỉ hiển thị liên kết đến bài viết trước đó/tiếp theo nếu bài đăng của nó.

_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

Hoạt động hoàn hảo để hiển thị nội dung có điều kiện trong câu trả lời cho câu hỏi được đăng - cảm ơn! (Không chắc chắn lý do tại sao điều này cần phải được bỏ phiếu, khác với một số người dường như thích làm điều đó trên SO.) – SexxLuthor

0

bạn có thể đặt loại, trong _config.yml trị mặc định cho tất cả các loại:

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