J'utilise une vue sous forme de tableau pour afficher une liste d'articles article-list
en utilisant des vues déplaçables pour permettre aux éditeurs de classer la liste. Je personnalise le contenu des lignes en fonction d'un champ booléen is_header
et un champ de texte formaté title_override
. J'ai sous-thème views-view-table--article-list.html.twig
pour y parvenir. Cela fonctionne assez bien.
Dans le modèle, je teste la vérité de is_header
et le non-vide de title_override
comme suit:
{% if row.columns.field_is_header|render|striptags|trim %}
et
{% if row.columns.field_title_override|render|striptags|trim %}
Ces tests donnent les bons résultats, mais ils rendent le modèle très lent! Rien de moins que render|striptags|trim
ne fonctionne pas.
QUESTION:
Existe-t-il un moyen d'accéder directement aux valeurs de données brutes de ces variables pour éviter le render|striptags|trim
les frais généraux?
J'ai vu des suggestions pour utiliser quelque chose comme row._entity.field_is_header
, mais cette façon d'utiliser _entity
semble fonctionner uniquement dans les modèles pour les styles de vue HTML ou non formatés. Il semble qu'il devrait y avoir un moyen facile de le faire.
Remarque: le passage à l'utilisation d'un style HTML ou non formaté ne semble pas possible car les vues déplaçables AFAIK ne peuvent être configurées qu'avec le format de tableau.
RÉPONSE:
Merci à 4k4 pour la réponse à cette question (voir ci-dessous). Pour appliquer sa réponse générale à ma question spécifique, voici un extrait du script twig avec lequel je me suis retrouvé:
{% for key, row in rows %}
{% if view.field.field_is_header.value(view.result[key]) %}
<conditional stuff>
{% endif %}
{% if view.field.field_title_override.value(view.result[key]) %}
<stuff when the override is non-empty>
{% else %}
<stuff when the override is empty>
{% endif %}
{% endfor %}
Notez que rows
est un tableau normalement transmis au modèle views-view-table.html.twig, comme indiqué dans les commentaires d'en-tête du modèle d'origine. Notez également que la disponibilité du tableau view
n'est PAS documentée dans les commentaires d'en-tête du modèle d'origine (pas qu'il m'aurait sauvé sans l'aide de 4k4).
Vous pouvez essayer d'appliquer getValue () du gestionnaire de champ sur la ligne de résultat, par exemple:
{% if view.field.field_name.value(view.result[key]) %}
Éditer:
Dans un modèle de table de vues row
n'est pas du type ResultRow
, vous devez donc l'obtenir directement à partir de l'objet view
en utilisant key
de la boucle {% for key, row in rows %}
.
Voir ces questions pour différents modèles de vues: Comment puis-je obtenir des données de l'objet ResultRow dans le modèle de vues et Comment prétraiter le champ de vue?