Planète

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Supprimer toutes les entités d'un certain type

Dans mon_module.install :

  1. /**
  2.  * Remove all products
  3.  */
  4. function mon_module_update_8001() {
  5. $toDelete = \Drupal::entityQuery('product')->execute();
  6. foreach ($toDelete as $item) {
  7. $item = \Drupal\clearblue\Entity\Product::load($item);
  8. $item->delete();
  9. }
  10. }

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Supprimer un type d'entité

Dans mon_module.install :

  1. /**
  2.  * Remove Product entity type
  3.  */
  4. function mon_module_update_8001() {
  5. $entity_type = 'product';
  6. $entity_update_manager = \Drupal::entityDefinitionUpdateManager();
  7. $entity_type = $entity_update_manager->getEntityType(entity_type);
  8. $entity_update_manager->uninstallEntityType($entity_type);
  9. }

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Ajouter une propriété à un type d'entité config

Voici comment altérer un type d'entité config pour lui ajouter une propriété.

Dans le cas présent, nous allons modifier le type d'entité ConfigurableLanguage afin de lui ajouter un champ google_analytics, pour avoir par exemple un code de tracking différent pour chaque langue.

Commençons par définir les nouveaux formulaire concernant pour l'édition et la création de langue :

modules/custom/mon_module/mon_module.module

  1. function mon_module_entity_type_alter(array &$entity_types) {
  2. $entity_types['configurable_language']->setFormClass('add', \Drupal\mon_module\Entity\Form\LanguageCustomAddForm::class);
  3. $entity_types['configurable_language']->setFormClass('edit', \Drupal\mon_module\Entity\Form\LanguageCustomEditForm::class);
  4. }

 

Ci dessous, le contenu des formulaires qui héritent directement des formulaires de base qu'ils supplantent.

modules/custom/mon_module/src/Entity/Form/LanguageCustomAddForm.php

  1.  
  2. namespace Drupal\mon_module\Entity\Form;
  3.  
  4. use Drupal\Core\Form\FormStateInterface;
  5. use Drupal\language\Form\LanguageAddForm;
  6.  
  7. class LanguageCustomAddForm extends LanguageAddForm {
  8. use LanguageCustomTrait;
  9.  
  10. public function form(array $form, FormStateInterface $form_state) {
  11. $form = parent::form($form, $form_state);
  12. $this->getFormCustomFields($form);
  13. return $form;
  14. }
  15.  
  16. }

 

modules/custom/mon_module/src/Entity/Form/LanguageCustomEditForm.php

  1.  
  2. namespace Drupal\mon_module\Entity\Form;
  3.  
  4. use Drupal\Core\Form\FormStateInterface;
  5. use Drupal\language\Form\LanguageEditForm;
  6.  
  7. class LanguageCustomEditForm extends LanguageEditForm {
  8. use LanguageCustomTrait;
  9.  
  10. public function form(array $form, FormStateInterface $form_state) {
  11. $form = parent::form($form, $form_state);
  12. $this->getFormCustomFields($form);
  13. return $form;
  14. }
  15.  
  16. }

 

Enfin, afin d'éviter la répétition de code, je passe par un trait qui contient mes customisations.

Ce trait est appelé dans les classes ci-dessous via l'appel : $this->getFormCustomFields($form);

Ce trait, fait deux choses, dans la méthode getFormCustomFields() il altère le formulaire pour ajouter le champs qui nous intéresse, et via l'appel à la méthode customEntityBuilder(), l'enregistrement de ce champ est effectué.

modules/custom/mon_module/src/Entity/Form/LanguageCustomTrait.php

  1.  
  2. namespace Drupal\mon_module\Entity\Form;
  3.  
  4. use Drupal\Core\Form\FormStateInterface;
  5. use Drupal\language\ConfigurableLanguageInterface;
  6.  
  7. trait LanguageCustomTrait {
  8.  
  9. public function getFormCustomFields(&$form) {
  10. /* @var $language \Drupal\language\ConfigurableLanguageInterface */
  11. $language = $this->entity;
  12.  
  13. $form['google_analytics'] = [
  14. '#title' => t('ID Google Analytics'),
  15. '#type' => 'textfield',
  16. '#default_value' => $language->getThirdPartySetting('mon_module', 'google_analytics')
  17. ];
  18. $form['#entity_builders'][] = '::customEntityBuilder';
  19. }
  20.  
  21. function customEntityBuilder($entity_type, ConfigurableLanguageInterface $language, &$form, FormStateInterface $form_state) {
  22. if ($form_state->getValue('google_analytics')) {
  23. $language->setThirdPartySetting('mon_module', 'google_analytics', $form_state->getValue('google_analytics'));
  24. return;
  25. }
  26. $language->unsetThirdPartySetting('mon_module', 'google_analytics');
  27. }
  28.  
  29. }

