Подтвердить что ты не робот

Для цикла оберните каждые две записи в div

В принципе, я использую Jekyll (который использует Liquid tempating language), и я пытаюсь написать цикл for, который обертывает каждые два элемента в div.

Это мой текущий цикл:

<div>
  {% for post in site.posts %}
    <a href="{{ post.url }}">{{ post.title }}</a>
  {% endfor %}
</div>

Что бы выводить четыре сообщения, например:

<div>
  <a href="#">Title</a>
  <a href="#">Title</a>
  <a href="#">Title</a>
  <a href="#">Title</a>
</div>

Мой желаемый результат для четырех сообщений:

<div>
  <a href="#">Title</a>
  <a href="#">Title</a>
</div>

<div>
  <a href="#">Title</a>
  <a href="#">Title</a>
</div>

Как я могу это сделать?

4b9b3361

Ответ 1

Я знаю, что я опаздываю на игру, но я нашел то, что я чувствую, довольно элегантное решение, которое не кажется хриплым.

С параметрами for loop limit и offset мы можем перебирать по одной строке за один раз, по N сообщений в строке.

Сначала мы подсчитываем количество строк, которые нам нужно перечислить:

{% assign rows = site.posts.size | divided_by: 2.0 | ceil %}

эквивалент Ruby будет rows = (posts.size / 2.0).ceil (нечетные числа получат свою собственную строку).

Далее мы будем перебирать строки:

{% for i in (1..rows) %}
  <div>

Теперь нам нужно вычислить смещение коллекции с помощью (i - 1) * 2 (используя forloop.index0):

  {% assign offset = forloop.index0 | times: 2 %}

Затем мы можем перебирать срез сообщений, начиная со смещения строки (эквивалентно posts[offset, 2] в Ruby):

    {% for post in site.posts limit:2 offset:offset %}
      <a href="{{ post.url }}">{{ post.title }}</a>
    {% endfor %}

Закройте элемент div и за цикл:

  </div>
{% endfor %}

Что это!

В Ruby это будет:

rows = (posts.size / 2.0).ceil # the number of rows
(1..rows).each do |i|
  offset = (i - 1) * 2
  # <div>
  posts[offset, 2].each do |post|
    # <a href="#{post.url}>#{post.title}</a>
  end
  # </div>
end

Теперь все вместе, в Liquid:

{% assign rows = site.posts.size | divided_by: 2.0 | ceil %}
{% for i in (1..rows) %}
  {% assign offset = forloop.index0 | times: 2 %}
  <div>
    {% for post in site.posts limit:2 offset:offset %}
      <a href="{{ post.url }}">{{ post.title }}</a>
    {% endfor %}
  </div>
{% endfor %}

Надеюсь, это поможет кому-то!

Ответ 2

Если число <div> и сообщений фиксировано (что, по-видимому, зависит от того, какой ответ вы выбрали), существует более короткий способ получить тот же результат - используя limit и offset:
(Жидкий подход к поисковому вызову)

<div>
  {% for post in site.posts limit: 2 %}
    <a href="{{ post.url }}">{{ post.title }}</a>
  {% endfor %}
</div>
<div>
  {% for post in site.posts limit: 2 offset: 2 %}
    <a href="{{ post.url }}">{{ post.title }}</a>
  {% endfor %}
</div>

Еще лучшее решение:

Если количество сообщений не фиксировано (поэтому, когда у вас есть 100 сообщений, вы хотите 50 <div> с двумя сообщениями каждый), то вы можете использовать forloop.index (который уже упоминался в большинстве других ответов) и используйте modulo, чтобы узнать, является ли текущий индекс четным или нечетным:

{% for post in site.posts %}
  {% assign loopindex = forloop.index | modulo: 2 %}
  {% if loopindex == 1 %}
    <div>
      <a href="{{ post.url }}">{{ post.title }}</a>
  {% else %}
      <a href="{{ post.url }}">{{ post.title }}</a>
    </div>
  {% endif %}
{% endfor %}

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

