Planète

Par kgaut
Kevin Gautreau

Drupal - Utiliser Devel Generate pour générer des entités personnalisées

Devel Generate est un sous module de Devel permettant de générer du contenu de test pour son site drupal, que cela soit des nœuds, des termes de taxonomy, des utilisateurs ou encore des éléments de menu.

Il est aussi possible de développer un petit plugin permettant de générer des entités d'un type custom, en renseignant ses champs mais aussi ses propriétés (basefield).

Voici le code du plugin de mon module me permettant de générer des entités de type « cadeau ». Attention, c'est fonctionnel, mais c'est du rapidos, la propreté du code est perfectible !

Fichier : modules/mon_module/src/Plugin/DevelGenerate/CadeauDevelGenerate.php

<?php
namespace Drupal\mon_module\Plugin\DevelGenerate;

use Drupal\Core\Field\Plugin\Field\FieldType\UriItem;
use Drupal\Core\Form\FormStateInterface;
use Drupal\devel_generate\DevelGenerateBase;
use Drupal\image\Plugin\Field\FieldType\ImageItem;
use Drupal\kebrina\Entity\Cadeau;
use Drupal\text\Plugin\Field\FieldType\TextLongItem;

/**
* Provides a ContentDevelGenerate plugin.
*
* @DevelGenerate(
*   id = "cadeau", // Le nom machine de mon type d'entité
*   label = @Translation("Cadeau"),
*   description = @Translation("Génère des cadeaux"),
*   url = "cadeau",
*   permission = "administer devel_generate",
*   settings = { // Les paramètres par défaut
*     "num" = 50,
*     "kill" = FALSE,
*   }
* )
*/
class CadeauDevelGenerate extends DevelGenerateBase {

  /**
   * Le formulaire à renseigner avant la génération du contenu
   */
  public function settingsForm(array $form, FormStateInterface $form_state) {

    $form['num'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Combien de cadeaux voulez-vous générer ?'),
      '#default_value' => $this->getSetting('num'),
      '#size' => 10,
    ];

    $form['kill'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Supprimer tous les cadeaux en base avant la génération ?'),
      '#default_value' => $this->getSetting('kill'),
    ];

    return $form;
  }
  protected function generateElements(array $values) {
    $num = $values['num'];
    $kill = $values['kill'];

    if ($kill) {
      $nbDeletedItems = 0;
      // Suppression des contenus existants
      foreach (Cadeau::loadMultiple() as $cadeau) {
        $cadeau->delete();
        $nbDeletedItems++;
      }
      $this->setMessage($this->formatPlural($nbDeletedItems, '1 cadeau a été supprimé', '@count cadeaux supprimés'));
    }

    $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
    $entity_type = $definition_update_manager->getEntityType('cadeau'); // À modifier en fonction du nom machine de votre type d'entité
    for ($i = 1; $i <= $num; $i++) {
      // Création de l'entité avec des valeurs générée aléatoirement en fonction de leur type
      // ImageItem, TextLongItem, UriItem sont a adapter en fonction des types de vos propriétés
      $cadeau = Cadeau::create([
        'title' => $this->getRandom()->word(mt_rand(2, 50)),
        'photo' => ImageItem::generateSampleValue(Cadeau::baseFieldDefinitions($entity_type)['photo']),
        'description' => TextLongItem::generateSampleValue(Cadeau::baseFieldDefinitions($entity_type)['description']),
        'url' => UriItem::generateSampleValue(Cadeau::baseFieldDefinitions($entity_type)['url']),
      ]);
      // On renseigne aussi les champs s'il y'en a.
      $this->populateFields($cadeau);
      // Et on sauvegarde notre contenu
      $cadeau->save();
    }
  }

  public function validateDrushParams(array $args, array $options = []) {
    return [
      'num' => $options['num'],
      'kill' => $options['kill'],
    ];
  }
}

 

Un petit coup de vidage de cache, puis sur l'uri /admin/config/development/generate, vous aurez maintenant une nouvelle option :

Image

Devel Generate

Par Christophe MOLLET
Christophe Mollet

Installer Drupal 9 avec Composer