évidement, pensez à modifier toutes les occurrences de mon_module par le nom machine de votre module.

Merci à Alexandre Mallet aka @woprrr pour la piste

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Afficher un noeud via le code

Pour afficher avoir le renderable array d'un noeud dans le code, rien de plus simple via le service entity_type.manager :

  1. $node = Node::load(1);
  2. $node_rederable = \Drupal::service('entity_type.manager')->getViewBuilder('node')->view($node);

Pour utiliser un autre view_mode :

  1. $node = Node::load(1);
  2. $node_rederable = \Drupal::service('entity_type.manager')->getViewBuilder('node')->view($node, 'embed');

Évidement le plus propre et de passer par l'injection de dépendance, voici une version simplifiée de mon contrôleur :

  1.  
  2. namespace Drupal\mon_module\Controller;
  3.  
  4. use Drupal\Core\Controller\ControllerBase;
  5. use Drupal\Core\Entity\EntityTypeManager;
  6. use Drupal\node\Entity\Node;
  7. use Symfony\Component\DependencyInjection\ContainerInterface;
  8.  
  9. /**
  10.  * Class PageController.
  11.  */
  12. class PageController extends ControllerBase {
  13.  
  14. /**
  15.   * @var \Drupal\Core\Entity\EntityTypeManager
  16.   */
  17. protected $entityTypeManager;
  18.  
  19. public function __construct(EntityTypeManager $entityTypeManager) {
  20. $this->entityTypeManager = $entityTypeManager;
  21. }
  22.  
  23. public static function create(ContainerInterface $container) {
  24. return new static($container->get('entity_type.manager'));
  25. }
  26.  
  27. public function frontpage() {
  28. $node = Node::load(1);
  29. $page = $this->entityTypeManager->getViewBuilder('node')->view($node, 'embed');
  30.  
  31. return [
  32. 'page' => $page,
  33. ];
  34. }
  35. }

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Afficher un menu dans le code

Dans le contrôleur / Bloc...

  1. /** @var \Drupal\Core\Menu\MenuLinkTree $menu_tree_service */
  2. $menu_tree_service = \Drupal::service('menu.link_tree');
  3. $menu_parameters = new \Drupal\Core\Menu\MenuTreeParameters();
  4. $menu_parameters->setMaxDepth(1); // Profondeur du menu à afficher
  5. $menu_name = 'footer' // Nom machine du menu à afficher
  6. $menus = [
  7. 'footer' => $menu_tree_service->build($menu_tree_service->load($menu_name, $menu_parameters)),
  8. ];
  9. return [
  10. '#theme' => 'page-404',
  11. '#menus' => $menus,
  12. ];

et tout simplement dans notre template :

<span class="br0">{</span><span class="br0">{</span> <span class="re0">menus</span><span class="re1">.footer</span> <span class="br0">}</span><span class="br0">}</span>

 

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Créer la traduction d'une chaine de caractère dans le code

Dans un processus de déploiement, il est utile de gérer les traductions de chaînes de caractères dans le code, afin de pouvoir les déployer plus facilement.

Exemple avec cette fonction d'update à adapter en fonction de vos besoins :

  1. /**
  2.  * Création d'une traduction
  3.  */
  4. function mespronos_tweaks_update_8005() {
  5. $chaine = 'Forgotten password';
  6. $traduction = 'Mot de passe oublié';
  7. $storage = \Drupal::service('locale.storage');
  8. $string = $storage->findString(['source' => $chaine]);
  9. if ($string === NULL) {
  10. $string = new \Drupal\locale\SourceString();
  11. $string->setString($chaine);
  12. $string->setStorage($storage);
  13. $string->save();
  14. }
  15.  
  16. $translation = $storage->createTranslation(array(
  17. 'lid' => $string->lid,
  18. 'language' => 'fr',
  19. 'translation' => $traduction,
  20. ))->save();
  21. }

