views
#
Views#
IntroductionATTENTION: Lorsque l'on fait des views avec affichage de node (dans la config de la vue: format afficher contenu), l'utilisation des twigs de node associĂ©s aux vues fonctionne mal et si vous avez plusieurs vues diffĂ©fentes qui affichent les mĂȘme type de contenu node, leur affichage ne fonctionnera pas correctement. C'est un bug Drupal 8 connu: https://drupal.stackexchange.com/questions/248748/twig-templates-for-nodes-in-different-views/248768 Pour rĂ©soudre ce problĂšme, utiliser des modes d'affichage diffĂ©rents (full, teaser, default ...) pour les nodes. Par exemple pour une vue "agenda" qui affiche des nodes dont le type de contenu est "event" : au lieu de crĂ©er un twig node--view--agenda.html.twig, utiliser un node--event--full.html.twig
Dans les vues, n'utiliser que des unformatted list of fields avec affichage du Node dans mode d'affichage différent par bloc de vue
#
GĂ©rer les rĂ©pĂ©titions- Pour Ă©viter qu'un mĂȘme rĂ©sultat se rĂ©pĂšte dans l'affichage :
- Ouvrir les paramÚtres avancés de la vue
- Passer "utiliser l'agrégation" de 'non' à 'oui'
#
Créer une page de vue- Créer une view du nom de "Actualités"
- show content of type article sorted by newest first
- Create a page doit ĂȘtre cochĂ©, le nom de la page sera "actualites"
- Display format: Unformatted list of fields.
- Vider Items to display et décocher "Use a pager"
- Save and Edit
#
Permettre la sélection à l'utilisateur- Ajouter un "filter criteria", on ajoute Content: Tags / Non exposé aux utilisateurs
- Ajouter un "filter criteria", on ajoute Content: Département, Sites, Marchés, Thématiques :
- Sélectionner le mode dropdown
- Sélectionner Expose this filter to visitors
- Sélectionner Single filter
- puis Operator "is one of"
- Ajouter un "filter criteria", on ajoute Content: Date / Est compris entre
- Sauvegarder
#
Implémenter Ajax- Cliquer sur Advanced
- Use Ajax
#
Les suggestions en ajax (pager, filters, etc...)- créer la suggestion souhaitée dans le .theme :
- Pour vérifier si on rentre dans de l'ajax, on peut tester avec ce code :
if ($isAjax = \Drupal::request()->isXmlHttpRequest())
- Puis dans cette condition(=> if) ajouter le code pour la suggestion ajax souhaitée :
Il faudra ensuite utiliser le module custom view_filter que nous avons créé
#
Tips ajax- Ne pas delete les div (contenant les classes js appropriées) dans les fichiers concernés : views-view.html.twig - container.html.twig et views-view-unformatted.html.twig
- Pour l'infinite scroll en ajax bien garder les classes js (comme les autres files) ET bien garder les tags html ul/li
- Dans le cas des filtres de vue, éxécuter le tri en js et cacher les filtres (cf. projet dalet : connect.dalet.com) :
PS: Attention à bien détecter le clique sur le body plutÎt que directement sur la classe !
#
Permettre l'affichage de rĂ©sultats en fonction de 2 champs contextuels diffĂ©rentsEx. J'ai créé un champ au niveau du node article appelĂ© "co-auteur". Ainsi un utilisateur peut-ĂȘtre auteur ou co-auteur d'un article. Pour afficher tous les articles dans lesquels il est auteur ou co-auteur :
utiliser le module views_contextual_filters_or
Puis dans la vue :
- Mettre les 2 champs en filtres contextuels avec "fournir une valeur par dĂ©faut" (ici identifiant depuis le contexte de la route car je veux les articles de la personne loggĂ©e en ce moment). -Dans paramĂštres de la requĂȘte, cocher "contextual filter OR"
#
Titre d'une vuele titre de votre vue ne s'affiche pas en front... Pour l'afficher en front, il faut dans un module mettre :
#
Personnaliser le nom des onglets (Block, Page) de la vue en BO- Sur la page de détail de la vue, cliquer sur le
Display name
(en haut de la page) - Mettre à jour le libellé
Vous pourrez alors afficher le titre de la vue sur votre front : {{title}}
#
Compter les résultats d'une vue en-dehors de cette vue- {{ drupal_view_result('brand_plans', 'block_1')|length }}
#
Passer une variable à une vue- Depuis Twig Tweak, on peut faire ça :
Ce nombre 10 sera récupéré sur la vue ou sur l'unformatted de la vue avec :
!! A noter !! Cet argument (10) peut ĂȘtre liĂ© avec des contextual filters : Exemple : On créé un contextual filter sur l'id, 10 correspond Ă l'id d'un node.
Par exemple je suis sur un node de contenu et je veux faire varier le nb d'items de ma vue en fonction du nombre d'items que j'ai sur un field "field_a_lire_aussi", du cÎté de mon node :
et dans mon docroot/themes/custom/inaglobal/templates/view/article-a-lire-aussi/views-view-unformatted--article-a-lire-aussi.html.twig :
#
Afficher tous les nodes qui ont le mĂȘme referenced entity parent#
Exemple- J'ai un type de contenu "série"
- J'ai un type de contenu "épisode"
- chaque épisode référence une entité série via "field_serie"
- Lorsque j'affiche un épisode, je veux afficher TOUS les autres épisodes de cette série
- Je crée dans ma vue une relation "content référencé depuis field_serie"
- Je crée une autre relation "content utilise field_serie" avec comme relation la relation précédente
- Je crée un filtre contextuel sur l'ID de node avec en relation la seconde (content utilise field_serie) et je fournis en valeur par défaut identifiant (ID) à partir de l'URL => Cela va afficher tous les épisodes de la série (y compris celui qui s'affiche en épisode pricnipal sur ma page)
- Je crĂ©e un nouveau filtre contextuel sur l'ID de node (encore) sans relation et avec en valeur par dĂ©faut l'identifiant Ă partir de l'URL et tout en bas dans "more" je clique sur exclure => Cela affiche TOUS les Ă©pisodes de la sĂ©rie de l'Ă©pisode affichĂ© sur la page, sauf l'Ă©pisode lui-mĂȘme !
#
Traductions- Ajouter un critĂšre de filtre
- Séléctionner "content : translation language"
- Filtrer sur "Interface text language selected for page"
#
Créer une URL de vue en fonction de la langue- Aller dans 'admin/configuration/url aliases' et créer un alias du chemin de la vue dans la langue souhaitée. Pour l'utiliser depuis twig, se référer à "Afficher l'url d'une vue" plus haut.
#
Créer une vue d'admin- Créer une vue
- Dans la vue : Lui mettre un chemin d'url (qui commence par /admin)
- Dans la vue : L'associer Ă un menu de la navigation admin
- Pour rendre les colonnes triables au clic sur l'entĂȘte, dans le Format:Tableau entrer dans ParamĂštres et cocher les cases dans la colonne Classable
#
Créér un bouton d'action sur les vues d'admin- Activer le module Views Add Button
- Dans la vue concernée, dans ENTETE, ajouter et configurer un Entity Add Button :
- Entity Type = Sélectionner l'entité concernée
- Button Text for the add button = Libellé du bouton (e.g. Ajouter un article)
- Button classes for the add link = Coller les classes : button button-action button--primary button--small
#
Vue par défaut d'admin des contenusSi la vue admin/content n'existe plus (supprimé par erreur ou supprimé par Drupal), voici le moyen de la recréer :
- Goto Configuration > Development > Synchronization > Import tab > Single item, Configuration type: View and paste into the code below into "Paste your configuration here" and press Import. et importer la vue qui est sauvegardée en yml.
#
Créer une vue RSS- Ajouter une page de type Flux à la vue content par défaut
- ParamÚtre du flux : Créer le chemin (e.g. /rss)
- Configurer la vue :
- Ajouter les champs Titre, chapo, publié le, écrit par, lien vers le contenu (rendre l'url en tant que texte)
- Format : Afficher ParamÚtre puis faire la mapping avec les champs ajouter précédemment
#
Configurer les liensIl s'agit d'une vue.
Pour créer le lien vers les nodes, utiliser l'id de chaque node et faire une réécriture de ces ids avec /node/{{nid}}
dedans.
Ils seront réécris avec la bonne url
#
Exporter une vue en csvPermettre l'export du catalogue: utiliser les plugins csv_serialization et views_data_export.
- Aller dans la vue et créer une vue exportation des données. Bien lister l'ensemble des infos et vérifier que dans format/paramÚtres, la case "csv" est bien cochée. Vérifier que la vue fonctionne puis mettre le chemin souhaité (ex. /admin/export/catalogue fichier: catalogue.csv). Aller dans Admin/Structure/menus/administration/ajouter un lien et mettre le lien vers cet export avec : /admin/export/catalogue?_format=csv
- Dans CSV settings cocher la case "Include unicode signature (BOM)"
#
Filtrer par annéeATTENTION : pour filtrer par année : il faut un patch a views : https://www.drupal.org/files/issues/2786577-270_0.patch
#
SearchPour pouvoir rechercher des views, on a utilisé un trick (Drupal ne sait pas faire de l'index SolR sur les vues...):
- On crée un type de contenu bloc (search-views) avec un titre et un lien et un body
- Pour chaque lien vers une page de views qu'on veut trouver, on crée un bloc de ce type
- On va ajouter ce bloc dans le search index Drupal en mettant un poids fort au titre du bloc (pour qu'il ressorte en premier)
- Dans la vue de recherche on n'oublie pas d'ajouter les champs de ces blocs en résultat.
#
Ne pas afficher le node actif dans une vueSi vous avez une vue intégrée dans un node (par exemple "autres articles" affichés sous un article) et que vous ne voulez pas que le node actif ne s'affiche dans la vue:
- Aller dans la vue, filtre contextuel
- Ajouter l'ID et remplir "fournir une valeur par défaut" "Quand la valeur de filtre n'est pas dispo" avec l'IDdu contenu à partir de l'URL
- Tout en bas, dans "MORE", cocher exclure, pour exclure cette valeur d'ID.
<form>
#
form exposed : Ajouter un style ou une classe au tag Le twig exposed ne contient pas le tag form. Il faut passer par un module pour modifier ce tag. Par exemple:
Sur le formulaire de la vue lovers, on va ajouter style="display:flex; align-self: flex-end"
sur le tag form.
Pour ajouter une classe : $variables['exposed']['#attributes']['class'][] = 'myClass';
#
form exposed : Séparer le champ sort_by des champs de filtrage :Il suffit d'afficher d'abord le form SANS le field en question, puis afficher séparément le field voulu. Valable pour d'autres objets Drupal.
#
form exposed : Skinner les champs de filtre et de triune premiĂšre solution est d'utiliser le module BEF (Better Exposed Filter), mais cela peut-ĂȘtre compliquĂ© d'arriver au rĂ©sultat souhaitĂ©.
Une autre solution : Le faire soi-mĂȘme. Voici comment crĂ©er un filtrage + tri en ajax sur une vue.
- Cocher "ajax" dans la vue, configurer les filtres et les tris exposés à l'utilisateur (si on ne veut pas rendre l'ordre de tri sléecitonnable par défaut, il faut aller le décocher dans Advanced/exposed form/Exposed form style/settings)
- sur le front, utiliser les suggestions pour spécialiser le html de l'exposed et des champs.
Pour remplacer un select par des ul/li par exemple, il suffit de cacher le select, de cacher le bouton de soumission du formulaire, et d'ajouter du js pour qu'au clic sur un li, on mette à jour la valeur du select puis on clique sur le bouton de soumission. Exemple pour un "trier par" on créer un twig
select--sort-by.html.twig
:
La premiĂšre partie est du copier/coller du select d'origine avec .addClass('js-select-sortby').setAttribute('style', 'display:none')
qui permet de lui attacher une classe qui nous servira Ă le trouver facilement, et un atrribut display:none pour le cacher.
La seconde partie est le html souhaité. Le js, enfin permet de détecter quand on clique sur le li de :
- retrouver le select et lui mettre la valeur sélectionnée
- cliquer sur le bouton "soumettre" qui va faire l'appel ajax.
Le test if(!window.jQuery)
permet de savoir si on load ce twig avec la page (au premier chargement), ou si ce twig est retourné lors des appels ajax suivants. C'est aussi simple que ça ! En conservant le select d'origine de Drupal, on bénéficie de toutes ses fonctionnalités associées (appel d'ajax).
Une autre solution pour le js serait de le déplacer dans un drupal-ajax.js.
#
Dans une view, dans l'exposed filter, n'afficher que les termes de taxonomie qui ont au moins un node associédans le fichier montheme.theme, créer 2 fonctions:
- getNodesByTaxonomyTermIds va ramener le tableau de termIds qui ont au moins un node associé
- Pour ne pas afficher les enfants de la taxonomie, il suffit dans les critÚres de filtrage de sélectionner uniquement les valeurs à afficher puis à cocher "limiter la liste aux éléments sélectionnés".
#
Appeler un template de node dans une vue en fonction de sa position dans la vue- dans "montheme.theme":
- le code dans le twig "views-view--unformatted":
- créer un twig personnalisé "node--view--hub-articles--full-1.html.twig".
#
Passer l'index du node dans la vue au nodepour un twig node--evenement--default:
(si le twig s'appellait node--view--home-evenements.html.twig, on aurait comme nom de fonction montheme_preprocess_nodeviewhome_evenements(&$vars))
#
Pour interpréter le HTML d'un champ- dans le cas d'une vue qui expose des champs, il faut faire :
- et créer le views-view-field--field-NOMDUCHAMP.html.twig avec {{ output|raw}}
#
Corriger l'erreur d'affichage des enfants dans une view :#
Afficher le nom d'une valeur de taxonomie depuis un row in rows{{ row.content['#node'].field_categorie_document.0.entity.name.value }}
#
Trier un résultat en fonction de la date de modification#
Si voulez en faire un filtre en front classé pas date la plus récente- Critere de tri
- Ajouter un critĂšre de tri de type
Contenu : Modifié
-Content: Changed
- Cocher
exposer ce tri aux visiteurs
- Etiquette/label
plus récent/newer fisrt
- Choisissez
Trier par ordre décroissant
- Granularité
minute
Appliquer
#
Si voulez en faire un filtre en front classé pas date la plus anciennne- Critere de tri
- Ajouter un critĂšre de tri de type
Contenu : Modifié
-Content: Changed
- Cocher
exposer ce tri aux visiteurs
- Etiquette/label
plus ancienne/older fisrt
- Choisissez
Trier par ordre croissant
- Granularité
minute
Appliquer
#
Changer la portée de la recherche dans un champ de type Entity referencePar défaut la recherche dans un champ de type "Entity reference" se fait sur le titre du contenu. Pour pouvoir chercher sur un autre champs du node :
- Créer une vue qui porte sur le contenu concerné,
- Cliquer sur Ajouter et choisir Entity reference
- Dans FORMAT :
- Format : Liste Entity Reference | Dans ParamĂštres choisir les champs sur lesquels va porter la recherche (ex: identifiant, titre)
- Afficher : Champs Entity Reference en ligne | Dans ParamÚtres choisir si nécessaire les champs qui seront affichés dans le champ de recherche
- Maintenant il fait appliquer cette vue sur un champ de type entity reference
- Ajouter un champ de type entity reference sur le type de contenu concerné
- Dans Reference type :
- REFERENCE METHOD choisir Filter by an entity reference view
- VIEW USED TO SELECT THE ENTITIES sélectionner la vue préalablement créée
#
Liste des urls des nodes- Créer une vue format Table
- Dans champs choisir "Lien vers Content" et cocher "Rendre l'URL en tant que texte"
#
Choisir la profondeur d'affichage d'une taxonomie dans une vue- Dans AVANCĂ / FILTRES CONTEXTUELS
- Ajouter le filtre "PossĂšde l'identifiant de terme de taxonomie (avec profondeur)"
- Puis choisir le niveau de profondeur souhaitĂ© (O = le niveau lui-mĂȘme, 1 = lui-mĂȘme et ses enfants, 2 = lui-mĂȘme, ses enfants et ses petits enfants, ...)
- Pour Ă©viter les doublons, dans ParamĂštres de la requĂȘte, cocher Distinct
#
Permettre d'ordonner à la main les éléments d'une vue(https://kgaut.net/blog/2016/module-drupal-8-weight-pour-trier-les-contenus.html)
- Installer le module weight : https://www.drupal.org/project/weight
- Ajouter un champ de ce type au type de contenu qu'on utilisera dans la vue (ici nous avons appelé ce champ
position
) - Dans la vue, Dans les champs, sélectionner :
Content: Position Selector (Position Selector (field_position))
- Dans sort criteria sélectionner :
Content: Position (asc)
- Dans Page Settings choisir une URL pour y accéder depuis le menu d'admin (
Path:/admin/champagne-sorting
) par exemple et ou cette vue apparait dans le menu (par exempleMenu:Normal: Champagne sortin...
) et la limiter au rĂŽle d'admin (Access:Role | Administrateur
)
Le tour est joué ! Cette manip permet de proposer du glisser/déposer sur la vue dans l'admin, ce qui va modifier le poids des nodes et les ordonner en fonction de ces poids.
#
N'afficher sur le vue que les contenus de l'utilisateur connecté- Dans Advanced, ajouter une relation (RELATIONSHIPS) et choisir
User
- Dans Filter criteria, ajouter le critĂšre User :
- Operator = Is equal to, Is the logged in user = Yes
#
Customiser une vue d'adnim avec son propre css- Créer un module (e.g.customization.module)et une nouvelle fonction pour attacher une library au thÚme d'admin utilisé
- Créer le fichier libraries (e.g. customization.libraries.yml) et y référencer le fichier css custom
- Créer le fichier css à l'endroit indiquer dans la librairie dans le module
- Personnaliser les classes