Planète

Par Christophe MOLLET
Christophe Mollet

Comment créer un module avec Drupal 8 ?

Un module est un ensemble de fichiers PHP, Javascript et/ou CSS qui étendent les fonctionnalités du site et en ajoutent de nouvelles

Nous allons voir dans cet article comment créer un module avec Drupal 8.

Par kgaut
Kevin Gautreau

Drupal 8 - Modifier les onglets (local tasks)

Voici comment modifier un onglet Local Task dans le langage drupal, en utilisant le hook HOOK_local_tasks_alter:

function MONMODULE_local_tasks_alter(&$local_tasks) {  $local_tasks['entity.user.edit_form']['title'] = 'Modifier mes informations';}

La clé est définie dans la déclaration de l'élément :

Image

Drupal local task

 

Ici uniquement le titre est changé,il est possible de modifier les autres propriété, comme l'ordre (weight), la destination de l'élément...

Par Q__nt_n
Quentin Fonteneau

Exporter/Importer une base de données avec Drush

Exporter/Importer une base de données avec Drush
Q__nt_n
jeu 07/05/2020 - 12:26

Thèmes :

Pour exporter sa base de données :

drush sql-dump --gzip --result-file=../backup/dump_db_$(date +%Y%m%d-%H%M%S).sql

Pour importer sa base données :

gunzip -c dump_db_YYYYMMDD_HHMMSS.sql.gz | drush sqlc

 

Créer un sous-thème avec Drupal 8

Créer un thème ou un sous-thème dédié à un projet Drupal 8 fait partie des actions de base lors du démarrage du projet. Un thème dédié pour le front office, mais aussi un autre thème pour le back office. Ainsi toute personnalisation du rendu en sera facilité, par l'ajout de région, styles CSS ou encore librairies JS le cas échéant. Créer un sous-thème se fait en quelques minutes.

Intégrer automatiquement un mail via les styles CSS avec Drupal 8

Comment mettre des couleurs dans vos mails émis depuis votre site Drupal 8 ? Bien souvent, intégrer les mails émis par un site Drupal 8, ou de n'importe quel site web, peut s'avérer (très) chronophage, avec des contraintes fortes au niveau du rendu du mail pour disposer d'un rendu correct sur tous les types de courrielleur ou webmail. Découvrez une méthode pour faciliter l'intégration des emails avec de l'inline CSS automatisée.

Par vincent59
Vincent Liefooghe

Migration Media et Images Inline

Migration Media et Images Inline

Dans la série d'articles sur la migration de mon site https://www.vincentliefooghe.net/content/migration-drupal-7-vers-drupal-8 j'en viens maintenant à une partie qui m'a pris pas mal de temps et demandé un peu de développement.

Sur mon site en Drupal 7, j'avais utilisé le module Media_Wysiwyg et Colorbox, qui me permettaient d'insérer des images directement dans le texte.

Je n'ai pas trouvé d'équivalent sous Drupal 8, mais en utilisant comme format d'affichage "Colorbox" pour le champ media_image, ceci répond à mon besoin : ouvrir un champ image dans une "lightbox".

Image
Définition du format d'affichage Media Image

Il reste donc à convertir les fichiers en média, et ensuite à convertir, dans le corps du texte de chaque contenu, les tags "colorbox" en tags "drupal media".

Création des Media liés aux fichiers

Lors de la migration, les fichiers ont bien été importés. Par contre ils ne sont pas reconnus comme media par Drupal ,et donc pas réutilisables.

Après avoir cherché - en vain - des modules qui géraient ceci, j'ai fini par passer par un bout de programme PHP qui utilise les fonctions de Drupal pour réaliser cette opération.

Le code php est le suivant :

query("select * from file_managed where filemime like 'image%'")->fetchAll();

foreach ($results as $file ) {
  echo "File name:",$file->filename," Id : ",$file->fid," mime : ",$file->filemime," uid : ",$file->uid;
  echo "Creation du Media Image pour ",$file->filename,PHP_EOL;
  $media = Media::create([
  'bundle' => 'image',
  'uid' => $file->uid,
  'langcode' => $file->langcode,
  'field_media_image' => [
    'target_id' => $file->fid,
    'alt' => $file->filename
   ]

  ]);

  $media->setPublished(TRUE);
  $retour=$media->save();

  if ( $retour != 1 ) {
    echo "Retour KO ? ",$retour,PHP_EOL;
  }

}