Ответ 3

Я только что наткнулся на это (https://gist.github.com/leemachin/2366832), который является гораздо лучшим решением, чем те, которые были опубликованы в других ответах, в виду вам понадобится этот плагин (https://gist.github.com/leemachin/2366832#file-modulo-filter-rb), чтобы он работал:

{% for post in paginator.posts %}

  {% capture modulo %}{{ forloop.index0 | mod:2 }}{% endcapture %}

  {% if modulo == '0' or forloop.first %}
    <div>
  {% endif %}

    <a href="{{ post.url }}">{{ post.title }}</a>

  {% if modulo == '1' or forloop.last %}
    </div>
  {% endif %}

{% endfor %}

Ответ 4

Попробуйте следующее:

<div>
    {% for post in paginator.posts %}
        <div>
            {% if forloop.index == 1 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
            {% if forloop.index == 2 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
        </div>
        <div>
            {% if forloop.index == 3 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
            {% if forloop.index == 4 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
        </div>
    {% endfor %}
</div>

Ответ 5

Мне действительно нужно сосредоточиться на том, что я делаю, но трудно с одним годом, дав мне все свои игрушки...: D

Теперь код должен работать:

<div>
    <div>
        {% for post in paginator.posts %}
            {% if forloop.index == 1 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
            {% if forloop.index == 2 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
        {% endfor %}
    </div>
    <div>
        {% for post in paginator.posts %}
            {% if forloop.index == 3 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
            {% if forloop.index == 4 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
        {% endfor %}
    </div>
</div>

Должен указать html:

<div>
    <div>
        <a href="">Title 1</a>
        <a href="">Title 2</a>
    </div>
    <div>
        <a href="">Title 3</a>
        <a href="">Title 4</a>
    </div>
</div>

Ответ 6

Хорошо, я сделал быструю попытку без правильного стиля, но это должно работать:

<div>
{% for post in paginator.posts %}
    {% case forloop.index %}
    <div>
    {% when 1 %}
        <a href="">{{ post.title }}</a>
    {% when 2 %}
        <a href="">{{ post.title }}</a>
    </div>
    <div>
    {% when 3 %}
        <a href="">{{ post.title }}</a>
    {% when 4 %}
        <a href="">{{ post.title }}</a>
    </div>
{% endcase %}
{% endfor %}
</div>

Ответ 7

С помощью @smilinmonki666 у меня есть эта работа, как я тоже этого хочу, вот окончательный код, с которым я пошел:

{% assign current_page_posts = paginator.posts | size %}

{% if current_page_posts > 0 %}
  <div>

    <div>
      {% for post in paginator.posts %}
        {% if forloop.index == 1 %}
          <a href="{{ post.url }}">{{ post.title }}</a>
        {% endif %}

        {% if forloop.index == 2 %}
          <a href="{{ post.url }}">{{ post.title }}</a>
        {% endif %}
      {% endfor %}
    </div>

    {% if current_page_posts > 2 %}
      <div>
        {% for post in paginator.posts %}
          {% if forloop.index == 3 %}
            <a href="{{ post.url }}">{{ post.title }}</a>
          {% endif %}

          {% if forloop.index == 4 %}
            <a href="{{ post.url }}">{{ post.title }}</a>
          {% endif %}
        {% endfor %}
      </div>
    {% endif %}

  </div>
{% endif %}

Ответ 8

Посмотрев на христианское решение, я обновил свой код (на основе мопса) до:

.blog
    .container
        .row
            .col-xs-0
            .col-xs-12
                h1 Blog
                p Summit blog with latest news, thinking and participant posts.
            .col-xs-0
        | {% for page in site.posts                         %}
        | {% assign loopindex = forloop.index | modulo: 2   %}
        | {% if loopindex == 1                              %}
        .row
        | {% endif %}
        span
            .col-xs-6.col-sm-6
                .card
                    .card-top
                        + add-title
                        + add-author
                    .card-block
                        + add-snippet
        | {% endfor                                        %}