Planète

Par Christophe MOLLET
Christophe Mollet

Comment choisir son CMS pour un projet web ?

Lorsque l'on souhaite réaliser un projet web, il n'est pas toujours facile de choisir le CMS le plus adapté à votre besoin. Pour vous aider à y voir plus clair pour votre projet, notre agence web vous explique les technologies web en détails.

Bien que nos gènes viennent et resterons dans le web, la barrière entre les applications mobiles et les sites web est de plus en plus flou. Technologie front, back, CMS, application native, hybride, PWA, on est vite perdu lorsque nous devons choisir une technologie ou la raison pour laquelle nous choisissons cette technologie.

Par kgaut
Kevin Gautreau

Vidéo mini formation : Installer drupal 9 avec composer

J'ai mis en ligne tard vendredi soir ma première vidéo de mini-formation à drupal.

J'ai commencé par un sujet basique : Le téléchargement et l'installation du CMS Drupal avec composer.

La vidéo est disponible gratuitement sur youtube et dure 20 minutes.

Je ne m'étais jamais confronté avant au format vidéo, et même si j'ai déjà donné des conférence et animé des formations, le format est évidement complètement différent.

Le résultat n'est pas parfait, mais j'en suis assez content. N'hésitez-pas à me faire vos retours sur le fond comme sur la forme.

Si vous souhaitez me suggérer un sujet pour une prochaine vidéo, vous pouvez le faire à la page suivante : https://kgaut.net/suggestion-sujet-video-formation.

Pour info, je suis déjà en train de préparer le conducteur de la prochaine qui présentera la gestion de la configuration et le module config split dans Drupal.

On m'a posé la question du temps passé et de mon organisation, voici en détail les étapes.

J'ai commencé évidement à définir le conducteur et les différents liens à afficher en me servent de notion.so, environ 2h de préparation.

Image

Conducteur drupal 9 avec composer - notion

 

J'ai ensuite fait l'enregistrement avec le logiel OBS, très bon soft, super facile à prendre en main. Il permet de mixer les "scènes" (captation d'un écran, d'une webcam, image fixe) et les sources de son (micro, pc...). La captation m'a pris environ 1h30. J'avais divisé la captation en séquences, une pour chaque chapitre, me permettant de reprendre mon souffle et de boire un peu d'eau entre chaque. Pour chaque séquence, il m'a souvent fallu plus de 5 prises pour en avoir enfin une correcte.

Enfin le montage a été fait avec le logiciel Kdenlive. Ici aussi très facile à prendre en main. Cette phase à consisté à enchaîner les séquences filmées et en faisant des "cuts", quand c'était nécessaire (bafouille, répétition...) Pour cette partie en comptant le visionnage final : 2H00, sans compter le temps de rendu, environ 30 minutes.

Soit un total d'environ 6H pour 20 minutes utiles de vidéo.

Par kgaut
Kevin Gautreau

Drupal 8 & Drupal 9 - Ajouter un champ Media dans un formulaire et l'afficher dans un template

Voici comment ajouter un champ de type « référence à un media » dans un formulaire personnalisé en utilisant le widget Media Library :

    $form['video'] = [      '#type' => 'media_library',      '#allowed_bundles' => ['video', 'remote_video'],      '#title' => t('Video'),      '#default_value' => $config->get('video') ?? NULL,    ];

la clé #allowed_bundles contient la liste des types de media que l'on veut autoriser

Voici ensuite comment le rendre dans un template via un controller :

Dans le controller :

if($config['video'] && $media = Media::load($config['video'])) {    $config['video'] = $this->entityTypeManager->getViewBuilder('media')->view($media, 'default');}     return [   '#theme' => 'mon_template',   '#data' => $config,];

et dans le template twig, un simple :

{{ data.video }}

 

Par kgaut
Kevin Gautreau

Drupal 8 & 9 - Menu - définir comme parent un élément de menu créé via l'UI

Dans le fichier mon_module.links.menu.yml, on peut facilement placer un élément de menu dans une arborescence via la clé parent.