Si vous vous lancez dans la création de site web personnalisé, et souhaitez posséder d'un processus de création le plus professionnel possible, notre agence web vous recommande d'installer Drupal avec Composer. Cela vous permettra entre autres d'avoir le contrôle sur le versionning de la base de données et des extensions contrib de Drupal. Afin de vous accompagner au mieux dans votre projet web, un de nos experts Drupal vous a préparé un tutoriel.

Par Artusamak
Julien Dubois

Remplacer son code jQuery par du code natif "vanilla"

Remplacer son code jQuery par du code natif "vanilla"
Artusamak
jeu 08/04/2021 - 09:42

Drupal 9 a initié une tendance de fond depuis plusieurs années au sein de sa base de code qui consiste à retirer sa dépendance à jQuery afin d'alléger le poids des pages (en l'invoquant à la carte) puis en le remplaçant par des implémentations dites vanilla (en javascript natif pur).

Cette tendance de fond est possible car les navigateurs ont bien progressé et leurs implémentations sont uniformisées, au point que les années de jQuery soient comptées (pas seulement à cause de cela).

Par réflexe ou par habitude, beaucoup de développeurs (back) savent développer certains comportements interactifs avec jQuery mais ne savent pas le faire de façon vanilla. Ces liens recensent quelques techniques et snippets d'équivalence pour les taches les plus courantes.

 

Catégories
Auteur
Par kgaut
Kevin Gautreau

Drupal 8 & Drupal 9 - Importer de la config via un update

Il est parfois nécessaire d'importer de la config directement dans un HOOK_update().

Évidement il est préférable de respecter le process normal (avec par exemple la commande drush  deploy). Mais il peut arriver de ne pas avoir le choix, dans ce cas, voici comment faire :

/**
* Import config du dossier config/install de mon_super_module
*/
function mon_super_module_update_9001() {
  $configFolder = drupal_get_path('module', 'mon_super_module') . '/config/install';
  $configFileStorage = new \Drupal\Core\Config\FileStorage($config_path);
  \Drupal::service('config.installer')->installOptionalConfig($configFileStorage);
}

 

Par Mixalis44
Mickael Zafiriou
Développeur Drupal depuis 2013.

Quickie 02 : Ajouter une régle d'affichage personnalisée pour les blocs

Dans Drupal, les blocs sont les pierres angulaires de l'affichage des éléments du site. Bien-sûr en fonction des pages on n'affiche pas tous les blocs possible en même temps.
On peut paramétrer certaines règles d'affichage que le core certains modules proposent. Aujourd’hui je vais présenter comment créer des règles personnalisées.

Par kgaut
Kevin Gautreau

Drupal 8 & Drupal 9 - Entité - Champ de base « Numéro de téléphone »

Via le module core « telephone », il est possible de créer un champ de base (basefield) pour les numéros de téléphone. Rien de foufou au niveau de la validation, c'est uniquement au niveau de l'affichage que ce champ permettra d'afficher le numéro sous forme de lien.

    $fields['phone'] = BaseFieldDefinition::create('telephone')
      ->setLabel(t('Phone number'))
      ->setRequired(TRUE)
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

Il faut évidement que le module telephone soit activé afin que ce champ soit disponible.

Par Mixalis44
Mickael Zafiriou
Développeur Drupal depuis 2013.

Débbuger les mails sous Drupal 9 avec Mailcatcher

Lorsque l'on développe un site web, on a généralement une copie de ce dernier en local afin de pouvoir travailler en toute sérénité : possibilité d'afficher les erreurs, modification de la BDD pour des tests, CSS défectueux ou incomplet... Dans cet article j'aimerai présenter la solution que j'utilise afin d'avoir la même sérénité lorsque je travaille sur les mails. Ceci me permet de débugger, tester sans que les mails ne sortent de ma machine.

Par kgaut
Kevin Gautreau

Drupal 8 & Drupal 9 - Ajouter une balise meta dans le code

Aujourd'hui dans le genre pourquoi faire simple quand on peut faire compliqué, nous allons voir comment rajouter une balise meta dans le code source de nos pages de notre site Drupal 8.

Nous pourrions le faire évidement en copiant cette ligne dans un template, mais cela serait trop simple évidement...

