Planète

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
Adhérent
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
Adhérent
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 Q__nt_n
Adhérent
Quentin Fonteneau

Générer un hashsalt avec Drush

Générer un hashsalt avec Drush
Q__nt_n
mar 25/08/2020 - 11:13

drush eval "var_dump(Drupal\Component\Utility\Crypt::randomBytesBase64(55))"

Thématique

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
Adhérent
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
Adhérent
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'), '>');

 

Par kgaut
Kevin Gautreau

Accélérer l'administration de son site drupal avec Makefile

Un Makefile est un fichier contenant des rules, (des fonctions) permettant d’exécuter une suite d'action. Beaucoup utilisé dans les langages compilés pour permettre de gérer la compilation d'un programme, c'est aussi utilisable dans le cadre d'un projet php.

J'ai découvert les Makefile après avoir commencé à utiliser docker pour mes projets web.

Quand on utilise docker pour le php les binaires php (drush, composer, drupal-console...) sont à exécuter dans le container php et non pas sur notre machine hôte.

Ce qui donne des commandes ressemblant à :

docker-compose exec php drush crdocker-compose exec php composer install

au lieu de simples

drush crcomposer install

ça n'est pas la mort, mais un développeur est feignant.

L'ensemble d'images docker docker4drupal propose un Makefile avec des rules permettant d’exécuter drush ou composer plus simplement :

make drush crmake composer install

C'est très pratique, mais on peut aller encore plus loin et écrire nos propres rules en les ajoutant à la suite du fichier. Voici par exemple une rules pour supprimer la base de données et la recréer :

## db-empty	: drop and recreate database.PHONY: db-emptydb-empty:	@docker-compose exec -T $(DB_HOST) mysql -u"$(DB_USER)" -p"$(DB_PASSWORD)" -e "DROP DATABASE IF EXISTS $(DB_NAME)"	@echo Database $(DB_NAME) dropped	@docker-compose exec -T $(DB_HOST) mysql -u"$(DB_USER)" -p"$(DB_PASSWORD)" -e "CREATE DATABASE $(DB_NAME)"

Un autre exemple pour afficher en continu le contenu du fichier drupal_debug.txt (voir : Drupal - Découvrez la fonction ddm, pour débuguer même en aveugle) :

## dd-tail	: show the tail of drupal-debug.txt file.PHONY: dd-taildd-tail:	tail -f $(LOCAL_TMP_PATH)/drupal_debug.txt

Vous voyez ici l'utilisation de variables, comme $(DB_HOST) qui sont définies dans le fichier .env :

Image

.env variables

À force d'ajouter des rules au fur et a mesure, j'ai finis par en avoir pas mal. J'ai fais un petit boulot de généralisation et tout est maintenant sur un dépôt github : https://github.com/kgaut/drupal-makefile.

L'installation est relativement rapide est simple :

Ajoutez le package à vos dépendances

composer require kgaut/drupal-makefile

Modifiez votre fichier .env et ajoutez les variables nécessaires présentées ici : https://github.com/kgaut/drupal-makefile/blob/master/.env.example

Si vous n'avez pas d'environnement de prod ou de preprod, vous pouvez supprimer les variables correspondantes ou bien les garder pour plus tard.

Enfin, il faudra lier ce nouveau fichier makefile à votre fichier makefile principal, à la racine de votre projet, en ajoutant après la ligne include .env, la ligne suivante :

include vendor/kgaut/drupal-makefile/drupal.mk

Les différentes rules sont présentées ici : https://github.com/kgaut/drupal-makefile#availables-rules

Une que j'utilise régulièrement est : db-prod-import qui fait en fait appel à plein d'autres rules :

Suppression de la base de données local et récréation (via db-empty)
Récupération du dump de base de données le plus récent en prod (via db-prod-get)
Import de ce dump en local (db-import)
Vidage des cache, mises à jour de base de données, import de la configuration et affiche un lien de connexion en tant qu'utilisateur 1 (via db-post-import)