mon_module.admin_mon_module_config_form:  title: 'Configuration Mon Module'  route_name: mon_module.admin_resalys_config_form  description: 'Configuration webservice de mon module'  parent: system.admin_config_services  weight: 10

Ici le parent fait référence à la clé d'un autre élément de menu.

Mais parfois le parent voulu a été créé via l'interface, et donc le parent doit être référencé via son UUID :

mon_module.admin.structure.settings:  title: 'Partner settings'  description: 'Configure Partner entities'  route_name: partner.settings  parent: 'menu_link_content:4bbda5ed-eeee-4eab-be01-e3d7349f4daa'

L'UUID est trouvable dans la base de données, ou bien en passant par l'onglet devel de l'élément de menu « parent » voulu :

Image

Drupal menu item uuid

Par kgaut
Kevin Gautreau

Drupal 8 & Drupal 9 - Utiliser des vues différentes selon les taxonomies

À partir de drupal 8, c'est une vue qui gère la page des contenus d'un terme de taxonomie.

Le soucis est que c'est la même vue pour l'ensemble des vocabulaires.

Pour le site courant je voulais une page différente pour les catégories de module (exemple avec la catégorie backoffice) de la page par défaut (exemple avec le tag drupal).

Pour cela il faut surcharger le contrôleur gérant les vues, et n'ayez pas peur c'est moins compliqué à faire qu'à dire.

Déclaration du service

Le service va altérer la route /taxonomy/term/% pour changer le contrôleur qui sera executé

modules/custom/mon_module/mon_module.services.yaml

services:  mon_module.route_subscriber:    class: Drupal\mon_module\Routing\TaxonomyListingViewsRoutingSubscriber    tags:      - { name: event_subscriber }

Définition du service

modules/custom/mon_module/src/Routing/TaxonomyListingViewsRoutingSubscriber.php

get('entity.taxonomy_term.canonical')) {      $route->setDefault('_controller', '\Drupal\mon_module\Controller\TaxonomyTermViewPageController::handle');    }  }   public static function getSubscribedEvents() {    $events = parent::getSubscribedEvents();    $events[RoutingEvents::ALTER] = array('onAlterRoutes', -180);    return $events;  } }

Surcharge du contrôleur

modules/custom/mon_module/src/Controller/TaxonomyTermViewPageController.php

getParameter('taxonomy_term');     $vid = $term->get('vid')->first()->getValue();    $vid = $vid['target_id'];     //on teste le vocabulaire    if ($vid === 'modules_categories') {      $view_id = 'front_modules';      $display_id = 'page_categories';    }     return parent::handle($view_id, $display_id, $route_match);  } }

 

Par kgaut
Kevin Gautreau

Drupal - Améliorer l'expérience d'administration

Note : Quand on débute avec drupal, le plus dur est de connaître l'ensemble de l'écosystème. Entre-autres, l'ensemble des modules tiers (contrib) qui existent. J'inaugure une nouvelle section sur ce site avec la présentation (rapide) de différents modules que je conseille. Cela se passe sur la page Modules Drupal. Je vais tenter aussi de temps en temps de mettre en avant des modules par thématique. c'est le cas ici.

Le backoffice de drupal est réputé pour être austère, même si cela s'est amélioré depuis les dernières version, ça n'est pas complètement faux !

Mais via quelques modules et thème il est possible d'améliorer grandement cette expérience.

Vous trouverez ci-dessous quelques modules que je conseille dans cet objectifs. N'hésitez-pas à ajouter les votre.

Adminimal

 Backoffice
 Thème

Le thème d'administration que j'utilise sur la plupart de mes sites. En en faisant un thème enfant évidement.

Lire la suite de Adminimal

 

Admin Toolbar

 Backoffice
 Indispensable

Admin Toolbar transforme la barre d'administration native de drupal (module toolbar) en menu déroulant. Oui ce module est indispensable.

À noter, ce module contient différents sous-modules :

Lire la suite de Admin Toolbar

 