Nous allons plutôt utiliser le hook HOOK_preprocess_html qui peut s'utiliser dans mon module ou un thème :

function mon_module_preprocess_html(&$variables) {
  $googleSiteVerification = [
    '#tag' => 'meta', // Type de balise que l'on souhaite insérer
    '#attributes' => [ // Attributs de la balise
      'name' => 'google-site-verification',
      'content' => 'mon-code-de-verif',
    ],
  ];
  $variables['page']['#attached']['html_head'][] = [$googleSiteVerification, 'google-site-verification'];
}

 

Par admin

Statistiques de notre espace Slack

À la demande d'un de nos membres, j'ai récupéré vendredi 12 mars 2021 quelques statistiques sur notre espace Slack, que je partage aujourd'hui avec vous ici pour plus de simplicité.

Membres actifs

Données des 30 derniers jours

(depuis le 12 mars donc)

Souscription (par semaine) - 30 derniers jours

Souscription (par jour) - 30 derniers jours

Toutes périodes confondues

Souscription (par semaine) - Toutes périodes confondues

Souscription (par jour) - Toutes périodes confondues

Utilisation des canaux

Toutes périodes confondues

Liste des canaux (1/4)  - Toutes périodes confondues

Liste des canaux (2/4) - Toutes périodes confondues

Liste des canaux (3/4) - Toutes périodes confondues

Liste des canaux (4/4) - Toutes périodes confondues

Répartition des messages

Toutes périodes confondues

Répartition des messages (lecture) - Toutes périodes confondues

Répartition des messages (écriture) - Toutes périodes confondues

Voilà, j'ai trouvé l'exercice intéressant et je pense refaire le point l'an prochain pour qu'on puisse comparer. Si vous avez des suggestions, n'oubliez pas que le canal #orga-slack est à votre disposition ! Le temps de traitement n'est pas garanti en revanche ;)

PS
Je n'ai pas eu le temps de récupérer les données autrement que via capture d'écran pour l'instant, j'ai bien conscience que ce n'est pas idéal. Si cela est bloquant, n'hésitez pas à nous demander des détails via bureau@drupal.fr.

Par admin

Statistiques de notre espace Slack

À la demande d'un de nos membres, j'ai récupéré vendredi 12 mars 2021 quelques statistiques sur notre espace Slack, que je partage aujourd'hui avec vous ici pour plus de simplicité.

Membres actifs

Données des 30 derniers jours

(depuis le 12 mars donc)

Souscription (par semaine) - 30 derniers jours

Souscription (par jour) - 30 derniers jours

Toutes périodes confondues

Souscription (par semaine) - Toutes périodes confondues

Souscription (par jour) - Toutes périodes confondues

Utilisation des canaux

Toutes périodes confondues

Liste des canaux (1/4)  - Toutes périodes confondues

Liste des canaux (2/4) - Toutes périodes confondues

Liste des canaux (3/4) - Toutes périodes confondues

Liste des canaux (4/4) - Toutes périodes confondues

Répartition des messages

Toutes périodes confondues

Répartition des messages (lecture) - Toutes périodes confondues

Répartition des messages (écriture) - Toutes périodes confondues

Voilà, j'ai trouvé l'exercice intéressant et je pense refaire le point l'an prochain pour qu'on puisse comparer. Si vous avez des suggestions, n'oubliez pas que le canal #orga-slack est à votre disposition ! Le temps de traitement n'est pas garanti en revanche ;)

PS
Je n'ai pas eu le temps de récupérer les données autrement que via capture d'écran pour l'instant, j'ai bien conscience que ce n'est pas idéal. Si cela est bloquant, n'hésitez pas à nous demander des détails via bureau@drupal.fr.

Par admin

Le bureau nouveau est arrivé !

Suite à l'Assemblé Générale Ordinaire du jeudi 11 mars 2021, un nouveau bureau a été élu :

Merci à nos membres pour leur présence lors de cet évènement important pour l'association !

