Blog

Ici nous vous tenons informés des prochains événements de la communauté Drupal et de notre veille !

Retour sur le DrupalCamp Paris 2019

Nono
21/02/2019
Les 15/16/17 février 2019 s’est déroulé le Drupal Camp Paris et l’ équipe AOWS était bien sur de la partie.
Photo de la Tour Eiffel au coucher du soleil

Les 15/16/17 février 2019 s’est déroulé le Drupal Camp Paris et l’ équipe AOWS était bien sur de la partie.

Bien que certains dans l'équipe aient arrêté de compter le nombre de DrupalCamps auxquels ils ont participé, c'était pour moi le 1er (après une petite Drupal Europe à Darmstadt).

Un DrupalCamp, c’est l’occasion de voir où en est l’état de l’art dans la communauté, et j’ai pu assister à 5 présentations business (dont deux des nôtres),

Les projets présentés représentent assez bien le coeur de cible de Drupal, à savoir :

  • des projets ambitieux,
  • avec des processus métiers complexes, nécessitant des adaptations custom.
  • souvent multisites, et/ou multilingues.

Et en la matière, nous n'avons pas à rougir des dernières réalisations que nous avons pu sortir .

Et c’est bien sûr l’occasion de pouvoir assister à des conférences s’adressant aux développeurs, et d’apprendre énormément. Pour les curieux qui seraient intéressés par un bref résumé des conférences, un framapad de prises de notes collaboratives existe : https://paris2019.drupal.fr/programme/prise-de-notes-collaboratives

Je recommande d’ailleurs la lecture du compte rendu de deux présentations pour ceux qui sont comme moi en train de progresser dans Drupal :

  • Audit de sécurité d'un site Drupal
  • Drupal 8 - Best practices

Mais s’il ne devait en rester qu’une, LA présentation que je retiendrai c’est celle de Floris Moriceau

https://paris2019.drupal.fr/programme/sessions/economiser-du-temps-dintegration-dans-vos-projets-drupal