Coffee

 Backoffice
 Indispensable

Le module Coffee permet aux administrateur de déclencher via un raccourci clavier (alt+k ou alt+d) un petit moteur de recherche qui indexe tous les éléments du menu d'administration.

Ainsi, plus besoin de chercher pendant des heures où est cachée la page de configuration de cet obscure module.

Lire la suite de Coffee

 

Field Group

 Backoffice

Permet de regrouper des champs dans des onglets sur les écrans de création de contenu.

Il est ainsi possible d'avoir des formulaires mieux « rangés »

Lire la suite de Field Group

 

Module filter

 Backoffice

Quand on commence à avoir une liste de module importante, la page par défaut n'est pas très utilisable.

Ce module permet de regrouper les modules par package dans des onglets et ajoute un champ de recherche javascript.

Lire la suite de Module filter

 

Environment Indicator

 Backoffice

Ce module tout simple permet de modifier la couleur de la barre d'administration en fonction d'un environnement (prod / preprod / staging / dev...)

La sélection de l’environnement courant peut se faire de plusieurs façon, le plus simple à mon sens est via le fichier settings.local.php :

Lire la suite de Environment Indicator

 

Node Edit Protection

 Backoffice
 Rédaction contenu
 Indispensable

Il vous est déjà arrivé de travailler sur un contenu pendant un certain temps sur votre site, et de quitter la fenêtre par erreur ou bien de faire précédent, et ainsi de perdre tout ce que vous aviez fait ? Moi oui...

Ce module ajoute une demande de confirmation javascript dans ces cas là ❤️

Lire la suite de Node Edit Protection

Par Q__nt_n
Quentin Fonteneau

Présentation du module drupal Config Pages

Présentation du module drupal Config Pages
Q__nt_n
ven 11/09/2020 - 13:20

Dans mes précédents sites Drupal, il m'arrivait de développer un formulaire de configuration pour le site (réseaux sociaux, paramètres métier etc...), cela pouvait s'avérer complexe et chronophage dès que le client voulait une personnalisation de ce formulaire. Pour information pour cette solution orientée "développement", vous pouvez retrouver la documentation ici

Cependant, dernièrement, Raphaël Morvan m'a parlé de Config Pages. Ce module fournit une entité qui permet de créer des pages de configuration personnalisables et riches en fonctionnalités et de les placer où l'on souhaite dans le système de menu. On peut également utiliser les widgets de Drag & Drop, Autocomplétion etc... Le gain de temps peut donc devenir très important face à une page de configuration développée de A à Z.

Désormais, j'utilise ce module afin de m'éviter également la création d'un type de contenu 'Homepage'. En effet, généralement, ce type de contenu est instancié une seule et unique fois (Et désormais ça me parait être une aberration de le faire). Chose à noter, les pages de configuration créées grâce à ce module prennent en compte le contexte de langue. 

Voici le formulaire de création d'un type de page de config :

Capture d'écran du formulaire de création d'un type de page de config

Ensuite, la page de config étant une entité, nous pouvons gérer les champs comme dans un type de contenu !

Capture d'écran du formulaire crée

Thématique

Par Q__nt_n
Quentin Fonteneau

Création d'un environnement de développement Drupal (Partie 1)

Création d'un environnement de développement Drupal (Partie 1)
Q__nt_n
jeu 27/08/2020 - 09:34

Création d'un environnement de développement Drupal

Cela fait un certain temps que je souhaitais écrire un article sur la mise en place d'un environnement de développement pour Drupal. Afin de rester le plus clair possible je vais décomposer le sujet en plusieurs parties :

  1. La mise en place d'un environnement de développement via Lando
  2. La création d'un socle Drupal (à venir)
  3. L'utilisation du socle, workflow et bonnes pratiques (à venir)

Mise en place d'un environnement de développement via Lando

Fût un temps, les environnements de développement se résumait à l'installation d'un WAMP / LAMP / MAMP avec les bonnes versions des différents technos (PHP, node etc... ) et c'était tout de même assez fastidieux car il fallait que cette installation et cette configuration soient réalisés sur chacun des postes des développeurs.

