2013-04-22 11 views
9

Kurzversion:Erhalten nächste und vorherige Elemente aus einem Array in flüssiger

I 1 auf eine Zahl in einer flüssigen Vorlage hinzufügen mag, und das Ergebnis als Array-Index verwenden.

{% 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> 

Ergebnis:

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

Lange Version:

ich Jekyll bin mit, ohne Plugins. Ich möchte dem aktuellen Beitrag einen Link zum nächsten Beitrag in derselben Kategorie geben. (In diesem Code ist die Kategorie auf "Journal" festgelegt.)

Mein Code führt eine Schleife über alle Posts im Array category und sucht nach dem aktuellen Post. Wenn es gefunden wird, versuche ich den nächsten Post in der Kategorie-Array zu greifen.

{% 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> 

Ergebnis:

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

Ich denke, den Wert meiner Variable 'plus_one' als String behandelt wird statt einer Nummer.

Gibt es eine Möglichkeit, es in eine Zahl zu konvertieren?

Oder gibt es einen anderen Weg zu erreichen, was ich versuche zu tun?

Antwort

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 %} 

Wie Sie haben erwähnt, können Sie die vorherigen Iteration Wert für den vorherigen Post Link speichern und verwenden (in meinem Fall habe ich es als die nächste Postlink verwenden, da ich die Standard-neueste-erster Ordnung nicht wollen) . Für das nächste Array-Element können Sie forloop.index verwenden. Dies ist der 1-basierte Index der for-Schleife und gibt Ihnen das nächste Element eines nullbasierten Arrays.

2

Sie können auf die nächste/vorherige Nachricht über oder page.previousas described in the jekyll wiki zugreifen.

Wenn Sie möchten, dass es in derselben Kategorie ist, müssen Sie es einer temporären Variablen zuweisen. Wiederholen Sie diesen Schritt, bis Sie einen passenden Beitrag (einen Beitrag in der gleichen Kategorie) finden.

Sie können Ihre Variable plus_one nicht verwenden, weil Flüssigkeit funktioniert - es ist nur eine Zeichenfolge. Die Verwendung von Mathe in Flüssigkeit ist ziemlich kompliziert, ich bekam fast Kopfschmerzen, als ich meine gewichtete Tag-Wolke in Flüssigkeit implementierte.

+0

Das klingt besser als die Lösung, die ich unten geschrieben, können aber zeigen Sie ein Beispiel, wie man „diesen Schritt durchlaufen“, so dass wir fordern page.next halten können, bis wir eine Seite mit der passenden Kategorie gefunden haben ? –

+0

Iteration ist ein grundlegendes Konzept der Programmierung, Sie tun es sogar in Ihrer eigenen geposteten Antwort, also weiß ich nicht wirklich, wie ich darauf antworten soll. – Polygnome

+0

Sorry, meine Frage war nicht sehr klar. Ich habe versucht, nach dem Zustand der Schleife zu fragen. Im Idealfall möchten wir nur loop _until_ eine passende Seite gefunden wird. Es wäre jedoch akzeptabel, eine Schleife zu machen, bis wir die letzte Seite erreicht haben (wenn page.next null ist). Bisher habe ich noch keine Möglichkeit gefunden, Liquid zu einer Schleife zu machen, die unter diesen Bedingungen beendet wird. –

5

assign bewahrt die Nummer:

{% 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

Ich war ein ähnliches Problem hat, mit den Antworten oben ich folgende Arbeiten an meiner Seite habe. Könnte jemand anderem helfen.

{% 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

Ich weiß nicht, ob Jekyll seit der angenommenen Antwort geändert hat, aber ich musste ein paar Änderungen vornehmen, um es zur Arbeit zu bringen. Laut der jekyll-Variablen-Dokumentation gibt es keine page.category, nur eine Liste von page.categories. In meiner Website verwende ich nur eine Kategorie pro Post, so dass die erste für mich funktioniert. Wenn Sie mehrere Kategorien pro Post verwenden, müssen Sie dies optimieren. Ich habe auch Probleme festgestellt, weil meine Kategorien groß geschrieben sind, also habe ich den Fall hinzugefügt. Und schließlich, in meiner Konfiguration.Ich benutze URL nicht Baseurl. Hoffentlich hilft das anderen Leuten, weil dies der einfachste Weg war, um vorige/nächste Links nach Kategorie zu allen Beiträgen hinzuzufügen.

{% 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

Gerade gemerkt, dass das "| downcase" Argument, das ich verwendete, "ungültiges Rohr" mit jekyll-serve für die neue Version 3.0.0 veröffentlichte. Wenn Sie es löschen, wird es wieder funktionieren. – Maikeximu

Verwandte Themen