return (TRUE);

 

On peut le lancer avec drush, via la commande :

 

drush --uri=drupal.loc scr /chemin/vers/mon/fichier.php

Après cette étape, on récupère bien dans la librairies de media tous les fichiers

Reprise des images inline

 

Pour convertir les tags, j'ai développé un programme PHP qui va remplacer les instructions inline Colorbox, par exemple

[[{"type":"media","view_mode":"colorbox","fid":"88","attributes":{"alt":"","class":"media-image","height":"300","typeof":"foaf:Image","width":"494"}}]]

par

Le script sera lancé avec en paramètre le Node Id à traiter :

php mediaInline.php -i nid

Par exemple

php mediaInline.php -i 136

Note : j'ai fait le choix de traiter les contenus un par un. Au total, j'avais identifié une vingtaine d'articles concernés. La migration unitaire me permettait de vérifier le traitement pour chacun.

Afin de voir le résultat, il faut vider le cache Drupal avec la commande :

drush cr

 

vincentl
lun 20/04/2020 - 21:54

Catégorie

Ajouter un commentaire

Par vincent59
Vincent Liefooghe

Migration avec le module migrate_upgrade

Migration avec le module migrate_upgrade

Installation et activation des modules Drush requis

On va installer les 2 modules suivants : migrate_upgrade, migrate_tools.

composer require drupal/migrate_upgrade composer require drupal/migrate_tools 

Puis activer les modules :

drush pm:enable migrate_upgrade migrate_tools -y 

Dans le fichier settings.php , il faut ajouter la définition de la base source.

Important : elle doit s'appeler migrate.

Par exemple :

$databases['migrate']['default'] =
  array ( 'database' => 'dbdrupal7',
  'username' => 'user_drupal7',
  'password' => 'mdp_drupal7',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql'
);

Générer la migration Drupal 7 vers Drupal 8

Dans la version que j'ai installé, on peut utiliser migrate_upgrade pour générer les scripts de migration, qui seront lancés avec drush.

Prérequis

Attention : à cause d'une incompatibilité avec drush 10, cette fonction nécessite que l'on modifie le fichier vendor/drush/drush/includes/drush.inc pour ajouter la définition de drush_print :

function drush_print($message = '', $indent = 0, $handle = NULL, $newline = TRUE) {
  $msg = str_repeat(' ', $indent) . (string)$message;
  if ($newline) {
    $msg .= "\n";
  }
  if (($charset = 'UTF-8' ) && function_exists('iconv')) {
    $msg = iconv('UTF-8', $charset, $msg);
  }
  if (!$handle) {
    $handle = STDOUT;
  }

  fwrite($handle, $msg);

}

 

Sinon on a le message :

drush migrate-upgrade --legacy-db-key=migrate --configure-only [error] Error: Call to undefined function drush_get_option() in drush_print()

Lancer la commande avec le chemin vers le répertoire source "legacy", ce qui permet de migrer les fichiers également :

drush migrate-upgrade --legacy-db-key=migrate --legacy-root /var/www/drupal7/vincentl --migration-prefix=upg1_ --configure-only

On peut ensuite voir le résultat avec la commande drush migrate-status

Et on peut lancer la migration avec :

drush migrate:import upg1_d7_taxonomy_vocabulary
drush migrate:import upg1_d7_taxonomy_term_categorie
drush migrate:import upg1_d7_taxonomy_term_tags
drush migrate-import --group=migrate_drupal_7

Note : je lance d'abord les migrations de taxonomie pour que la génération des liens de menu se passe correctement. Comme dit précédemment, le processus est assez itératif et a demandé plusieurs essais avant de trouver les bons réglages.

Après cette étape, le contenu a été migré, ainsi que les types de contenu, les menus, etc.