Depuis quelques temps maintenant, un petit nouveau est apparu : Docker. Ce dernier permet, entre autres, d'échapper à cette gestion des dépendances et autres extensions... Mais ceci dit, il faut tout de même le faire dans le Dockerfile.

Lors de mon précédent travail, chez Capgemini, nous avions mis en place un environnement de développement à l'aide de Docker. Cependant, je trouvais qu'on avait atteint une certaine limite car je trouve que Docker n'est pas forcément accessible et compréhensible au premier abord. Par ailleurs, j'avais testé le couple traefik et portainer pour gérer plus facilement mes containers / sites mais j'ai rapidement arrêter car c'était assez complexe et trop coûteux en temps.

En arrivant dans mon nouveau travail chez Digital Garden, j'ai pu avoir le temps nécessaire de mettre en place un environnement de développement. Pour cela je me suis basé sur Lando, que j'avais découvert à Capgemini (Merci Nasser ! ;) ). Je l'avais survolé et malheureusement passé à côté du but précis de Lando. 

Lando est une surcouche de Docker permettant de mettre en place, sans effort, un environnement, d'automatiser certaines tâches (les tests par exemple).

La documentation est plutôt bien faite ! Des "recettes" (Drupal 8, Wordpress etc...) sont déjà disponibles permettant d'être encore plus rapide pour installer un environnement. 
Par exemple, la recette Drupal met à disposition Nginx / Apache, MySQL / MariaDB, Composer, Drush... 

La configuration de Lando se résume à la création d'un fichier .lando.yml à la racine du projet.
 

name: socle-drupal

recipe: drupal8

config:
  php: '7.4'
  via: apache
  webroot: web
  xdebug: true

services:
  appserver:
    php: '7.4'
    config:
      php: .lando/config/php.ini
  database:
    type: mariadb:10.1
  phpmyadmin:
    type: phpmyadmin
    hosts:
      - database
  mailhog:
    type: mailhog
    hogfrom:
    - appserver
  node:
    type: node
    globals:
      gulp-cli: "latest"

tooling:
  vim:
    service: appserver
  npm:
    service: node
  node:
    service: node
  gulp:
    service: node
    description: "Compiles SASS"
    cmd: gulp

Décomposons ce fichier .lando.yml !

  • name: socle-drupal correspond au nom du projet. Par défaut, ce nom sera utilisé pour construire l'URL par défaut du site (socle-drupal.lndo.site).
  • recipe: drupal8 est la recette utilisée, nous ne sommes pas obligés d'en utiliser. Des recettes sont disponibles pour Wordpress, Drupal 6, 7, 8, Laravel, Python, Ruby... 

S'en suit différents "blocs" :

  • config permet de modifier la configuration et d'avoir quelque chose qui répond vraiment à nos besoins : version du PHP, activation de xdebug, apache/nginx
  • services permet l'ajout de services prédéfinis par Lando, d'y gérer une config particulière de l'application (par l'ajout d'un php.ini custom par exemple).
    Je recommande fortement d'ajouter le service `phpmyadmin` et de le brancher sur la base de données, cela évitera de devoir gérer les ports de la base de données (qui, s'ils ne sont pas fixés, seront aléatoires à chaque démarrage du projet.
  • La partie tooling permet d'ajouter des commandes à l'outil lando. Dans notre cas, nous pourrons, par exemple, exécuter la commande lando npm install. Npm étant branché sur le service node, Lando exécutera la commande dans le container node. Nous verrons dans la dernière partie de cette série d'article, l'ajout d'outil très utile pour suivre la qualité du code et le suivi des bonnes pratiques Drupal.

La création de la base de notre environnement de développement est désormais terminée. Nous verrons dans un prochain article, la création du socle Drupal afin d'avoir un environnement de développement Drupal complet !

Thématique

Par kgaut
Kevin Gautreau

Drupal 8 et Drupal 9 - Créer une archive Zip

