2013-04-22 23 views
9

Phiên bản ngắn:Lấy các phần tử tiếp theo và trước đó ra khỏi một mảng trong chất lỏng

Tôi muốn thêm 1 vào một số trong mẫu chất lỏng và sử dụng kết quả làm chỉ mục mảng.

{% capture plus_one %}{{ 0 | plus: 1 }}{% endcapture %} 
<div>-Value of plus_one: {{plus_one}}</div> 
<div>-This works: {{site.posts[1].title}}</div> 
<div>-This doesn't: {{site.posts[plus_one].title}}</div> 

Kết quả:

-Value of plus_one: 1 
-This works: The Zone 
-This doesn't: 

phiên bản Long:

Tôi đang sử dụng Jekyll, không có plugins. Tôi muốn cung cấp cho bài đăng hiện tại một liên kết tới bài đăng tiếp theo thuộc cùng một danh mục. (Danh mục được mã hóa thành 'tạp chí' trong mã này.)

Mã của tôi lặp qua tất cả các bài đăng trong mảng danh mục, tìm kiếm bài đăng hiện tại. Khi nó được tìm thấy, tôi cố gắng lấy bài tiếp theo trong mảng danh mục.

{% for num in (0..site.categories.journal.size) %} 
    {% assign page2 = site.categories.journal[num] %} 
     {% if page2.title == page.title and page2.date == page.date %} 
      {% capture plus_one %}{{ num | plus: 1 }}{% endcapture %} 
     {% endif %} 
{% endfor %} 

<div>value of plus_one: {{plus_one}}</div> 
<div>This doesn't work: {{site.categories.journal[plus_one].title}}</div> 
<div>This does: {{site.categories.journal[1].title}}</div> 

Kết quả:

<div>value of plus_one: 1</div> 
<div>This doesn't work: </div> 
<div>This does: A Blog Post Title</div> 

Tôi đoán giá trị của biến 'plus_one' của tôi đang được coi là một chuỗi thay vì một số.

Có cách nào để chuyển đổi số đó thành một số không?

Hoặc có cách nào khác để đạt được những gì tôi đang cố gắng làm không?

Trả lời

9
{% for category in site.categories %} 
    {% assign catg_name = category.first %} 
    {% if catg_name == page.category %} 
     {% assign catg_posts = category.last %} 
    {% endif %} 
{% endfor %} 
{% for post in catg_posts %} 
    {% if post.title == page.title %} 
     {% unless forloop.last %} 
      {% assign next = catg_posts[forloop.index] %} 
      <li class="previous"> 
      <a href="{{ site.baseurl }}{{ next.url }}">&larr;{{ next.title }}</a> 
      </li> 
     {% endunless %} 
     {% unless forloop.first %} 
      <li class="next"> 
      <a href="{{ site.baseurl }}{{ prev.url }}">{{ prev.title }}&rarr;</a> 
      </li> 
     {% endunless %} 
    {% endif %} 
    {% assign prev = post %} 
{% endfor %} 

Như bạn đã đề cập, bạn có thể tiết kiệm và sử dụng giá trị lặp trước cho post link trước (trong trường hợp của tôi, tôi sử dụng nó như là post link tiếp theo kể từ khi tôi không muốn mặc định trật tự mới nhất đầu tiên) . Đối với phần tử mảng tiếp theo, bạn có thể sử dụng forloop.index. Đây là chỉ số dựa trên 1 của vòng lặp for và sẽ cung cấp cho bạn mục tiếp theo của mảng không dựa trên.

2

Bạn có thể truy cập bài đăng tiếp theo/trước đó qua page.next hoặc page.previousas described in the jekyll wiki.

Khi bạn muốn nó nằm trong cùng một danh mục, bạn phải gán nó cho biến tạm thời lặp lại bước đó cho đến khi bạn tìm thấy bài đăng phù hợp (bài đăng trong cùng một danh mục).

Bạn không thể sử dụng biến plus_one vì cách thức hoạt động của chất lỏng - nó chỉ là một chuỗi. Sử dụng toán học trong chất lỏng khá phức tạp, tôi gần như bị đau đầu khi tôi thực hiện đám mây từ khóa có trọng số của tôi trong chất lỏng.

+0