Il reste à faire quelques mises au point et reprise de paramétrage sur les formats de texte (insertion du bouton media par exemple), ainsi que refaire le thème, et traiter le cas des images inline.

 

vincentl
lun 20/04/2020 - 21:42

Catégorie
Tag

Ajouter un commentaire

Par vincent59
Vincent Liefooghe

Processus de migration vers Drupal 8

Processus de migration vers Drupal 8

Processus de migration

Le processus de migration a été testé plusieurs fois. Je suis parti sur la base d'une sauvegarde du site Drupal 7 (fichiers + base de données).

J'ai installé ça dans un container LXC sur mon PC, ce qui me permettra de supprimer tout cela une fois la migration terminée.

Au final, on a donc un container sous Debian 10 avec PHP 7.3.11 et une base MariaDB 10.1.

L'idée est donc la suivante :

  • création d'une base de données pour Drupal 8
  • installation d'un site en Drupal 8, en mode "standard", mais sans contenu
  • installation et activation des modules portés sous Drupal 8
  • installation et activation des modules de migration
  • lancement de la migration des contenus
  • reprise des média et de leur affichage (la migration ne gère pas ce point a priori)
  • ajustements manuels / reparamétrage dans la cible D8.

Le processus a été fait de manière itérative, je m'y suis repris à 3 ou 4 fois avant d'avoir un processus qui tienne la route.

Installation Drupal 8

Une fois la base de données créée, on procède à l'installation de Drupal 8.

A la date d'installation, la version est Drupal 8.8.5.

Il est maintenant fortement recommandé d'utiliser composer pour installer et mettre à jour Drupal.

Sachant que même l'installation de modules utilise composer, c'est la solution que j'ai utilisé. C'est d'ailleurs très pratique quand on refaire plusieurs fois la même installation, puisqu'une fois le fichier _composer.json _ généré, il est possible de s'en resservir.

Mon fichier comprend les modules suivants :

"repositories": [<br />
  { "type": "composer",<br />
  "url": "https://packages.drupal.org/8" }<br />
 ],<br />
"require": {<br />
  "composer/installers": "^1.2",<br />
  "drupal/colorbox": "^1.4",<br />
  "drupal/core-composer-scaffold": "^8.8",<br />
  "drupal/core-project-message": "^8.8",<br />
  "drupal/core-recommended": "^8.8",<br />
  "drupal/honeypot": "^1.30",<br />
  "drupal/pathauto": "^1.6",<br />
  "drupal/tagclouds": "^1.0",<br />
  "drupal/token": "^1.6",<br />
  "drupal/xmlsitemap": "^1.0@RC",<br />
  "drush/drush": "^10.2" },

On remarquera que drush est installé en même temps que Drupal.

Une fois le répertoire d'installation créé, et le fichier composer.json copié dans ce répertoire, l'installation se fait simplement :

composer install

A ce niveau, on peut déjà accéder au nouveau site (il faut auparavant avoir paramétré le virtualhost qui pointe sur le bon répertoire), entrer les paramètres de la base de données. J'ai personnellement choisi d'installer uniquement le français, car je ne vais pas gérer le multilingue.

Comme le site sera migré, on peut s'arrêter avant la configuration du site.

L'étape suivante est de préparer et lancer la migration.

 

 

vincentl
dim 19/04/2020 - 12:45

Catégorie
Tag

Ajouter un commentaire

Par vincent59
Vincent Liefooghe

Migration Drupal 7 vers Drupal 8

Migration Drupal 7 vers Drupal 8

Après plusieurs années sous Drupal 7, et l'arrivée imminente de Drupal 9, il était temps pour moi de migrer mon site sur Drupal 8, d'autant que les dernières versions ont maintenant des utilitaires de migration.

Situation initiale

Mon site perso n'est pas très complexe, ni au niveau contenu (environ 200 articles) ni au niveau modules Drupal.

La version utilisée est Drupal 7.69.