Voici comment créer une archive zip et y ajouter des fichiers.

Pour commencer, nous aurons besoin d'injecter deux services, (ici je suis dans un formulaire, à adapter en fonction du contexte)

  public static function create(ContainerInterface $container) {    $instance = parent::create($container);    $instance->fileSystem = $container->get('file_system');    $instance->archiver = $container->get('plugin.manager.archiver');    return $instance;  }

Création de l'archive en tant que telle :

// $files contient un tableau de chemin de fichiers à ajouter à l'archive$files = ['private://monfichier1.pdf', 'private://monfichier2.pdf']; // Chemin où sera enregistré l'archive$archivePath = 'private://pdf-export/mon-archive.zip'; // On crée l'archive physiquement sur le disque, avec un contenu vide// FileSystemInterface::EXISTS_REPLACE indique que si le fichier existe déjà on le remplace, il existe d'autres options$this->fileSystem->saveData('', $archivePath, FileSystemInterface::EXISTS_REPLACE); //On récupère l'objet Zip pointant vers l'archive que nous venons de créer./** @var Zip $zip */$zip = $this->archiver->getInstance(['filepath' => $archivePath]); foreach ($files as $file)  {  $filepath = $this->fileSystem->realpath($file);  $zip->add($filepath, $filename);}

Et voila, cela fonctionne mais ça n'est pas forcément top... Pourquoi pas forcément top ? car toute l’arborescence des différents fichiers est recrée dans l'archive :

Image

Archive Zip

 Ça n'est pas forcement très gênant, mais dans mon cas je préférais avoir tous les fichiers à la racine de mon archive. Voila comment faire :

// $files contient un tableau de chemin de fichiers à ajouter à l'archive$files = ['private://monfichier1.pdf', 'private://monfichier2.pdf']; // Chemin où sera enregistré l'archive$archivePath = 'private://pdf-export/mon-archive.zip'; // On crée l'archive physiquement sur le disque, avec un contenu vide// FileSystemInterface::EXISTS_REPLACE indique que si le fichier existe déjà on le remplace, il existe d'autres options$this->fileSystem->saveData('', $archivePath, FileSystemInterface::EXISTS_REPLACE); //On récupère l'objet Zip pointant vers l'archive que nous venons de créer./** @var Zip $zip */$zip = $this->archiver->getInstance(['filepath' => $archivePath]); // $zip est juste un wrapper Drupal vers un objet \ZipArchive que l'on va récuprérer ici dans $zipArchive$zipArchive = $zip->getArchive(); foreach ($files as $file)  {  // on récupère le nom de fichier, sans le chemin  $filename = basename($file);  $filepath = $this->fileSystem->realpath($file);   // on ajoute le fichier à l'archive mais en indiquant comme chemin uniquement le nom du fichier, ainsi, plus de création de dossier  $zipArchive->addFile($filepath, $filename);}

 

Par kgaut
Kevin Gautreau

Drupal 8 et Drupal 9 - EntityQuery - faire une condition sur un champ d'une entité liée

Petite découverte datant d'il y a quelques mois, il est possible via une EntityQuery d'ajouter une condition sur un champ d'une entité liée.

Petit exemple :

J'ai un type d'entité game (match), lié à un type d'entité day (journée), lui même lié à un type d'entité league (compétition)

(Match : OM - ASSE, journée : Journée 1, Compétition : Ligue 1 2020-2021)

Image

MPD MesPronos

 

Si je souhaite récupérer tous les matchs d'une compétition donnée (mettons la 12,) je peux me baser sur l'attribut days.league : 

$query = \Drupal::entityQuery('game');$query->condition('day.entity:day.league', 12);$ids = $query->execute();

 

Mais on peut aussi aller plus loin et remonter encore d'un niveau pour faire une condition sur un attribut de la compétition de la journée des matchs. Pour ainsi récupérer l'ensemble des matchs des compétitions active (attribut leagues.status) :

$query = \Drupal::entityQuery('game');$query->condition('day.entity:day.league.entity:league.status', 'active');$ids = $query->execute();

