Jekyll: ตัวสร้างเพื่อลิงก์ไปยังหน้าย่อยทั้งหมดในลำดับชั้นแบบคงที่

ฉันกำลังพยายามเขียนไซต์แบบคงที่ด้วย Jekyll ซึ่งมีเลเยอร์อยู่สองสามเลเยอร์ วิธีที่ดีที่สุดในการสร้างลิงก์ไปยังหน้าย่อยทั้งหมดภายในส่วนคืออะไร

ตัวอย่างเช่น หากฉันมีโครงสร้างเว็บไซต์ดังนี้:

landing
- Topic A
  - Content 1
  - Content 2
  - Content 3
- Topic B
  - Content 1
  - Content 2
  - Content 3

วิธีใดคือวิธีที่ดีที่สุดในการสร้างลิงก์ไปยังหน้าเนื้อหาแต่ละหน้าจากหน้าหัวข้อ และมีวิธีง่ายๆ ในการเชื่อมโยงไปยังหน้าหัวข้อทั้งหมดจาก Landing Page หรือไม่

สิ่งเหล่านี้ไม่ใช่โพสต์ เป็นเพียงเพจคงที่ มันจะดีมากถ้าฉันทำได้ {% for topic.each %} ...ฯลฯ และพิมพ์ลิงค์ออกมา


person Sauce McBoss    schedule 19.01.2017    source แหล่งที่มา
comment
ถ้าฉันเข้าใจดี คุณคงไม่อยากนำหน้านี้ไปไว้ในหัวข้อ และใช้หมวดหมู่' เพื่อจัดเรียงและสร้างพรีมาลิงก์ที่สร้างขึ้น ?   -  person yaitloutou    schedule 19.01.2017
comment
...ฉันไม่ค่อยแน่ใจว่าคุณหมายถึงอะไร? แต่ละระดับจะเป็นโฟลเดอร์ และแต่ละระดับจะมีไฟล์ index.md รวมถึงไฟล์ md สำหรับเพจย่อย   -  person Sauce McBoss    schedule 19.01.2017
comment
มีมากกว่าหนึ่งวิธีในการสร้างโครงสร้างนี้ คุณสามารถใส่ไฟล์ md ในโพสต์หรือสร้างคอลเลกชันเฉพาะ ฉันจะอธิบายแต่ละวิธีในคำตอบของฉัน   -  person yaitloutou    schedule 19.01.2017


คำตอบ (2)


ฉันจะไม่ใช้โพสต์เพื่อจุดประสงค์นี้ (ตามที่ yaitloutou แนะนำ) ฉันจะอ่านลำดับชั้นจากโครงสร้างไดเร็กทอรี (โซลูชัน 1) หรือสร้างคอลเลกชันแยกกันสองชุด (โซลูชัน 2) คุณสามารถปล่อยให้คอลเลกชันจากโซลูชัน 2 แบ่งปันเค้าโครงเดียวกันได้ถ้าคุณต้องการ


1. การใช้เพจ

สร้างโครงสร้างไดเร็กทอรีด้วยเพจ index.md และวนซ้ำ Jekyll veriable ที่เรียกว่า 'site.pages' เพื่อสร้างเมนู

index.md
topic-a/index.md
  content-1/index.md
  content-2/index.md
  content-3/index.md
topic-b/index.md
  content-1/index.md
  content-2/index.md
  content-3/index.md

และวนซ้ำทุกหน้าดังนี้:

<ul>
{% assign sitepages = site.pages | sort: 'order' %}
{% for sitepage in sitepages %}
  <li {% if page.url == sitepage.url %} class="active"{% endif %}>
    <a href="/th{{ sitepage.url }}">{{ sitepage.title }}</a>
  </li>
{% endfor %}
</ul>

หากคุณต้องการโครงสร้างแบบซ้อน คุณสามารถทำบางสิ่งเช่นนี้. หรือถ้าคุณต้องการเฉพาะผลลัพธ์สำหรับหัวข้อ A คุณก็สามารถทำได้:

<ul>
{% assign sitepages = site.pages | sort: 'order' %}
{% for sitepage in sitepages %}
{% if sitepage.url contains 'topic-a' %}
  <li {% if page.url == sitepage.url %} class="active"{% endif %}>
    <a href="/th{{ sitepage.url }}">{{ sitepage.title }}</a>
  </li>
{% endif %}
{% endfor %}
</ul>

2. การใช้คอลเลกชัน (โซลูชันที่ง่ายที่สุดและการสร้างที่เร็วที่สุด)

สร้างคอลเลกชันหัวข้อ A และสร้างคอลเลกชันอื่นหัวข้อ B ไฟล์กำหนดค่าของคุณควรมีลักษณะดังนี้:

collections:
  topic-a:
    output: true
    permalink: /topic-a/:path/
  topic-b:
    output: true
    permalink: /topic-b/:path/

การส่งออกรายการของหัวข้อหนึ่งจะเป็นดังนี้:

{% assign atopics = site.topic-a | sort: 'order' %}
{% for atopic in atopics %}
  <li {% if page.url == atopic.url %} class="active"{% endif %}>
    <a href="/th{{ atopic.url }}">{{ atopic.title }}</a>
  </li>
{% endfor %}
</ul>