En plus des modules du "core", j'utilise des choses plutôt classiques :

  • ctools (pré-requis pour pas mal de choses)
  • blog (a disparu de la V8, c'est un type de contenu comme les autres)
  • media et media_wysiwyg (pour insérer les images dans le contenu)
  • colorbox (pour afficher les images dans une box en surimpression)
  • pathauto (permet de générer automatiquement un alias)
  • botcha (comme anti-spam)
  • tagclouds (affiche les tags sous forme de nuage)
  • xmlsitemap

Le thème est un développement custom, basé sur Adaptative Theme. Il sera à refaire.

Dans tout ça, les seuls module non portés en D8 et pour lesquels il faudra trouver une alternative sont media_colorbox et botcha.

Pour l'antispam, j'ai opté pour le module honeypot, et pour media_colorbox, le paramétrage de l'affichage pour les médias de type image va suffire.

Côté volumétrie, on a :

  • 159 fichiers
  • 199 articles
  • 4 "books" (série d'articles sur le même sujet)
  • 64 commentaires.

On utilise 2 langues : français et anglais (9 en anglais, le reste en français ou neutre).

Préparation du site sous Drupal 7

Afin de simplifier la migration, je vais changer la langue des articles en anglais pour les assigner au français ou au neutre.

Pour les alias d'URL, même modification (on assigne tout au "All languages").

Vu la faible volumétrie, je fais cela directement via l'interface web de Drupal, ce qui me permet de m'assurer que tous les champs sont correctement mis à jour.

Suite aux tests effectués, j'ai aussi modifié le champ field_alt_text pour enlever colorbox_link du mode d'affichage.

Les différentes étapes de la migration seront détaillées dans la suite de cette série d'articles, avec les problèmes que j'ai pu rencontrer.

 

Vincent
dim 19/04/2020 - 12:40

Catégorie

Ajouter un commentaire

Par kgaut
Kevin Gautreau

Drupal - Découvrez la fonction ddm, pour débuguer même en aveugle

Si vous développez avec drupal, vous connaissez peut-être les fonctions dump, dpm ou kint, (sinon, lisez ma rapide présentation de kint.)

Une autre fonction très pratique mais moins connue est ddm(), anciennement connue sous le nom de dd(), qui permet de dumper les paramètres dans un fichier, au lieu de les afficher dans la page. Cette fonction est donc très pratique dans les cas où l’on a aucun retour d’affiché (batch, hook_update, EventSubscriber...)

Note : Cette fonction vient du module devel, le module doit donc être installé et activé pour que la fonction soit disponible.

Le paramètre passé à la fonction est dumpé dans le fichier temporary://drupal-debug.txt, ainsi, sur mon site le wrapper temporary:// est configuré dans le dossier ../files/tmp. (Note : cette configuration se fait directement dans le fichier settings.php de drupal, elle était avant dans Configuration / Médias / Système de fichier)

Image

Configuration dossier tmp

Je peux donc afficher le contenu de ce fichier directement dans un éditeur de texte. À savoir que les tableaux et objets sont dumpé hiéarchiquement, ce qui est pratique mais qui peut rapidement alourdir ce fichier !

# Dans un de vos fichier php : ddm($variable);

Image

Sortie de drupal_debug.txt

On peut assi ajouter des labels à ce que l'on dump pour éviter de se perdre quand on dump plusieurs variables :

function kgaut_2020_preprocess_node(array &$variables) {  /** @var \Drupal\node\Entity\Node $node */  $node = $variables['elements']['#node'];   ddm('------------------');  ddm($node->getType(), 'Type de noeud');  ddm($node->getTitle(), 'Titre');  ddm($node->getCreatedTime(), 'Created');...}

Image

Sortie de ddm

Enfin, la fonction bach tail, on peut afficher en live ce qui est dumpé, dans un terminal, sans avoir à recharger le fichier, la commande à exécuter est ci-dessous :

# Chemin à adapter en fonction de votre organisation : tail -f /vhosts/kgaut.net/files/tmp/drupal_debug.txt

Évidement, cela ne vaut pas un "vrai" debuger comme xdebug ou autre, mais c'est mieux que rien !

Par admin

Revue de presse Drupal - semaine 14

Une nouvelle section sur le site pour vous partager une petite revue de presse du monde drupal afin d'occuper votre week-end confiné avec un peu de lecture en français et en anglais.

Nouveau bureau pour l’association

L'assemblée générale de l'association avait lieu il y a quelques jours, découvrez la composition du bureau : https://www.drupal.fr/articles/2020/decouvrez-bureau-2020-lassociation-drupal-france-francophonie.

La DrupalCon de Barcelone repoussée !

Après les Drupal Dev Days (repoussés à une date inconnue encore), c'est au tour de la DrupalCon de Barcelone d'être déplacée du 8 au 11 décembre 2020 au lieu des 14 au 17 septembre 2020. Plus d'informations en anglais : https://events.drupal.org/barcelona2020/covid-19-public-health-info.

Les tests unitaires avec Drupal 8

Extrait du livre Drupal 8 Module Development, en anglais : https://www.webomelette.com/automated-testing-drupal-8.

Toujours sur les tests unitaires : une présentation de Fabien Clément sur phpunit et Drupal 8 (français) : https://www.lequipe.tech/blog/les-tests-sous-drupal-8-phpunit.

Comment créer un thème Drupal 8

Toutes les explications pour créer un thème D8 en partant de 0 (anglais) : https://www.specbee.com/blogs/how-create-custom-drupal-8-theme-9-simple-steps.

Drupal 9, c'est pour bientôt !

La version 9 est prévu pour sortir le 3 juin 2020, cette semaine est sorti la seconde version beta pour préparer la version finale.

Découvrez l'annonce de sortie de la beta2 : https://www.drupal.org/project/drupal/releases/9.0.0-beta2.

Le portail officiel contenant toutes les informations concernant Drupal 9 (anglais) : https://www.drupal.org/docs/9.

Le point sur les nouveautés de Drupal 9 (français) : https://bluedrop.fr/content/chemin-vers-drupal-9-migration-drupal-8-drupal-7.

Découvrez comment tester Drupal 9 avec composer (français) : https://kgaut.net/snippets/2020/installer-et-tester-drupal-9-avec-composer.html.

Programme de test de migration de Drupal 8 vers Drupal 9 (anglais) : https://www.drupal.org/blog/get-involved-participate-in-the-beta-test-process-for-drupal-9.

Mettre en place un flux de modération / validation de contenu avec Drupal 8

Une checklist pour ne rien oublier (anglais) : https://www.axelerant.com/resources/team-blog/qa-checklist-editorial-workflow-moderation.

Nouveau système de numérotation des versions de module

Le versionnement sémantique arrive avec Drupal 8.8.3, en lieu et place des 8.x-2.0, les versions seront maintenant numérotées 2.0.0. Découvrez ce que cela veut dire pour vos modules et comment faire la transition : en français : https://kgaut.net/blog/2020/drupal-9-modules-et-versionnement-semantique.html et en anglais : https://www.drupal.org/node/1015226#semver-transition.

Et vous, qu'avez-vous lu cette semaine ? Partagez-vos liens en commentaire ci-dessous !

Par admin

Découvrez le bureau 2020 de l'association Drupal France et francophonie

L'assemblée générale de l'association a eu lieu le 12 mars 2020 et vous étiez nombreux en présentiel ou à distance, merci de votre implication !

Retrouvez le support de la présentation.

Le nouveau bureau élu :

En page d'accueil : 
Par kgaut
Kevin Gautreau

Drupal 9, modules, et versionnement sémantique

Avec l'arrivée prévue le 3 juin 2020 de drupal 9, il n'y a pas besoin de créer une branche 9.x-1.x spécifiquement pour drupal 9, vous pouvez facilement indiquer que votre module est compatible avec cette nouvelle version en ajoutant dans votre fichier mon_module.info.yml la clé suivante :

core_version_requirement: ^8 || ^9

La clé core est à conserver pour garder la compatibilité avec les versions inférieures à drupal 8.7.7 (oui c'est d'un pratique...) Exemple dans un de mes modules.

En outre, il en sera bientôt terminé des versions de module "8.x-1.0", le versionnement sémantique est adopté et est compatible à partir de drupal 8.8.3, C'est à dire que les nouvelles branches de vos projets seront nommées 2.x (au lieu de 8.x-2.x) et les tags (versions) pourront être sous la forme :

2.0.0-beta1
2.0.0
2.0.1
2.1.0

Si vous passez au versionnement sémantique, les numéros de versions doivent être incrémentés, ainsi, si actuellement vous avez actuellement une branche 8.x-2.x, conservez là pour toutes les versions de drupal inférieures à 8.8.3, mais vous pouvez dès maintenant créer une branche 3.x pour la compatibilité avec les versions 8.8.3+ et 9.0.0 de drupal.

Il est possible de spécifier qu'une branche ne sera compatible qu'avec drupal 9 dans le fichier info.yml :

core_version_requirement: ^9

Plus d'informations sur le versionnement sémantique

Plus d'informations sur les changements du fichier mon_module.info.yml

tl;dr

Si vous avez un module avec une branche 8.x-2.x :

Votre module est compatible avec drupal 9 : vous pouvez ajouter la clé "core_version_requirement: ^8 || ^9" à votre module.info.yaml (c'est ce que j'ai fais pour mon mini module popin : https://www.drupal.org/project/popin. Vous pourrez passer au versionnement sémantique pour la prochaine version majeure de votre module
Votre module nécessite de plus gros travaux pour être rendu compatible, vous pouvez garder la branche 8.x-2.x pour drupal 8 et démarrer une branche 3.x qui sera une branche de travail pour drupal 9.

Par liber_t
Ines WALLON

Relancer un hook_update avec drush

Il peut être parfois utile de vouloir relancer un hook_update_n, pour ce faire vous pouvez utiliser cette commande drush. Dans cette exemple, je veux rejouer le hook my_paragraph_update_8001

drush ev "drupal_set_installed_schema_version('my_paragraph', '8000');" ; drush updb

Par kgaut
Kevin Gautreau

Installer et tester drupal 9 avec composer

La première version beta de Drupal 9 est sortie il y a quelques jours, et la version stable est prévue pour le 3 juin.

Si vous souhaitez tester dès aujourd'hui et par exemple vérifier si vos modules sont compatibles, voici comment installer la première beta avec composer :

Dans le dossier où vous souhaitez installer drupal :

composer create-project drupal/recommended-project:9.0.0-beta1 ./

Ensuite configurez votre serveur web pour pointer sur le dossier web et c'est parti :

Image

Drupal 9

Par kgaut
Kevin Gautreau

Module drupal 8 : Apidae Tourisme

Apidae tourisme est un « réseau d'informations touristiques » qui permet aux offices du tourisme, mairies... De créer des « lieux » (restaurants, hôtels...) ainsi que des évènements sur des cartes de manière collaborative.

Dans le cadre d'un ancien projet, j'avais du développer une intégration avec l'API de ce service et un site drupal. J'avais à l'époque développé ce module sur github afin de peut-être un jour le mettre à disposition de tous. Un drupalistos m'a signalé récèment qu'il était listé sur la page des intégrations disponible sur la doc développeur d'Apidae.

Rebelote pour un projet que je vais attaquer, du coup j'ai pris un peu de temps pour packager le module que j'avais développé à l'époque, le nettoyer un peu afin de le publier sur drupal.org. C'est chose faite aujourd'hui !

Le module permet à intervalle régulier de synchroniser les données venant d'Apidae et de créer / mettre à jours des nœuds en récupérant différents champs (noms, description, médias, téléphone, coordonnés GPS...)

Le module gère le multi-langue et on peut ainsi récupérer des traductions des fiches et générer des traductions des nœuds.

Actuellement seulement certains champs sont mappés, mais je compte rendre ça administrable dans un futur proche.

Je suis preneur de suggestions et n'hésitez-pas à me contacter si vous souhaitez de l'aide ou des informations dans sa mise en œuvre.

La page du module sur drupal.org : https://www.drupal.org/project/apidae_tourisme

Par Christophe MOLLET
Christophe Mollet

Drupal Con

Vous souhaitez participer à la Drupal Con ? Retrouvez toutes les informations nécessaires et le programme dans notre article.

Pages