Évidement tout ça est très lié à mon organisation de projet, mais vous pouvez certainement en récupérer des idées ou de l'inspiration.

N'hésitez-pas à suggérer des modifications ou des améliorations !

Personnaliser un export CSV avec Entity Export CSV sur Drupal 8

Le module Entity Export CSV nous permet de mettre en place très rapidement des exports CSV pour n'importe quelle type d'entité de contenu de Drupal 8. Parfois, nous pouvons avoir besoin de personnaliser les exports réalisés, comme exporter 2 informations différentes d'un même champs Entity Reference par exemple. Nous allons découvrir comment procéder pour personnaliser nos exports CSV.

Par lequipe.tech
L'Équipe.tech

Fin de vie de Drupal 7 et 8, êtes-vous prêts ?

Les versions 7 et 8 de Drupal arriveront en fin de vie en novembre 2021.

Qu’entend-on par fin de vie ?

La "fin de vie" annonce qu’il n’y aura plus de mise à jour de sécurité pour les versions en question.
À partir de cette date (novembre 2021), les failles qui seront découvertes et corrigées sur la version 9 ne le seront plus sur les versions 7 et 8.

Votre site sera donc vulnérable aux attaques.

Par kgaut
Kevin Gautreau

Drupal 8 & 9 - Hook Update - Tester si une table existe, la supprimer et la recréer

Pour un projet drupal, j'avais besoin de créer deux tables identiques dans une base de données séparée sur un serveur différent, afin de servir de cache pour un webservice.

Voici le code que j'ai utilisé pour créer ces tables avec un test si les tables existe avant de les récréer (si j'ai besoin de mettre à jour le modèle par exemple).

Définition du schéma de ma table dans le fichier MODULE.install :

# Le nom de cette fonction est personnel, je n'utilise pas le HOOK_schema() icifunction MODULE_schema_db_cache() {  $schema['proposals'] = [    'description' => 'distribProposal',    'fields' => [],    'primary key' => ['id'],    'indexes' => [      'id' => ['id'],      'room_type_code' => ['room_type_code'],    ],  ];   $schema['proposals']['fields']['id'] = [    'description' => 'id',    'type' => 'serial',    'not null' => TRUE,    'unsigned' => TRUE,  ];   $schema['proposals']['fields']['name'] = [    'type' => 'varchar',    'length' => 255,  ];  //Ajout des champs supplémentaires ici}

Création des tables via un hook_update() :

/** * DB cache ws - Creation tables */function MODULE_core_update_8005() {  try {    // Je passe sur une autre base de données définis dans mes settings     // ici : $databases['cache_ws']['default']    Database::setActiveConnection('cache_ws');    // Je récupère le schéma    $db = MODULE_schema_db_cache();    if($schema = Database::getConnection()->schema()) {      // Je veux avoir deux fois la même table afin de passer sur la seconde quand je met à jour la première      $tables = ['proposals_a', 'proposals_b'];      foreach ($tables as $table) {        // Si la table existe déjà je la supprime        if ($schema->tableExists($table)) {          $schema->dropTable($table);        }        // Puis je la recrée        $schema->createTable($table, $db['proposals']);      }    }  }  catch (Exception $e) {    // En cas de soucis je commence par basculer sur la base de donnée par défaut    Database::setActiveConnection();     // Puis je lance une erreur    throw new \Drupal\Core\Utility\UpdateException(t('vacanceole_core_update_8005 error : @message', ['@message' => $e->getMessage()]));  }    // Si tout s'est bien passé je repasse sur la base de données par défaut.  Database::setActiveConnection();  return t('Tables proposals_a and proposals_b successfully created');}

Pour bien faire je devrais ajouter l'installation de mes tables dans un hook install, en faisant appel à la fonction que je viens de définir :

function MODULE_install() {  MODULE_update_8005();}

 

Pages