Planète

Par Christophe MOLLET
Christophe Mollet

Mise à jour de site Drupal : bien s'y prendre

Drupal sort régulièrement de nouvelles mises à jour de manière à faire face aux évolutions technologiques. À cet effet, nous allons ainsi voir dans cet article pourquoi il est important de les effectuer et ce que cela engendrera sur vos plateformes. Nous vous présenterons également les différentes solutions qui s'offrent à vous pour les mettre à jour.

Par Christophe MOLLET
Christophe Mollet

Drupal, un CMS pensé pour les spécialistes du marketing

L'architecture proposée par Drupal permet de proposer à votre équipe marketing une interface assez conviviale et intuitive pour faciliter leur prise en main. Par ailleurs, sa structure permet d'interconnecter plusieurs outils entre eux, de manière à créer un écosystème durable et performant. Cela vous permet ainsi d'unifier l'ensemble des points de contact entre vous et votre équipe de manière à faciliter la gestion et la diffusion de contenus.

Par Christophe MOLLET
Christophe Mollet

Comment optimiser la performance d'un site Drupal ?

Un site aux performances web élevées impactera grandement votre position dans les résultats des moteurs de recherche. Celui-ci contribuera également à améliorer l'expérience utilisateur, ce qui vous permettra d'améliorer votre taux de conversion et diminuer votre taux de rebond.

Par kgaut
Kevin Gautreau

Drupal - Scanner un dossier récursivement

Voici comment scanner un dossier récursivement et récupérer tableau de fichiers correspondant à une expression régulière :

ici je récupère tous les fichiers .xml dans le dossier private://sms

$fileSystem = \Drupal::service('file_system');
$items = $fileSystem->scanDirectory('private://sms', '/xml$/');

 

Par Christophe MOLLET
Christophe Mollet

Quelles sont les nouveautés apportées par Drupal 9.5 ?

Drupal 9.5 est la nouvelle mise à jour de Drupal 9. Contenant la majorité des fonctionnalités de Drupal 10, cette nouvelle version permet de faire face aux perspectives annoncées par la communauté Drupal et s’inscrit dans une démarche d’offrir à ses utilisateurs plus de performance, de sécurité et de robustesse. 

Par Iloofo
Iloofo

Contribution : Module Lazy service, un peu plus de paresse dans votre Drupal

Comme il a été évoqué dans le billet de retour de la SymfonyCon, à chaque fois que j'ajoute une injection de dépendance pour un service qui ne sera utilisé qu'une fois au sein de mon service, de mon controller ou autre, ça me défrise.

Pourquoi ne peut-on pas simplement dire que l'on a besoin de ce service, mais qu'il ne soit chargé qu'à la demande ?

Puis j'assiste à la conférence Unleashing the power of lazy objects in PHP de Nicolas Grekas qui présente son travail fait sur le lazy loading des services. Ce qui défile dans ma tête à ce moment :

- Comment l'intégrer à Drupal ?

- Quand sera t'il intégré a Drupal ?