Điều này nghe có vẻ tốt hơn giải pháp tôi đã đăng bên dưới, nhưng bạn có thể hiển thị ví dụ về cách "lặp lại bước đó" để chúng tôi có thể tiếp tục gọi trang.next cho đến khi chúng tôi tìm thấy trang có danh mục phù hợp ? –

+0

Lặp lại là một khái niệm cơ bản về lập trình, thậm chí bạn làm điều đó trong câu trả lời được đăng của riêng bạn, vì vậy tôi không thực sự biết cách phản ứng lại điều đó. – Polygnome

+0

Xin lỗi, câu hỏi của tôi không rõ ràng lắm. Tôi đã cố hỏi về điều kiện vòng lặp. Lý tưởng nhất là chúng tôi muốn chỉ vòng _until_ một trang phù hợp được tìm thấy. Tuy nhiên nó sẽ được chấp nhận để vòng lặp cho đến khi chúng tôi đã đạt đến trang cuối cùng (khi page.next là null). Cho đến nay, tôi đã không tìm thấy một cách để làm cho Liquid tạo ra một vòng lặp mà sẽ chấm dứt theo một trong các điều kiện này. –

5

assign bảo tồn số:

{% for item in items %} 
    {% assign next_i = forloop.index0 | plus: 1 %} 
    {% assign prev_i = forloop.index0 | minus: 1 %} 
    {{ items[next_i] }} 
    {{ items[prev_i] }} 
{% endfor %} 
0

Tôi đã có một vấn đề tương tự, sử dụng các câu trả lời trên, chúng tôi đã làm việc sau trên trang web của tôi. Có thể giúp đỡ người khác.

{% for num in (0..site.categories.work.size) %} 
    {% assign page2 = site.categories.work[num] %} 
    {% if page2.title == page.title and page2.date == page.date %} 
     {% assign next_i = forloop.index0 | plus: 1 %} 
     {% assign prev_i = forloop.index0 | minus: 2 %} 

     {% if next_i == site.categories.work.size %} 
      {% assign next_i = 1 %} 
     {% endif %} 
    {% endif %} 
{% endfor %} 

<nav class="pagination"> 
    <div class="next"> 
     <a href="work/{{site.categories.work[next_i].slug}}/">Next</a> 
    </div> 
    <div class="previous"> 
     <a href="work/{{site.categories.work[prev_i].slug}}/">Previous</a> 
    </div> 
</nav> 
2

Tôi không biết liệu jekyll có thay đổi kể từ câu trả lời được chấp nhận hay không nhưng tôi phải thực hiện một vài thay đổi để làm cho nó hoạt động. Theo tài liệu biến jekyll không có một page.category, chỉ có một danh sách các page.categories. Trong trang web của tôi, tôi chỉ sử dụng một danh mục cho mỗi bài đăng để nhận được danh mục đầu tiên phù hợp với tôi. Nếu bạn sử dụng nhiều danh mục cho mỗi bài đăng, bạn sẽ phải tinh chỉnh điều này. Ngoài ra tôi đã gặp phải vấn đề bởi vì các danh mục của tôi được viết hoa nên tôi đã thêm chữ viết hoa. Và cuối cùng, trong cấu hình của tôi.yml Tôi đang sử dụng url không phải baseurl. Hy vọng rằng điều này sẽ giúp người khác bởi vì đây là cách dễ nhất tôi tìm thấy để thêm prev/liên kết tiếp theo theo thể loại cho tất cả các bài viết.

{% for category in site.categories %} 
    {% assign catg_name = category.first %} 
    {% if catg_name == page.categories.first | downcase %} 
     {% assign catg_posts = category.last %} 
    {% endif %} 
{% endfor %} 
{% for post in catg_posts %} 
    {% if post.title == page.title %} 
     {% unless forloop.last %} 
      {% assign next = catg_posts[forloop.index] %} 
      <a href="{{ site.url }}{{ next.url }}">&larr;{{ next.title }}</a> | 
     {% endunless %} 
     {% unless forloop.first %} 
      | <a href="{{ site.url }}{{ prev.url }}">{{ prev.title }}&rarr;</a> 
     {% endunless %} 
    {% endif %} 
    {% assign prev = post %} 
{% endfor %} 
+0

Chỉ cần nhận thấy rằng đối số "| downcase" tôi đã sử dụng tạo "pipe không hợp lệ" với jekyll-serve cho phiên bản 3.0.0 mới được phát hành. Nếu bạn xóa nó, nó sẽ hoạt động trở lại. – Maikeximu