Source : https://www.drupaleasy.com/quicktips/drupal-8-entity-query-across-throu…, partagé sur le slack de l'association Drupal France

Par kgaut
Kevin Gautreau

Les forks et merge-requests arrivent (enfin) sur drupal.org !

Depuis la migration des dépôts du code de Drupal ainsi que de l'ensemble des modules tiers sur Gitlab, nous sommes nombreux à attendre que l'ensemble des possibilités offertes par ce changement soient accessibles.

Une d'entre elle qui simplifiera grandement la proposition de modification de code par les néophytes est la possibilité de faire des « merge requests », à l'image de ce qui se fait sur une instance gitlab ou bien des pull-requests sur github.com.

Actuellement pour proposer une modification sur le core de Drupal ou l'un de ses modules tiers, il faut cloner le dépôt sur sa machine, faire les modifications, générer un patch et enfin proposer le patch. Procédure qui n'est pas inaccessible, mais qui n'est pas simple pour les nouveaux venus. Surtout quand on veut corriger juste un petit truc.

Le nouveau fonctionnement sera beaucoup plus simple. Il faudra commencer par créer un issue sur le projet que l'on souhaite amender :

Image

Drupal create issue

 

Note : retrouvez le ticket ici : https://www.drupal.org/project/apidae_tourisme/issues/3160451

Une fois cette issue créé, l'issue tracker de drupal proposera de créer un fork (copie) du dépôt. Fork qui sera dédié uniquement au traitement de ce ticket. Si deux personnes veulent proposer deux approches pour un même problème, alors deux forks peuvent être créés.

Image

Drupal issue fork

 

L'adresse du fork en question : https://git.drupalcode.org/issue/apidae_tourisme-3160451

Une fois créé, le fork sera clonable et/ou éditable en ligne directement via le web IDE de Gitlab :

Image

Gitlab web ide

 

Au commit, l'IDE nous proposera de directement créer une merge request, fonctionnalité qui est aussi possible depuis l'interface de Gitlab si l'on fait nos modifications en local et pas dans le web IDE.

Image

gitlab drupal merge request

 

Voici l'écran de création d'une merge request :

Image

Drupal merge request creation

 

Une fois créée, la MR est visible dans le ticket :

Image

Drupal issue merge request

 

Image

Drupal issue merge request 2

 

Ensuite l'écran d'une merge request permet de voir les modifications, de faire des commentaires, et d'accepter ou non la modification (voir en ligne : https://git.drupalcode.org/project/apidae_tourisme/-/merge_requests/1)

Image

Drupal merge request changes

 

Image

Drupal merge request screen

 

Ainsi on peut se passer complètement de la procédure de patch, même pour des grosses modifications ! Je trouve personnellement la procédure plus simple mais surtout plus accessible pour un·e néophyte.

Actuellement la fonctionnalité est encore en beta, il faut demander l'activation pour un ou plusieurs de ses projets personnels sur ce ticket : https://www.drupal.org/project/drupalorg/issues/3152637.

Si vous voulez jouer un peu et tester la procédure, n'hésitez pas à le faire sur le dépôt pour lequel j'ai activé la fonctionnalité, je ferai le ménage plus tard : https://www.drupal.org/project/apidae_tourisme/issues/3160451 (vous prouvez créer de nouveaux tickets si besoin en mettant « test » dans le titre.

Par kgaut
Kevin Gautreau

Drupal 8 et Drupal 9 - Créer une commande drush personnalisée

Voici un exemple rapide de commande drush appelant une méthode d'un service avec une option lors de l'appel.

À noter : Drupal\mon_module\Service\Resalys est un service existant, je souhaite utiliser la méthode syncResalys de ce service qui accepte un paramètre optionnel : $force

Déclaration de la commande

modules/mon_module/drush.services.yml

services:  mon_module.drush.resalys: # clé du fichier de commande, à définir vous même    class: Drupal\mon_module\Command\ResalysCommand # Namespace de la classe contenant la commande    arguments:      - '@mon_module.resalys' # Service à injecter dans notre commande    tags:      -  { name: drush.command }

