2013-04-22 1 views
9

Короткой версии:Получить следующие и предыдущие элементы из массива в жидкой

Я хочу добавить 1 к номеру в жидкой матрице и использовать результат в качестве индекса массива.

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

Результат:

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

Длинная версия:

Я использую Джекил, без плагинов. Я хочу дать текущему сообщению ссылку на следующую запись, которая находится в той же категории. (Эта категория жестко закодирована для «журнала» в этом коде.)

Мой код перебирает все сообщения в массиве категорий, ища текущую запись. Когда он будет найден, я попытаюсь захватить следующую запись в массиве категорий.

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

Результат:

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

Я предполагаю, что значение моей переменной «plus_one» обрабатывается как строка вместо номера.

Есть ли способ конвертировать его в число?

Или есть другой способ достичь того, что я пытаюсь сделать?

ответ

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

Как вы уже упоминали вы можете сохранить и использовать предыдущее значение итерации для предыдущего столба линии связи (в моем случае, я использую его в качестве следующей после ссылки, так как я не хочу по умолчанию Новейший-первый заказ) , Для следующего элемента массива вы можете использовать forloop.index. Это 1-основанный индекс цикла for и даст вам следующий элемент массива с нулевым значением.

2

Вы можете получить доступ к следующему/предыдущему сообщению через page.next или page.previousas described in the jekyll wiki.

Если вы хотите, чтобы он был в той же категории, вы должны назначить его переменной temp итерации этого шага, пока не найдете подходящую запись (сообщение в той же категории).

Вы не можете использовать переменную plus_one из-за того, как работает жидкость - это просто строка. Использование математики в жидкости довольно сложно, у меня почти появилась головная боль, когда я применил взвешенное облако тегов в жидкости.

+0

Это звучит лучше, чем решение, которое я разместил ниже, но вы можете показать пример того, как «итерации этого шага», так что мы можем продолжать называть page.next, пока мы не нашли страницу с категорией соответствия ? –

+0

Итерация - фундаментальная концепция программирования, вы даже делаете это в своем собственном ответе, поэтому я действительно не знаю, как ответить на это. – Polygnome

+0

Извините, мой вопрос был не очень ясен. Я пытался спросить о состоянии цикла. В идеале мы хотим, чтобы только loop _until_ находилась соответствующая страница. Однако было бы приемлемым цикл, пока мы не достигли последней страницы (когда page.next равно null). До сих пор я не нашел способа заставить Liquid создать цикл, который завершится в любом из этих условий. –

5

assign сохраняет номер:

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

У меня была аналогичная проблема, используя ответы выше, я получил следующую работу на моем сайте. Может помочь кому-то другому.

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

Я не знаю, изменился ли с момента принятия ответа jekyll, но мне пришлось внести пару изменений, чтобы заставить его работать. Согласно документации на jekyll variables нет страницы. Category, только список page.categories. На моем сайте я использую только одну категорию за сообщение, поэтому для меня работает первый. Если вы используете несколько категорий для каждой должности, вам придется настроить ее. Кроме того, я столкнулся с проблемами, потому что мои категории капитализируются, поэтому я добавил нижний регистр. И, наконец, в моей конфигурации.yml Я использую url not baseurl. Надеюсь, это поможет другим людям, потому что это был самый простой способ найти предыдущие/следующие ссылки по категориям для всех сообщений.

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

Только что заметил, что аргумент «| нижний регистр», который я использовал, создает «недопустимый канал» с jekyll-сервисом для новой версии 3.0.0. Если вы удалите его, он снова будет работать. – Maikeximu

Смежные вопросы