Nous souhaitons aussi remercier particulièrement Alexane TRUBERT et Julien SOLEILHAVOUP pour leur travail au sein du précédent bureau. Merci à vous deux pour votre soutien au cours de cette année difficile pour tout le monde, c'est aussi grâce à vous si l'association a tenu le coup ! Encor bravo aussi à Alexane pour son nouveau mandat de présidente de WebAssoc !

Comme évoqué lors de l'AGO, le bureau compte cette année poursuivre sur la lancée du mandat précédent, fortement impacté par la crise du Covid-19 :

  • La traduction toujours ! D'ailleurs on a besoin de vous pour valider les traductions du guide
  • Gouvernance des outils :migration progressive des différents comptes de l'association vers un compte "bureau" non nominatif (quand c'est possible), pour simplifier la gestion et les passations
  • Amélioration de la communication
  • Crédit de toutes les contributions grâce à notre nouveau projet sur Drupal.org : organisation de Meetup, traduction, aide à la réalisation du site de l'association... Il n'y a pas que le code dans une communauté !
  • Organisation de DrupApéro en ligne plus réguliers
  • Test de nouveaux outils (WorkAdventure, outil de vote en ligne, migration possible de Meetup...)
  • Un gros travail d'ouverture à la francophonie au sens large, avec un rapprochement des autres associations locales francophones. Le bureau voudrait aussi pouvoir soutenir les communautés qui n'ont pas encore de structure à se développer
  • Et enfin, organisation d'un DrupalCamp en ligne cette année :)

En bref, il y a du pain sur la planche, mais l'équipe est motivée, et nous savons que vous aussi !

Le PV d'AGO sera prochainement finalisé et partagé ici.

Pour contacter le bureau de l'association, vous pouvez adresser un e-mail à l'adresse bureau@drupal.fr.

Par admin

Le bureau nouveau est arrivé !

Suite à l'Assemblé Générale Ordinaire du jeudi 11 mars 2021, un nouveau bureau a été élu :

Merci à nos membres pour leur présence lors de cet évènement important pour l'association !

Nous souhaitons aussi remercier particulièrement Alexane TRUBERT et Julien SOLEILHAVOUP pour leur travail au sein du précédent bureau. Merci à vous deux pour votre soutien au cours de cette année difficile pour tout le monde, c'est aussi grâce à vous si l'association a tenu le coup ! Encore bravo aussi à Alexane pour son nouveau mandat de présidente de WebAssoc !

Comme évoqué lors de l'AGO, le bureau compte cette année poursuivre sur la lancée du mandat précédent, fortement impacté par la crise du Covid-19 :

  • La traduction toujours ! D'ailleurs on a besoin de vous pour valider les traductions du guide
  • Gouvernance des outils :migration progressive des différents comptes de l'association vers un compte "bureau" non nominatif (quand c'est possible), pour simplifier la gestion et les passations
  • Amélioration de la communication
  • Crédit de toutes les contributions grâce à notre nouveau projet sur Drupal.org : organisation de Meetup, traduction, aide à la réalisation du site de l'association... Il n'y a pas que le code dans une communauté !
  • Organisation de DrupApéro en ligne plus réguliers
  • Test de nouveaux outils (WorkAdventure, outil de vote en ligne, migration possible de Meetup...)
  • Un gros travail d'ouverture à la francophonie au sens large, avec un rapprochement des autres associations locales francophones. Le bureau voudrait aussi pouvoir soutenir les communautés qui n'ont pas encore de structure à se développer
  • Et enfin, organisation d'un DrupalCamp en ligne cette année :)

En bref, il y a du pain sur la planche, mais l'équipe est motivée, et nous savons que vous aussi !

Le PV d'AGO sera prochainement finalisé et partagé ici.

Pour contacter le bureau de l'association, vous pouvez adresser un e-mail à l'adresse bureau@drupal.fr.

Par Christophe MOLLET
Christophe Mollet

Configuration d'un flux RSS sur Drupal

Qu'est-ce qu'un flux RSS ?

 

RSS signifie Really Simple Syndication. C'est une méthode simple et standardisée de distribution de contenu qui peut vous aider à être au courant des actualités, blogs, sites web et réseaux sociaux préférés, de façon centralisée.

Par kgaut
Kevin Gautreau

Drupal 8 & Drupal 9 - Changer l'ordre d'exécution des hooks