คุณควรสร้างไดเร็กทอรี _topic-a และ _topic-b พร้อมด้วยไฟล์ content-1.md, content-2.md ฯลฯ


โปรดทราบว่าโซลูชันทั้งสองมีตัวแปร YML ที่เรียกว่า 'ลำดับ' เพื่อกำหนดลำดับการปรากฏของรายการ/เพจ ดูเหมือนว่านี้:

---
title: mytitle
layout: mylayout
order: 50
---
mycontent
person JoostS    schedule 19.01.2017
comment
ขอบคุณสำหรับแนวทาง แต่มันก็ไม่ใช่สิ่งที่ฉันตั้งใจไว้ ตัวอย่างที่คุณให้ก็แค่แสดงรายการหน้าทั้งหมดบนไซต์ มีวิธีแยกเฉพาะรายการที่มีอยู่ในโฟลเดอร์ปัจจุบันหรือไม่ เช่น. รายการใน topic-a/index.md จะรวมเฉพาะเนื้อหาสำหรับหัวข้อ-a (ไม่มีอะไรจากหัวข้อ-b หรือหน้าแรก) - person Sauce McBoss; 19.01.2017
comment
ฉันได้อัปเดตคำตอบเพื่อแสดงวิธีแสดงรายการเฉพาะหัวข้อ A โดยใช้แนวทางหน้า - person JoostS; 19.01.2017
comment
ฉันยอมรับว่าโซลูชันที่ 2 เป็นโซลูชันที่สะอาดที่สุด และอาจปรับปรุงให้ดียิ่งขึ้นไปอีกโดยใช้ชุดของบทความทั้งหมดนี้และพิมพ์เป็นแอตทริบิวต์ขององค์ประกอบของคอลเลกชัน - person yaitloutou; 20.01.2017

ฉันจะเสนอ 2 วิธีที่นี่ คุณสามารถกำหนดวิธีที่ "ดีที่สุด" ตามความต้องการ/สถานการณ์เฉพาะของคุณได้ และวิธีใดที่เหมาะกับพวกเขามากกว่า

ประการแรก "โพสต์" และ "เพจ" เป็นเพียงคอลเล็กชันของไฟล์ md/html โดยมี ตัวแปร บางตัวที่เกี่ยวข้องกัน

เพื่อสร้างไฟล์ด้วยโครงสร้างนี้ คุณสามารถ:

1. การใช้ _posts และ page.categories

  1. ใส่ไฟล์ย่อยทั้งหมดไว้ใน _posts (2017-01-01- เป็นเพียงตัวยึดตำแหน่ง)

    _posts/
       - 2017-01-01-content-a-1.md
       - 2017-01-01-content-a-2.md
       - 2017-01-01-content-a-3.md
       - 2017-01-01-content-b-1.md
       - 2017-01-01-content-b-2.md
       - 2017-01-01-content-b-3.md
    
  2. เพิ่มหมวดหมู่ที่เหมาะสมให้กับแต่ละไฟล์:

    2.1. สำหรับโพสต์ caontent-a-* เพิ่มหมวดหมู่: topic-a (ตามลำดับนี้) โดยเพิ่มบรรทัดนี้ใน เรื่องส่วนหน้า yaml ที่ด้านบนของแต่ละรายการ:

    ---
     layout: page                  # or any appropriate layout 
     category: topic-a
     ---

    2.2. สำหรับโพสต์ caontent-b-* เพิ่มหมวดหมู่: topic-b

  3. ตั้งค่า premalink ให้ละเว้นวันที่ และสร้างโครงสร้างที่ต้องการ โดยเพิ่มบรรทัดต่อไปนี้ใน _config.yml : :

    defaults:
     -
       scope:
         path: "_posts" # to all the file in posts
       values:
         permalink: /landing/:categories/:title.html # set this as default permalink value
    

คุณยังคงสามารถระบุลิงก์ถาวรต่อโพสต์ในเรื่องส่วนหน้าได้ หรือเพียงเพิ่มบรรทัดลิงก์ถาวรไปยังส่วนหน้าของโฟลเดอร์ md แต่ละโฟลเดอร์

ข้างต้นจะได้โครงสร้างที่ต้องการ

  1. วนซ้ำผ่านทั้งหมด

    {% for entry in site.posts %}
       {% if entry.category == type-a %}
          <!-- do A stuff -->
       {% elsif entry.category == type-b %}
          <!-- do B stuff -->
       {% endif %}
    {% endfor %}
    

2. การใช้คอลเลกชัน:

มันคล้ายกับข้างต้น แต่แทนที่จะใช้ _postscollection ที่มีอยู่แล้ว คุณจะเริ่มต้นด้วย การสร้างคอลเลกชันใหม่ (ข้อดีอย่างหนึ่งคือคุณไม่จำเป็นต้องเพิ่ม date )

วิธีการใดๆ ข้างต้นจะสร้างโครงสร้างนี้ภายใน _site

landing/
  type-a/
    content-a-1/
      index.html
    content-a-2/
      index.html
    ...
  type-b/
    ... 
person yaitloutou    schedule 19.01.2017