Définition de la commande

modules/mon_module/src/Command/ResalysCommand.php

resalys = $resalys;  }   /**   * Sync resalys cache   *   * @command resalys:sync   * @usage drush resalys:sync   * @usage drush resalys:sync --force   *   * @param int[] $options   */  public function sync($options = ['force' => FALSE]) {    $force = (bool) $options['force'];    $this->resalys->syncResalys($force);  } }

Utilisation

drush resalys:syncdrush resalys:sync --force

 

Par Q__nt_n
Quentin Fonteneau

Obtenir un objet URL à partir de l'alias

Obtenir un objet URL à partir de l'alias
Q__nt_n
jeu 25/06/2020 - 11:10

Dans le cadre d'un import où je devais remplir des données pour plusieurs types de contenu (node, taxo etc..), j'ai du me baser sur la seule entrée que j'avais : l'URL de la page.

// Morcellement de l'URL  
$url_parts = explode("/", parse_url($item['new'], PHP_URL_PATH));
// Suppression du langcode
unset($url_parts[1]);
// Reconstruction de l'alias sans le langcode
$alias = implode('/', $url_parts);


$url_object = \Drupal::service('path.validator')->getUrlIfValid($alias);
$route_name = $url_object->getRouteName();
$route_parameters = $url_object->getrouteParameters();

Suite à la récupération de l'objet 'URL', j'ai pu distinguer mes différents cas et faire les traitements adéquats.

Thématique

Par kgaut
Kevin Gautreau

Drupal 8 et Drupal 9 - Attacher une librairie CSS ou JS à une vue

Voici comment inclure des fichiers CSS ou JS sur une page contenant une vue.

Pour rappel les librairies peuvent être définies dans un thème ou un module.

Utilisation du hook HOOK_views_pre_render.

Dans le .module de votre module :

function MON_MODULE_views_pre_render(\Drupal\views\ViewExecutable $view) {  if ($view->storage->id() === 'front_blog') {    $view->element['#attached']['library'][] = 'theme/swiper-library';    $view->element['#attached']['library'][] = 'theme/univers-js';  }}

 

Par Q__nt_n
Quentin Fonteneau

Obtenir un objet URL à partir de l'alias

Obtenir un objet URL à partir de l'alias
Q__nt_n
lun 22/06/2020 - 10:33

Dans le cadre d'un import où je devais remplir des données pour plusieurs types de contenu (node, taxo etc..), j'ai du me baser sur la seule entrée que j'avais : l'URL de la page.

// Morcellement de l'URL  
$url_parts = explode("/", parse_url($item['new'], PHP_URL_PATH));
// Suppression du langcode
unset($url_parts[1]);
// Reconstruction de l'alias sans le langcode
$alias = implode('/', $url_parts);


$url_object = \Drupal::service('path.validator')->getUrlIfValid($alias);
$route_name = $url_object->getRouteName();
$route_parameters = $url_object->getrouteParameters();

Suite à la récupération de l'objet 'URL', j'ai pu distinguer mes différents cas et faire les traitements adéquats.

Par kgaut
Kevin Gautreau

Drupal 8 & Drupal 9 - Entity Query - Ajouter une condition sur une colonne spécifique

Dans le cadre d'une EntityQuery, il peut être nécessaire parfois de faire une requête sur une colonne spécifique de notre table, autre que le traditionnel « value ».

Rien de bien compliqué, il faut alors le spécifier dans le nom du champ sur lequel on ajoute une condition.

Exemple normal :

// Condition sur la colonne « value » du champ « field type »$query->condition('field_type', 'FETE_ET_MANIFESTATION');

Pour spécifier la colonne, on concatène le nom de la colonne avec le nom du champ avec un point :

// Condition sur la colonne « dateDebut » du champ « field_apidae_dates »$query->condition('field_apidae_dates.dateDebut', $now->format('Y-m-d'), '>');

 

Pages