Pour un exemple réel, il sera plus pratique de passer par un tableau associatif (à deux dimensions si l'on veut importer plusieurs langues) qui sera parcouru par un ou deux foreach.

Par admin

Faille de sécurité février 2019 - PSA-2019-02-19

Nous venons d'apprendre par l'équipe de sécurité de Drupal qu'une nouvelle version de notre CMS sera disponible demain, mercredi 20 février entre 19H et 23H (heure de Paris).

Cette version corrige un problème « critique » de sécurité du noyau de Drupal impactant la version 8.

Évidement pas beaucoup d'informations pour l'instant, il faudra attendre que le patch soit disponible afin d'en savoir plus.

Ce que l'on sait pour l'instant

  • Les versions 8.5.x et 8.6.x de Drupal seront patchées.
  • Rien n'indique que les version 8.4.x, 8.3.x... ne sont pas impactées, mais elles ne sont plus maintenues. Si vous avez encore des sites sous ces versions, faites vite les mises à jour vers drupal 8.5.x ou 8.6.x
  • Il semblerait que des modules tiers drupal 8 soient aussi impactés, les informations seront disponibles en même temps que le patch.
  • Drupal 7 ne semble pas impacté...
  • ...Mais il est possible que des modules tiers drupal 7 le soient, l'équipe de sécurité n'est par contre pas en mesure de fournir une liste pour le moment.

Que faire avant la mise à disposition du patch ?

  • Si vous ne gérez pas votre site drupal vous-même : rapprochez-vous de votre prestataire afin de vous assurer qu'il est bien au courant et qu'il pourra appliquer le patch de sécurité au plus tôt.
  • Assurez-vous que vous avez bien la dernière version de votre drupal 8 à jour.
  • Une petite sauvegarde ne peut pas faire de mal
  • Suivez le compte twitter de l'association (@drupalfr), où nous vous fournirons toutes les informations le plus rapidement possible

Retrouvez sur le site drupal.org l'annonce de ce correctif (Anglais) : https://www.drupal.org/psa-2019-02-19

Version de Drupal : 
En page d'accueil : 

Une usine à sites Drupal avec Micro site

J'ai eu le plaisir de présenter le module Micro Site qui permet de mettre en place une usine à sites sur Drupal 8 lors du dernier DrupalCamp Paris 2019. Ce billet a pour objet de mettre à disposition le contenu de la présentation pour ceux intéressés, et de compléter cette présentation par quelques éléments supplémentaires post-conférence. Et bien entendu pour remercier et féliciter comme il se doit les organisateurs sans qui cet événement n'aura pas pu avoir lieu.

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Créer un filtre de texte

À la demande d'un client je devais ajouter un attribut « target="_blank" » sur tous les liens sortant du site.

J'ai pour cela créé un filtre de texte que j'ai appliqué à un format de texte.

Voici le fichier mon_module/src/Plugin/Filter/UrlStupidTargetBlankFilter.php

  1. namespace Drupal\mon_module\Plugin\Filter;
  2.  
  3. use Drupal\filter\FilterProcessResult;
  4. use Drupal\filter\Plugin\FilterBase;
  5.  
  6. /**
  7.  * @Filter(
  8.  * id = "url_stupid_target_blank_filter",
  9.  * title = @Translation("Url Target Blank"),
  10.  * description = @Translation("Add « target=_blank » to all urls"),
  11.  * type = Drupal\filter\Plugin\FilterInterface::TYPE_TRANSFORM_IRREVERSIBLE,
  12.  * )
  13.  */
  14. class UrlStupidTargetBlankFilter extends FilterBase {
  15.  
  16. public function process($text, $langcode) {
  17. $regex = "/(\\b[^]*href=['\"]?http[^]+)>/is";
  18. $subst = "$1 target=\"_blank\" rel=\"noopener\">";
  19. $result = preg_replace($regex, $subst, $text);
  20. return new FilterProcessResult($result);
  21. }
  22. }

À noter : j'ai aussi ajouté l'attribut rel="noopener" comme suggéré par Simon Georges.

Par lequipe.tech
L'Équipe.tech

Session DrupalCamp Paris 2019 - Les bonnes pratiques sous Drupal 8

Session DrupalCamp Paris 2019 - Les bonnes pratiques sous Drupal 8 Work harderFabien CLÉMENT
lun 18/02/2019 - 13:43

Lors du DrupalCamp 2019 qui à eu lieu à Paris le week-end dernier (du 15 au 17 février 2019) à L'Espace Saint Martin, j'ai eu le plaisir de monter sur les planches pour vous parler des bonnes pratiques de développement sous Drupal 8.

En tout, une vingtaine de règles, même si d'autres pourraient s'ajouter. Dès les échanges suivant cette présentation, d'autres points me sont revenus, ce qui pourrait finalement faire l'objet d'un billet de blog à compléter au fur et à mesure.

Catégorie
Par lequipe.tech
L'Équipe.tech

Session DrupalCamp Paris 2019 - Les bonnes pratiques sous Drupal 8

Lors du DrupalCamp 2019 qui à eu lieu à Paris le week-end dernier (du 15 au 17 février 2019) à L'Espace Saint Martin, j'ai eu le plaisir de monter sur les planches pour vous parler des bonnes pratiques de développement sous Drupal 8.

En tout, une vingtaine de règles, même si d'autres pourraient s'ajouter. Dès les échanges suivant cette présentation, d'autres points me sont revenus, ce qui pourrait finalement faire l'objet d'un billet de blog à compléter au fur et à mesure.

En attendant, et en attendant un billet de retour de l'événement, vous trouverez à la suite de ce billet le support de ma présentation.

Et n'oubliez pas la Gibbs' Slap !

Par liber_t
Ines WALLON

Ré indexer Search API par le code

Ré indexer tout Search API 

use Drupal\search_api\Utility\CommandHelper; $command_helper = new CommandHelper(\Drupal::entityTypeManager(),

Drupalcamp Paris 2019

Le DrupalCamp se tiendra cette année les 15, 16 et 17 février 2019 à Paris. Cette conférence s'annonce riche en découverte et ceci pour tous les goûts et tous les profils. Pas moins de 3 types de conférence seront proposées, pour que chacun puisse tirer pleinement profit de ces trois journées selon ses besoins et son profil.

Par LaboRouge
Adhérent

Drupal Camp Paris 2019 : Audit de sécurité d'un site Drupal

J'aurais le plaisir de vous présenter ma conférence intitulé "Retour d’expérience : Audit de sécurité d'un site Drupal" dans le cadre du Drupal Camp Paris 2019 le 16 février prochain.

Suite au travail commencé sur ce billet de blog et qui avait pour but de vous présenter cet audit de sécurité, je me suis dit que cela mériterait directement une conférence.

J'y aborderais les problématiques soulevées par cet audit de sécurité et les solutions mises en place pour y répondre.


Conférence


Drupal

Par LaboRouge
Adhérent

Drupal Camp Paris 2019 : Audit de sécurité d'un site Drupal

J'aurais le plaisir de vous présenter ma conférence intitulé "Retour d’expérience : Audit de sécurité d'un site Drupal" dans le cadre du Drupal Camp Paris 2019 le 16 février prochain.

Suite au travail commencé sur ce billet de blog et qui avait pour but de vous présenter cet audit de sécurité, je me suis dit que cela mériterait directement une conférence.

J'y aborderais les problématiques soulevées par cet audit de sécurité et les solutions mises en place pour y répondre.


Conférence


Drupal

Par Artusamak
Julien Dubois

Drupalcamp Paris 2019 - Venez nous retrouver

Drupalcamp Paris 2019 - Venez nous retrouver
Artusamak
ven 08/02/2019 - 11:01

Retrouvez les experts Drupal d'Happyculture au Drupalcamp Paris 2019.

Corps

Du 15 au 17 février aura lieu l'édition 2019 du Drupalcamp national. La ville qui l'accueillera sera Paris.

Pour cette année, Happyculture sera bien représentée car tous nos experts Drupal y seront présents. Guillaume Bec y présentera une session sur le RGPD, Julien Dubois viendra témoigner aux côtés de Denis Pitzalis de la mise en œuvre de Drupal à l'UNESCO, Nicolas Meyer et Edouard Cunibil seront quant à eux probablement toujours à proximité des salles de sprint afin de corriger quelques bugs récalcitrants du cœur.

Nous avons le plaisir d'être les sponsors du café pour ces 3 jours de conférence. Vous pourrez donc rester éveillés grâce à nous !

N'hésitez pas à passer une tête pour saluer l'équipe, il reste des places disponibles. Jetez un œil au programme si vous ne l'avez pas encore fait.

Photo d'illustration : frank.meffert.photography CC 2.0 BY

Catégories
Drupal
Tags
rgpd
retour d'expérience

Créer un pied de page pour un micro site avec Drupal 8

Le module Micro Site permet de mettre en place une usine à site Drupal, depuis une seule instance Drupal 8, pour propulser une multitude de sites, de nature différente si besoin. Micro Site fournit une nouvelle entité de contenu permettant de personnaliser à volonté, avec les API disponibles sur Drupal 8, ces différents types de site, et modifier leur comportement selon les besoins métier. Détaillons comment nous pouvons procéder, au travers d'un exemple de base consistant à fournir un pied de page modulaire sur différents sites propulsés, et l'afficher sur toutes les pages pouvant constituer le site.

Pages