12 votes

Obtenir les éléments suivants et précédents d'un tableau en liquide

Version courte :

Je veux ajouter 1 à un nombre dans un modèle liquide et utiliser le résultat comme index de tableau.

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

Résultat :

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

Version longue :

J'utilise Jekyll, sans plugins. Je veux donner à l'article actuel un lien vers l'article suivant qui est dans la même catégorie. (La catégorie est codée en dur à 'journal' dans ce code).

Mon code passe en revue tous les articles du tableau des catégories, à la recherche de l'article en cours. Lorsqu'il est trouvé, j'essaie de récupérer l'article suivant dans le tableau des catégories.

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

Résultat :

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

Je suppose que la valeur de ma variable "plus_one" est traitée comme une chaîne de caractères au lieu d'un nombre.

Existe-t-il un moyen de le convertir en nombre ?

Ou existe-t-il un autre moyen de réaliser ce que j'essaie de faire ?

9voto

user74112 Points 106
{% 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 %}

Comme vous l'avez mentionné, vous pouvez enregistrer et utiliser la valeur de l'itération précédente pour le lien de l'article précédent (dans mon cas, je l'utilise comme lien de l'article suivant, car je ne veux pas l'ordre par défaut nouveau-premier). Pour l'élément suivant du tableau, vous pouvez utiliser forloop.index . Il s'agit de l'indice basé sur 1 de la boucle for et vous donnera l'élément suivant d'un tableau basé sur zéro.

8voto

Archagon Points 685

assign conserve le numéro :

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

2voto

Polygnome Points 4766

Vous pouvez accéder à l'article suivant/précédent via page.next o page.previous comme décrit dans le wiki de Jekyll .

Lorsque vous voulez qu'il soit dans la même catégorie, vous devez l'assigner à une variable temporaire et itérer cette étape jusqu'à ce que vous trouviez un message correspondant (un message dans la même catégorie).

Vous ne pouvez pas utiliser votre variable plus_one en raison de la manière dont fonctionne le liquide - il s'agit simplement d'une chaîne de caractères. L'utilisation des mathématiques dans Liquid est assez compliquée, j'ai presque eu mal à la tête lorsque j'ai implémenté mon nuage de tags pondérés dans Liquid.

2voto

chill182 Points 167

Je ne sais pas si jekyll a changé depuis la réponse acceptée, mais j'ai dû faire quelques changements pour que cela fonctionne. D'après la documentation sur les variables de jekyll, il n'y a pas de page.category, seulement une liste de page.categories. Dans mon site, je n'utilise qu'une seule catégorie par article, donc la première me convient. Si vous utilisez plusieurs catégories par article, vous devrez modifier cela. J'ai également rencontré des problèmes parce que mes catégories sont en majuscules, j'ai donc ajouté la minuscule. Enfin, dans mon config.yml, j'utilise url et non baseurl. J'espère que cela aidera d'autres personnes car c'est le moyen le plus simple que j'ai trouvé pour ajouter des liens prev/next par catégorie à tous les articles.

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

1voto

alexmcfarlane Points 675

J'ai eu un problème similaire, en utilisant les réponses ci-dessus, j'ai réussi à faire fonctionner ce qui suit sur mon site. Cela pourrait aider quelqu'un d'autre.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X