Pour un projet, je souhaiter alterer un type d'entité via HOOK_entity_type_alter. Problème un module du core effectuait une modification sur ce même type d'entité, et son hook était exécuté après celui de mon module. Les modifications de mon module n'étaient donc pas prise en compte.

Il y a plusieurs possibilités pour résoudre ce soucis, celle que j'ai utilisé ici est de forcer ce hook à être exécuté en dernier. Ceci en utilisant le HOOK_module_implements_alter (dans cet exemple, le nom machine de mon module est kgaut [oui, c'est vendredi, je ne suis pas très inspiré]).

function kgaut_module_implements_alter(&$implementations, $hook) {
  switch ($hook) {
    case 'entity_type_alter':
      $group = $implementations['kgaut'];
      unset($implementations['kgaut']);
      $implementations['kgaut'] = $group;
      break;
  }
}

Ce bout de code force le hook entity_type_alter à utiliser l'implémentation du module kgaut en dernier (et après donc toutes les autres implémentations des autres modules)

Prévenir des soumissions non sollicitées en masse sur son site Drupal 9 (ou Drupal 8)

Plusieurs solutions anti-spam existent sur Drupal pour prévenir les soumissions de formulaires (contact, abonnement newsletter, etc.) par des robots plus ou moins bien intentionnés. Sans vouloir être exhaustif, nous pouvons utiliser les modules Honeypot et Antibot qui fournissent des mécanismes de défense (différents) non intrusifs, ou encore les modules captcha ou recaptcha qui demandent au visiteur de répondre à différents challenges avant de lui permettre de soumettre le formulaire.

Par kgaut
Kevin Gautreau

Drupal 8 & Drupal 9 - Créer des éléments de menu dans le code

Note : Il est aussi possible de créer des éléments de menu dans le fichier MODULE.links.menu.yml, cf : https://kgaut.net/snippets/2017/drupal-8-creer-un-element-de-menu-vers-… et https://kgaut.net/snippets/2018/drupal-8-drupal-9-menu-ajouter-un-eleme…

Les extraits de codes suivants peuvent être placer dans des fonctions d'update (MODULE_UPDATE_9001() par exemple).

Créer un élément de menu simple vers un nœud dans le menu principal (main)

$menuItem = MenuLinkContent::create([
  'title' => 'Mon Menu avec un lien vers un noeud',
  'link' => ['uri' => 'internal:/node/5'],
  'menu_name' => 'main',
  'expanded' => TRUE,
  'weight' => 2,
]);
$menuItem->save();

 

Créer un élément de menu sans lien

$menuItem = MenuLinkContent::create([
  'title' => 'Mon menu sans lien',
  'link' => ['uri' => 'route:nolink'],
  'menu_name' => 'main',
  'expanded' => TRUE,
  'weight' => 2,
]);
$menuItem->save();

 

Un élément de sous-menu

$childMenuItem = MenuLinkContent::create([
  'title' => 'Mon sous menu',
  'link' => ['uri' => 'internal:/node/4'],
  'menu_name' => 'main',
  'expanded' => TRUE,
  'parent' => 'menu_link_content:' . $menuItemParent->uuid(),
  'weight' => 2,
]);
$childMenuItem->save();

 

Arborescence complète

Et voici un exemple complet, à adapter à votre besoin pour créer une arborescence, c'est largement perfectible, mais ça fait le taf.

  $items = [
    'Mon élément parent' => [
      'uri' => 'route:<nolink>',
      'children' => [
        'Un menu item' => 'internal:/node/5',
        'Une autre item' => 'internal:/node/6',
      ],
    ],
    'Un autre parent' => [
      'uri' => 'route:<nolink>',
      'children' => [
        'Salut' => 'internal:/node/7',
        "c'est" => 'internal:/node/8',
        'cool' => 'internal:/node/9',
      ],
    ],
  ];
  $poids = 0;
  foreach($items as $parent => $data) {
    $menuItem = MenuLinkContent::create([
      'title' => $parent,
      'link' => ['uri' => $data['uri']],
      'menu_name' => 'main',
      'expanded' => TRUE,
      'weight' => ++$poids,
    ]);
    $menuItem->save();
    foreach ($data['children'] as $child => $subdata) {
      $childMenuItem = MenuLinkContent::create([
        'title' => $child,
        'link' => ['uri' => $subdata['uri']],
        'menu_name' => 'main',
        'expanded' => TRUE,
        'parent' => 'menu_link_content:' . $menuItem->uuid(),
        'weight' => ++$poids,
      ]);
      $childMenuItem->save();
    }
  }

 