Une histoire tragique d’intégration d’un site drupal qui tourne mal, inspiré de faits réels.

  • Des maquettes construites sous photoshop et pas du tout conçues pour être responsives (colonnage plus qu'hasardeux).
  • Maquettes qui seront ensuite validées par le client, sans que l’équipe technique n'ait son mot à dire.
  • Et en plus qui seront validées, alors que le périmètre fonctionnel (ce qui sera développé) sera différent (X features en moins).
  • L'UX designeur n'a aucune connaissance des contraintes technique du CMS. Parmi les nombreuses conséquences que cela va engendrer, il y a notamment la prise en compte du principe des "régions" d'un thème, et suivant l'affichage mobile ou desktop, d'essayer d'afficher les informations aux même endroits (un block en sidebar, qui se retrouverait dans le header par exemple).
  • En plus d'être affichées dans des endroits différents, les informations en mobile sont différentes de celles en desktop, sans raison particulière.
  • Et les maquettes pour mobiles arriveront quand on est déjà en train de faire l'intégration. Bref le site est "mobile-last".
  • Des créa de pages de contenu avec un lorem ipsum qui ne dépasse jamais.
  • Les fonts, sur psd chargées en 6 variantes, en vrai c'est pas terrible.
  • Un thème de base  bien connu est choisi sans que le themeur ait son mot à dire (par exemple le tristement célèbre thème boostrap drupal). Thème de base qui sera très difficile à surcharger et rallongera considérablement le temps d'intégration, plutôt que de partir ex-nihilo.
  • Les maquettes en psd sont ensuite recréées directement en page html/css. Et c'est aux devs à faire rentrer ensuite le "vrai" site dans l'intégration. D'après Floris, c'est à minima rallonger le temps d'intégration par 1.5. D'après moi, et pour l'avoir vécu, c'est plutôt multiplié par 3.
  • Le multilingue => Pas de maquettes en plusieurs langues. Alors que certaines polices d’écriture n'ont pas des caractères spéciaux, que certaines langues sont plus verbeuses et peuvent casser la navigation. Et que certaines langues se lisent de droite à gauche. Vous vous rendrez compte de tout ceci pendant la recette évidemment.
  • En pleine recette avant livraison, un audit SEO met en évidence une hiérarchie de titrage calamiteuse (conditionnelle suivant les pages, et incohérente en général). Mais le site est déjà developpé et intégré, et la charge prévue a depuis longtemps été dépassée.
  • Afin de répondre aux diverses contraintes évoqués plus haut, vous avez (ab)user de hooks, de preprocess, de scripts JS custom, etc. C'est un peu comme faire de la chirurgie (pas très) esthétique et de découper une personne pour la faire rentrer dans une taille donnée d'habits.
  • La conséquence directe de ce découpage bizarroïde, c'est que le site est devenu lent.

J’abonde en tout cas dans le sens de la conclusion :

"Il faut qu’il y ai un échange permanent entre le designer et le themer Drupal AVANT la validation des maquettes par le client. Cela n'empêchera en rien à ce que les maquettes vendent du rêve, de l'émotion, de racontez une user story dynamique et authentique , etc."

Et ca tombe bien, cette année nous allons ouvrir le recrutement pour un thémeur et un UX designer, afin d’internaliser ces compétences et d’avoir une meilleure synergie avec les « devs ».

Comment éviter des field_collection vides

jcisio
12/02/2015
Quand on utilise field_collection, dans certain cas, le dernier item d'un champ est vide (une entité field_collection est créée sans aucune donnée utile). Pour contourner ce problème, le module fournit un hook hook_field_collection_is_empty_alter() pour décider quand est-ce un item est vide.

Quand on utilise field_collection, dans certain cas, le dernier item d'un champ est vide (une entité field_collection est créée sans aucune donnée utile). Pour contourner ce problème, le module fournit un hook hook_field_collection_is_empty_alter() pour décider quand est-ce un item est vide.

Exemple :

 

/**
 * Implements hook_field_collection_is_empty_alter().
 */

function magnard_fiche_livre_field_collection_is_empty_alter(&$is_empty, FieldCollectionItemEntity $item) { if ($item->field_name == 'field_produit_auteurs' && empty($item->field_produit_auteur[LANGUAGE_NONE])) { $is_empty = TRUE; } }

 

 

Ce morceau de code évite de la création d'une field_collection field_produit_auteurs si elle n'a pas son champ field_produit_auteur (sans "s") rempli.

Gérer proprement vos modules

jcisio
29/09/2013
Dans cet article, je présente une approche pour ranger les fonctions dans votre module en utilisant la programmation orientée objet (OOP). Cela n'a par contre rien à voir avec Drupal 8.

Dans cet article, je présente une approche pour ranger les fonctions dans votre module en utilisant la programmation orientée objet (OOP). Cela n'a par contre rien à voir avec Drupal 8.

Traditionnellement, dans un module, toutes les fonctions sont préfixées par le nom du module et présente dans le fichier ton_module.module. Ça fait un gros fichier ! Même si Dries a dit qu'il ne voyait pas de problème avec un fichier .module de 100 Ko, aujourd'hui on a la tendance de faire des petits fichiers ton_module.*.inc, chacun a une responsabilité unique. Pour utiliser une fonction dans ces fichier :

  • soit on met une require_once au début du fichier .module ;
  • soit on chaque fois on a besoin d'une fonction, on commence par module_load_include() ;
  • soit on charge le fichier automatiquement (le cas avec hook_menu(), hook_theme() etc.).

Si vous travaillez avec Drupal depuis un peu de temps, vous devriez connaître tout cela. Mais si on veut aller plus loin, on peut mettre les fonctions dans des classes sous forme des méthodes statiques. Les avantages sont :

  • autoload de toutes les classes ;
  • et l'utilisation propre de l'espace de nom.

Pour l'autoload, vous pouvez mettre classiquement les fichiers dans le .info dans les lignes files[] = ..., ou bien vous écrivez votre propre class loader si vous êtes trop paresseux pour modifier les fichiers .info, sinon vous pouvez en récupérer un avec Google.

Pour l'espace de nom, ce n'est pas forcément la vraie nouvelle fonctionalité du PHP 5.3 (car il arrive que vous utilisez encore la version 5.2), mais le nom de classe. Vous n'avez pas besoin de préfixer les méthodes dans vos classes. Votre intélligent IDE (vim l'est aussi) pourra avoir des suggestions plus pertinentes. Exemple : vous travaillez sur un projet "vous", avec 20 modules "vous_module1", "vous_module2"..., dans chaque module vous avez des fonctions vous_module1_fonction1, vous_module1_fonction2... et vous tapez "vous" votre IDE va suggérer 10 fonctions qui sont tous dans le premier module vous_module1. Pas très pertinent. Avec les classes séparées, votre IDE présente d'abord des classes, puis les méthodes quand vous complétez le nom de classe. Plus pratique !

Les méthodes enveloppées dans des classes ne pollue pas le scope global, elles aident aussi pour le refactoring ou le protypage ou le test. Mais l'article est trop long, donc j'arrête. Quand même, avant, pour l'info, ce paradigme est utilisé récemment dans Drupal 7 avec la classe FieldInfo (par yched et al.) et c'est très bien. Il n'y a alors pas de raison pour ne pas l'utiliser.

PS : un article sans code, mais allo quoi.

ton_module.inc

function ton_module_faire_1() {} function ton_module_faire_2() {}

sera :

TonModule.php

class TonModule { public static function faire_1() {} public static function faire_2() {} }