- Mince, ce qu'il présente n'est pas encore complètement publié... je ne suis pas prêt de le voir dans Drupal :(

Ça reste dans ma tête, ça tourne et re-tourne...

Et si ?

Je n'en peux plus, le concept n'est pas si compliqué après tout... J'ouvre le capot de mon Drupal...

Bon point

Bon point, on n'est pas en retard, Drupal dispose déjà de la possibilité de déclarer un service comme étant paresseux (lazy). Il faut simplement rajouter à la déclaration du service l'option "lazy: true" et générer son ProxyClass. On n'est pas à 100% aligné sur le fonctionnement simplifié de Symfony et de ses annotations, mais c'est pas si mal.

Il faut quand même lancer un script manuellement pour générer la classe ProxyClass dans le répertoire du module où se situe le service en question.

Mais pas en avance

On est donc au même état que Symfony actuellement. On sait déclarer un service en tant que "lazy", mais on ne peut pas, depuis un service, dire que l'on veut injecter, en lazy, un service qui n'était pas prévu pour l'être.

On est cuit alors ? Rendez-vous en 2030 ?

Si on devait forcément passer par une mise à jour du coeur de Drupal pour intégrer cette fonctionnalité, certainement !

Je suis mauvaise langue, une telle fonctionnalité pourrait certainement arriver plus tôt, mais dans quelle version de Drupal ? 10 ? 11 ?...

Sauf qu'on a de la chance, Drupal nous donne les leviers nécessaires pour faire ça sous forme de modules contrib. On va donc pouvoir proposer la fonctionnalité tranquillement sous forme de module communautaire, et en parallèle pousser la fonctionnalité dans le coeur.

Oui mais quand ?

Il reste encore du travail, mais le code est déjà disponible. Reste à l'améliorer, écrire les tests, la documentation, ouvrir le ticket pour intégration au coeur de Drupal etc.

En attendant, le module en tant que proof of concept existe, fonctionne sur les quelques tests effectués et va pouvoir faire avancer le sujet.

Ce que l'on doit faire en tant que développeur :

On déclare un service comme étant un service à charger en lazy en préfixant son nom lors de l'injection de dépendance par "lazy.". Exemple pour le service "messenger" : "lazy.messenger".

Ce que le module fait alors :

Le module vient modifier la liste des services pour générer à la volée si elle n'existe pas la proxyClass correspondante, et finit de déclarer correctement le service.

Je vous invite donc à jeter un oeil et participer, le module Lazy service pour Drupal c'est par là.

Par kgaut
Kevin Gautreau

Drupal - ajouter une action personnalisée dans une liste d'opérations sur des entités

Les liens d'opérations sont les liens contenus dans le menu déroulant sur les listing dans drupal

Image

Liens d'opérations

 Il est possible d'en ajouter via le hook HOOK_entity_operation_alter :
 

function mon_module_entity_operation_alter(array &$operations, EntityInterface $entity) {
  $entityTypeId = $entity->getEntityTypeId();
  if ($entityTypeId !== 'group') {
    return;
  }
  $link = \Drupal\Core\Url::fromRoute('mon_module.user_group_import', ['group' => $entity->id()]);
  $operations['import_members'] = array(
    'title' => t('Importer des membres'),
    'weight' => 20,
    'url' => $link,
  );
}

 

Par kgaut
Kevin Gautreau

Drupal 9 - ouvrir un lien dans une fenêtre modale

Dans drupal 9, via la librairie jquery UI Dialog, Il est possible très facilement d'ouvrir des pages dans des fenêtres modales (ou « popin », « Lightbox »...) Dans votre contrôleur :

# On attache la librairie nécessaire
$build['#attached']['library'][] = 'core/drupal.dialog';

# On défini notre lien
$build['link'] = [
  'title' => $this->t("Contacter l'annonceur"),
  'url' => \Drupal\Core\Url::fromRoute('ma_page'),
  'attributes' => [
    'class' => ['use-ajax'],
    'data-dialog-type' => 'modal',
    'data-dialog-options' => Json::encode([
      'width' => 400,
    ]),
  ],
];

 

Voir toutes les options qu'il est possible d'utiliser : https://jqueryui.com/dialog/#content

Pour faire la même chose directement dans un template twig :

{# on ajoute la librairie nécessaire #}
{{ attach_library('core/drupal.dialog')}}


{# Lien à ouvrir dans une modale #}
<a class="use-ajax" data-dialog-type="modal" data-dialog-options="{&quot;width&quot;:400}" href="{{ path('ma_page') }}">{{ "Contacter l'annonceur" }}</a>

 

Par kgaut
Kevin Gautreau

Drupal 9 - Désactiver un bloc pour une page spécifique

Drupal propose un mécanisme en backoffice pour contrôler l'affichage des blocs, mais il est nécessaire parfois de mettre en place une logique un peu plus complexe.

Ici nous allons masquer le block "pagetitleblock_content" de la région "header" quand on est sur un nœud de type « petite_annonce » via le hook HOOK_preprocess_page :

function petites_annonces_preprocess_page(&$vars) {
  if(($node = \Drupal::routeMatch()->getParameter('node')) && $node->bundle() === 'petite_annonce') {
    if (isset($vars['page']['header']['pagetitleblock_content'])) {
      unset($vars['page']['header']['pagetitleblock_content']);
    }
  }
}

 

Créer une méthode de livraison avec Drupal commerce 2

Drupal commerce fournit en standard plusieurs méthodes de livraison que nous pouvons conditionner selon différents critères (montant de la commande, profil client, type de commande, Poids de la commande, Type de produit, etc.). Pour des besoins spécifiques, nous pouvons ajouter une méthode de livraison sur mesure qui peut alors se charger d'effectuer les calculs nécessaires à la détermination du coût de la livraison.

Pages