Par Simon Georges
Simon Georges
Drupal depuis plus de 10 ans, SEO depuis 3 ans

Varnish et Drupal 9 : le vidage de cache ciblé

La mise en place d'un cache de pages anonymes Varnish devant un Drupal 9 permet une mise en place relativement aisée d'un vidage automatique des pages mises en cache en se basant sur la politique de tags de Drupal. Cet article devrait vous donner les bases pour commencer à comprendre et expérimenter le système.

Par admin

Prochaine Assemblé Générale Ordinaire de l’association Drupal France et Francophonie

Comme tous les ans, l’association Drupal France & Francophonie organise une AG afin de dresser le bilan de l’année écoulée et élire son nouveau bureau.

Cette année, cette assemblée aura lieu le jeudi 11 mars 2021 à 19h en ligne. Le lien de l’événement sera communiqué par mail aux adhérent·e·s puis annoncé sur les réseaux sociaux le jour même. Comme pour l’année précédente, les votes se feront par internet. Si vous ne pouvez pas assister à l’événement, il vous est possible de donner votre pouvoir à une personne de votre choix.

Nous vous rappelons que tout le monde peut participer à l’AG mais que seul·e·s les membres à jour dans leur cotisation peuvent voter. Pensez donc à vérifier la validité de votre adhésion sur votre profil https://www.drupal.fr afin de pouvoir faire entendre votre voix.

À ce propos, nous vous informons d'un changement fonctionnel concernant les ré-adhésions : il n'est plus possible de renouveler une adhésion en avance. Désormais, il vous faudra attendre la fin de validité de votre cotisation en cours pour avoir accès au paiement via le site.

Enfin, si vous souhaitez vous présenter au bureau, il vous faudra aussi être à jour de votre cotisation et compter au minimum trois mois d’ancienneté. N’hésitez pas à envoyer votre candidature à l’adresse suivante : bureau@drupal.fr

Vous pouvez également consulter la convocation adressée aux membres ce lundi 08 février ici : https://mailchi.mp/drupal.fr/convocation-ag-drupal-france-11-mars-2021

Par admin

Prochaine Assemblée Générale Ordinaire de l’association Drupal France et Francophonie

Comme tous les ans, l’association Drupal France & Francophonie organise une AG afin de dresser le bilan de l’année écoulée et élire son nouveau bureau.

Cette année, cette assemblée aura lieu le jeudi 11 mars 2021 à 19h en ligne. Le lien de l’événement sera communiqué par mail aux adhérent·e·s puis annoncé sur les réseaux sociaux le jour même. Comme pour l’année précédente, les votes se feront par internet. Si vous ne pouvez pas assister à l’événement, il vous est possible de donner votre pouvoir à une personne de votre choix.

Nous vous rappelons que tout le monde peut participer à l’AG mais que seul·e·s les membres à jour dans leur cotisation peuvent voter. Pensez donc à vérifier la validité de votre adhésion sur votre profil https://www.drupal.fr afin de pouvoir faire entendre votre voix.

À ce propos, nous vous informons d'un changement fonctionnel concernant les ré-adhésions : il n'est plus possible de renouveler une adhésion en avance. Désormais, il vous faudra attendre la fin de validité de votre cotisation en cours pour avoir accès au paiement via le site.

Enfin, si vous souhaitez vous présenter au bureau, il vous faudra aussi être à jour de votre cotisation et compter au minimum trois mois d’ancienneté. N’hésitez pas à envoyer votre candidature à l’adresse suivante : bureau@drupal.fr

Vous pouvez également consulter la convocation adressée aux membres ce lundi 08 février ici : https://mailchi.mp/drupal.fr/convocation-ag-drupal-france-11-mars-2021

Pages