Articles de l'utilisateur

Par juliendubreuil
julien dubreuil
Drupal since 2009

6 conseils pour savoir si Drupal est fait pour votre futur projet

Drupal est un très bon outil, il est réputé, modulable et est utilisé par beaucoup d’entreprises et organisations. J’ai eu la chance de participer à beaucoup de projets ces 5 dernières années, et j’ai pu constater à quel point on pouvait en user et en abuser.
La réalisation d’un projet web est un subtil dosage entre les contraintes métiers et les contraintes de l’outil.
La flexibilité de Drupal conduit malheureusement parfois à vouloir trop l’adapter et à le tordre pour répondre au besoin tout en espérant que cela n’aura pas d’impact. Un outil reste un outil, c’est pourquoi dans ce post, j’essaie de vous donner quelques pistes afin que vous puissiez définir si oui ou non Drupal est un bon choix pour votre projet.

Quels sont les besoins métiers que vous devez réaliser ?

Avant de savoir si Drupal est fait pour vous, il est important de comprendre ce qui doit être fait. Trop souvent j’ai vu des entreprises se ruer sur le choix de la technologie avant d’avoir pleinement défini les problèmes à résoudre. Définissez ce que vous avez besoin de faire, ce que votre client veut, les problématiques métiers à résoudre et ce que les utilisateurs finaux attendent.

Le diable se cache dans les détails, ne vous contentez pas simplement d’une petit phrase expliquant ce qui doit être fait. Voici un exemple client que j’ai rencontré : « L’outil doit fournir un système de modération des contenus ». Rien de terrifiant en soi, néanmoins de la simple checkbox, au workflow complexe avec validation et rôle utilisateur, il existe des dizaines de solutions pour implémenter cela. Il est donc important que vous définissiez comment les choses doivent fonctionner et non pas simplement ce qu’elles doivent faire pour pouvoir évaluer si l’outil est adapté.

Est-ce que vous devez faire du E-commerce, Gérer des milliers de contenus, une disponibilité proche des 100% ou constuire une application affichant des données en temps réel ? C’est autant de questions que vous devez vous poser.

Quelle est la part du projet qui est réalisée nativement ?

Drupal dispose d’un coeur minimaliste qu’il est possible d’étendre avec ce que l’on appelle des modules. Ainsi, si votre besoin n’est pas natif, il existe surement dans un module. Avec le nombre de projets réalisés sous Drupal, il y a fort à parier que quelqu’un a déjà rencontré le même besoin et qu’il ait avec un peu de chance créé un module sur drupal.org.
Pour savoir si Drupal est fait pour vous, vous devez apprendre à le connaitre, découvrir ses forces et ses faiblesses. Arpenter la liste de modules afin de trouver ceux qui vous conviennent le mieux, inspecter le coeur pour savoir ce qu’il s’y cache.
Bien souvent un module réalise entre 60 et 80% de ce que vous souhaitez faire, ne négligez surtout pas la part manquante à réaliser. Ajouter un besoin supplémentaire à un module existant sans le hacker ou l’ endommager n’est pas toujours une mince affaire. Attention toutefois, certains modules nécessitent d’autres modules pour fonctionner et certains modules ne sont pas compatibles entre eux. N’hésitez pas à lire : [comment choisir un module Drupal en seulement 5 étapes]. De même que, si vous n’avez pas besoin de l’améliorer ou de le modifier, il y aura toujours une part de « Glue code », permettant de l’intégrer pleinement à votre site à estimer.

Avez-vous une idée de la part de sur-mesure à réaliser ?

Drupal est développé en PHP et est facilement extensible par le biais de modules. En utilisant les forces du langage on peut développer ce que l’on veut et ainsi le transformer en n’importe quoi. Pour la petite anecdote, il m’est arrivé par le passé de déconseiller l’utilisation de Drupal à un client. L’équipe technique a fait le choix de ne pas suivre mon conseil et a choisi d’adapter Drupal au besoin. Résultat, le développement du projet a été un fiasco complet, problème de performance, code spaghetti et retard de livraison pour finalement tout arrêter et repartir sur un framework comme je l’avais préconisé quelques mois avant. La leçon à retenir est que si la part des développements sur-mesure à faire est trop grande par rapport aux avantages de l’outil, il faut prendre conscience que ce n’est certainement pas le meilleur choix pour vous.

Vous devez donc comprendre et estimer ce qui relève du natif, ce qui peut être réalisé facilement grâce à un module et ce qui approche les limites de l’outil (limites de performances, de maintenabilités, d’architectures…).

Est-ce que votre équipe maitrise Drupal ou pas ?

Depuis longtemps maintenant, il est admis que la courbe d’apprentissage de Drupal (en comparaison avec d’autres CMS) est longue. Il faut compter entre 1 et 3 mois pour qu’un développeur s’y retrouve facilement entre ce qui est fourni par le coeur de Drupal et ce qu’il est possible de faire grâce aux modules contribs. Prenez en compte le niveau d’expérience de votre équipe. N’hésitez pas à faire appel à un architecte ou à un lead dev (nb, l’auteur est freelance) pour vous épauler dans le cas où votre équipe serait novice.

A noter qu’il n’y a pas seulement l’équipe technique à prendre dans l’équation, il est important que les chefs de projet et product owner connaissent aussi l’outil.

Quel est votre budget ?

Et oui, il faut parler argent quand on parle de projet Drupal. Même s’il n’y pas de coût de licence, vous aurez d’autres coût auxquels il faudra faire face. Côté infrastructure, Drupal est assez gourmand, il vous faudra donc un hébergement de qualité et bien dimensionné. Coté développeurs c’est comme partout, les bons s’arrachent à prix d’or et sont souvent occupés des mois à l’avance. De plus, il y a plus d’offre que de demande, ce qui fait qu’il n’est pas toujours simple de constituer une équipe de qualité.

Quel est la taille de votre projet ?

Il faut être honnête, Drupal est conçu pour faire des gros sites et pas pour de simples sites vitrines. La robustesse de l’outil nécessite beaucoup de choses, du temps, des moyens, des connaissances. Or, je trouve que le retour sur investissement réalisé sur des petits projets n’est pas à la hauteur de ce qui pourrait être fait avec un wordpress par exemple.

Conclusion

Il n’existe pas de formule miracle pour déterminer si Drupal est un bon choix ou non pour un projet, cela dépend de plusieurs facteurs. A vous de mesurer les avantages et inconvénients entre le planning, le budget, l’engouement technologique, la motivation de l’équipe et leur capacité à apprendre.

Par juliendubreuil
julien dubreuil
Drupal since 2009

6 conseils pour savoir si Drupal est fait pour votre futur projet

Drupal est un très bon outil, il est réputé, modulable et est utilisé par beaucoup d’entreprises et organisations. J’ai eu la chance de participer à beaucoup de projets ces 5 dernières années, et j’ai pu constater à quel point on pouvait en user et en abuser.
La réalisation d’un projet web est un subtil dosage entre les contraintes métiers et les contraintes de l’outil.
La flexibilité de Drupal conduit malheureusement parfois à vouloir trop l’adapter et à le tordre pour répondre au besoin tout en espérant que cela n’aura pas d’impact. Un outil reste un outil, c’est pourquoi dans ce post, j’essaie de vous donner quelques pistes afin que vous puissiez définir si oui ou non Drupal est un bon choix pour votre projet.

Quels sont les besoins métiers que vous devez réaliser ?

Avant de savoir si Drupal est fait pour vous, il est important de comprendre ce qui doit être fait. Trop souvent j’ai vu des entreprises se ruer sur le choix de la technologie avant d’avoir pleinement défini les problèmes à résoudre. Définissez ce que vous avez besoin de faire, ce que votre client veut, les problématiques métiers à résoudre et ce que les utilisateurs finaux attendent.

Le diable se cache dans les détails, ne vous contentez pas simplement d’une petit phrase expliquant ce qui doit être fait. Voici un exemple client que j’ai rencontré : « L’outil doit fournir un système de modération des contenus ». Rien de terrifiant en soi, néanmoins de la simple checkbox, au workflow complexe avec validation et rôle utilisateur, il existe des dizaines de solutions pour implémenter cela. Il est donc important que vous définissiez comment les choses doivent fonctionner et non pas simplement ce qu’elles doivent faire pour pouvoir évaluer si l’outil est adapté.

Est-ce que vous devez faire du E-commerce, Gérer des milliers de contenus, une disponibilité proche des 100% ou constuire une application affichant des données en temps réel ? C’est autant de questions que vous devez vous poser.

Quelle est la part du projet qui est réalisée nativement ?

Drupal dispose d’un coeur minimaliste qu’il est possible d’étendre avec ce que l’on appelle des modules. Ainsi, si votre besoin n’est pas natif, il existe surement dans un module. Avec le nombre de projets réalisés sous Drupal, il y a fort à parier que quelqu’un a déjà rencontré le même besoin et qu’il ait avec un peu de chance créé un module sur drupal.org.
Pour savoir si Drupal est fait pour vous, vous devez apprendre à le connaitre, découvrir ses forces et ses faiblesses. Arpenter la liste de modules afin de trouver ceux qui vous conviennent le mieux, inspecter le coeur pour savoir ce qu’il s’y cache.
Bien souvent un module réalise entre 60 et 80% de ce que vous souhaitez faire, ne négligez surtout pas la part manquante à réaliser. Ajouter un besoin supplémentaire à un module existant sans le hacker ou l’ endommager n’est pas toujours une mince affaire. Attention toutefois, certains modules nécessitent d’autres modules pour fonctionner et certains modules ne sont pas compatibles entre eux. N’hésitez pas à lire : [comment choisir un module Drupal en seulement 5 étapes]. De même que, si vous n’avez pas besoin de l’améliorer ou de le modifier, il y aura toujours une part de « Glue code », permettant de l’intégrer pleinement à votre site à estimer.

Avez-vous une idée de la part de sur-mesure à réaliser ?

Drupal est développé en PHP et est facilement extensible par le biais de modules. En utilisant les forces du langage on peut développer ce que l’on veut et ainsi le transformer en n’importe quoi. Pour la petite anecdote, il m’est arrivé par le passé de déconseiller l’utilisation de Drupal à un client. L’équipe technique a fait le choix de ne pas suivre mon conseil et a choisi d’adapter Drupal au besoin. Résultat, le développement du projet a été un fiasco complet, problème de performance, code spaghetti et retard de livraison pour finalement tout arrêter et repartir sur un framework comme je l’avais préconisé quelques mois avant. La leçon à retenir est que si la part des développements sur-mesure à faire est trop grande par rapport aux avantages de l’outil, il faut prendre conscience que ce n’est certainement pas le meilleur choix pour vous.

Vous devez donc comprendre et estimer ce qui relève du natif, ce qui peut être réalisé facilement grâce à un module et ce qui approche les limites de l’outil (limites de performances, de maintenabilités, d’architectures…).

Est-ce que votre équipe maitrise Drupal ou pas ?

Depuis longtemps maintenant, il est admis que la courbe d’apprentissage de Drupal (en comparaison avec d’autres CMS) est longue. Il faut compter entre 1 et 3 mois pour qu’un développeur s’y retrouve facilement entre ce qui est fourni par le coeur de Drupal et ce qu’il est possible de faire grâce aux modules contribs. Prenez en compte le niveau d’expérience de votre équipe. N’hésitez pas à faire appel à un architecte ou à un lead dev (nb, l’auteur est freelance) pour vous épauler dans le cas où votre équipe serait novice.

A noter qu’il n’y a pas seulement l’équipe technique à prendre dans l’équation, il est important que les chefs de projet et product owner connaissent aussi l’outil.

Quel est votre budget ?

Et oui, il faut parler argent quand on parle de projet Drupal. Même s’il n’y pas de coût de licence, vous aurez d’autres coût auxquels il faudra faire face. Côté infrastructure, Drupal est assez gourmand, il vous faudra donc un hébergement de qualité et bien dimensionné. Coté développeurs c’est comme partout, les bons s’arrachent à prix d’or et sont souvent occupés des mois à l’avance. De plus, il y a plus d’offre que de demande, ce qui fait qu’il n’est pas toujours simple de constituer une équipe de qualité.

Quel est la taille de votre projet ?

Il faut être honnête, Drupal est conçu pour faire des gros sites et pas pour de simples sites vitrines. La robustesse de l’outil nécessite beaucoup de choses, du temps, des moyens, des connaissances. Or, je trouve que le retour sur investissement réalisé sur des petits projets n’est pas à la hauteur de ce qui pourrait être fait avec un wordpress par exemple.

Conclusion

Il n’existe pas de formule miracle pour déterminer si Drupal est un bon choix ou non pour un projet, cela dépend de plusieurs facteurs. A vous de mesurer les avantages et inconvénients entre le planning, le budget, l’engouement technologique, la motivation de l’équipe et leur capacité à apprendre.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Définissez une langue système pour traduire proprement Drupal

Préparez Drupal pour la traduction

L’un des avantages majeurs à utiliser Drupal est de bénéficier d’un système de traduction avancé. En effet, avec l’ajout de quelques modules il devient facile de traduire contenus et interfaces. La langue par défaut que vous avez choisie lors de l’installation servira alors de base lors de la création des différentes entités sur votre site.

Néanmoins il existe une faiblesse dans le système. Drupal n’attribue pas de nom machine pour une chaine de caractères disponible pour la traduction et ne fait que faire le mapping entre la valeur de la chaine et de potentielles traductions. Cela a pour conséquence que lorsque vous changez la valeur de la chaine de caractères, Drupal n’est plus capable de faire le lien et votre traduction ne sert plus à rien.

Pour éviter cela, l’idée est d’installer votre site en Anglais et de se servir de cette langue comme langue système, puis d’ajouter d’autres langues pour traduire votre site. Ainsi si vous avez besoin de traduire votre site en Anglais, vous aurez deux langues Anglaises sur votre site, une pour le système et une pour vos utilisateurs.

Il m’arrive souvent, pendant la phase de développement d’un site, que le wording ne soit pas validé. Le choix cornélien de devoir appeler un bouton « Acheter » ou « sors ta CB » est long. L’autre avantage d’utiliser une langue système est que vous pouvez vous passer de cela, plus besoin d’attendre le label parfait pour CTA. Vous aurez simplement à traduire cette valeur lors de la phase de traduction.

Voici donc en 8 étapes comment configurer l’anglais par défaut comme langue système et ajouter d’autres langues (même de l’Anglais) comme traduction.

  1. Rendez-vous sur la page des modules et activez le module Locale.

  2. Une fois installé, rendez-vous sur la page d’administration des langues (/admin/config/regional/language).

  3. Cliquez sur le lien edit pour la langue Anglais. Ajoutez un path prefix “en-sys” et sauvegardez. Cette langue nous servira de langue système

  4. Une fois redirigé sur l’interface d’administration des langues cliquez sur le lien en haut Add a language.

  5. Dépliez le fieldset Custom language (oui c’est bien caché) et renseignez la configuration suivante. Cette langue sera l’anglais qui sera affiché à vos visiteurs.

    • language name = English customized
    • Native language code = English
    • Path prefix = en
    • Direction = left to right
  6. Ajoutez la langue FR à la liste des langues. Dans le cas où le Français sera la langue par défaut de votre site vous pouvez supprimer le “path prefix” dans les options de configuration de la langue FR.

  7. Activez les langues “French” et “English customized”, désactivez la langue “English” par défaut et cochez la le Français comme langue par défaut.

  8. Rendez-vous sur la page de détection des langues (/admin/config/regional/language/configure) et activez le mode de détection par “url”.

A ce stade il ne vous reste alors plus qu’à traduire les éléments d’interfaces en Français et en Anglais.

L’intérêt de cette solution est de permettre à la fois de traduire l’anglais par défaut et de ne pas se préoccuper de la traduction pendant le développement.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupal 8, la métamorphose du CMS

Drupal 8, la métamorphose du CMS

C’est indéniable le web bouge et c’est certainement l’une des industries ou les outils évoluent aussi vite et sont aussi éphémères, ce qui est à la mode aujourd’hui ne le sera potentiellement plus demain. Le monde des CMS/CMF n’est pas épargné et subit son lot d’évolutions. Le problème n’est plus de savoir si telle ou telle fonctionnalité existe mais bel est bien de savoir si l’outil est capable de communiquer et de s’intégrer avec d’autres applications. Cette mutation du web a permis l’apparition de nouveaux usages tels que les SPA (single Page Application) ou MBaaS (Mobile Backend as a Service) dont le but est d’afficher des données dans un front web désolidarisé du backend.

Dans les articles précédents sur l’évolution des sites web et sur pourquoi Drupal 8 a subit une telle évolution Frédéric G. Marand et moi avons évoqué les applications orientées composants ou services. Par le passé, Drupal a prouvé qu’il était un excellent système de stockage de données et qu’il était capable d’exposer ces informations. Drupal 8 ira plus loin en intégrant cette capacité à s’associer de façon transparente avec d’autres applications externes à son coeur.

Drupal 8, l’impact sur les applications futures

L’application monolithique est un grand classique pour les projets réalisés avec Drupal, pour autant ce n’est pas parce qu’on peut tout faire avec que c’est une forcément une bonne idée. Est-ce que si votre boulanger se mettait à vendre des voitures et des outils de bricolage dans sa boutique vous ne trouveriez pas ça étrange ?

Comme l’a dit Frédéric, l’heure de gloire de la publication simple est derrière nous, aujourd’hui les attentes du marketing portent sur la personnalisation de l’expérience utilisateur en fonction des données acquises. Cela implique que les utilisateurs soient connectés et aient une identité persistante multisupport. On parle alors de session multi-device qui permet de reprendre la navigation ou encore vos achats là où vous en étiez et ce quel que soit le support.

Or lorsque Drupal fabrique ses pages pour un utilisateur connecté (pages générées à la volée et non chargées depuis le cache) cela consomme beaucoup de ressources. Il est rare de voir des pages de front web fabriquées avec moins de 50 requêtes SQL et autant de chargements de cache. Drupal est un outil performant pour la gestion de contenus néanmoins il n’est pas réputé pour ses performances d’affichage (cas pour un Drupal de base sans optimisation).

Ainsi la partie affichage à l’utilisateur final est susceptible d’être déplacé hors de Drupal en tant qu’application distincte basée sur des Javascript tels que AngularJs ou React afin de servir à la fois du web et du mobile qui ne cesse de grandir. C’est ce que l’on appelle le « headless Drupal ». Laissons à Drupal ce qu’il sait très bien faire, stocker et manipuler les données et déportons le front vers des technologies plus souple et plus rapide à mettre en place. Pour vous donner un exemple d’utilisation, on pourrait créer un B.O. unifié pour vos utilisateurs qui centraliserait vos contenus et vos produits puis différents sites web ayant chacun une thématique particulière qui viendraient consommer un webservice de façon à proposer des contenus ou produits à l’utilisateur.

Ainsi il faudra repenser Drupal comme un service de backend utilisé par des applications tiers qui consommeront des webservices pour servir l’expérience utilisateur, tout en gardant des temps de réponses performant grâce à la paralellisation.

Cette séparation entre le front et le back de l’application va nous offrir l’opportunité de raccourcir les cycles de développement et augmenter son efficacité tout en utilisant les dernières technologies et methodologies. La mutation de Drupal en API de contenus va permettre de réduire les problématiques multi-devices que l’on rencontre couramment.

Drupal 8 est à un point important de son évolution, ça passe où ça casse. Cette métamorphose à venir est de loin la plus grosse refonte qui ait été faite. Et vous, comment voyez-vous le futur des applications Drupal ? Comment comptez-vous vous y prendre ?

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupal 8, la refonte majeure

Drupal 8, la refonte majeure

Comme les Frameworks, Drupal a évolué tout au long de ces dernières années afin de suivre la demande et les tendances. Ces ajouts de fonctionnalités ont considérablement fait augmenter sa taille et complexifié l’outil. Toutefois, Drupal ne devrait plus être considéré comme un CMS mais comme un CMF (Content Management Framework). En fait c’est le cas depuis la version 4.7 avec l’apparition de CCK, la form API et views.

Pourquoi une telle refonte ?

Quand on regarde un peu sous le capot on s’aperçoit qu’il y a énormément de composants et librairies externes utilisés dans cette nouvelle version. Côté PHP pur, c’en est fini de la programmation procédurale qui rebutait tant de développeurs, aujourd’hui Drupal est pleinement orienté objet avec l’utilisation des Namespaces, des Traits et j’en passe. L’interopérabilité des composants a grandement été facilitée grâce aux standards du FIG avec PSR-4 (PSR-0), PSR-3 ainsi que Composer.

Non, Drupal n’a pas été réécrit en Symfony2, mais des composants SF2 ont été utilisés dans Drupal 8. D’ailleurs il existe aussi des composants provenants de Zend Framework comme le rappelle Frédéric G. Marand lors de notre présentation.

D8 aurait pu faire le même choix d’architecture qui a été fait pour Wordpress 4. C’est à dire, ne rien casser et ne faire que des évolutions axées sur la partie fonctionnelle et éditoriale. Or c’est une refonte en profondeur qui a été faite, en rupture totale avec les précédentes éditions. Le but a été de créer un framework Full-stack en n’écrivant que le minimum de code tout en réutilisant les meilleurs composants disponibles. C’est pour cela que des librairies de code telles que Twig, Guzzle ou encore EasyRDF ont été intégrées. Le gain de temps à ne pas maintenir ces composants pourra être utilisé efficacement à la conception du coeur de Drupal.

Le ton est donné, la volonté de cette nouvelle version est de se professionnaliser et de ne plus être vue comme une simple platforme de blog mais bel et bien comme un framework pour réaliser des applications.

Drupal 8, la baffe

Il ne faut pas se leurrer, cette nouvelle version va tout chambouler. Bien plus complexe que les précédentes, il va falloir apprendre de nouvelles choses et comprendre les nouveaux paradigmes et composants avant de se sentir efficace.
Néanmoins sur le long terme, cela permettra de créer du code plus maintenable, plus facile à faire évoluer et beaucoup plus simple à déployer.

N’attendez pas pour regarder de près ce qui se cache dans cette nouvelle version, les changements sont tellement nombreux et majeurs que cela peut prendre du temps avant d’être pleinement opérationnel avec les différents composants et librairies intégrés à Drupal 8.

Faut-il avoir peur de Drupal 8 ?

Non, même si l’on parle beaucoup du loup sans le voir, il n’est pas à craindre, bien au contraire. Bien sûr cela voudra dire de passer par une nouvelle phase d’apprentissage mais cela est courant pour tout développeur et je ne connais pas de bon dev qui refuse d’apprendre quelque chose de nouveau. Cette nouvelle version, si elle est utilisée comme composant d’une application va nous permettre de réaliser des applications plus maintenables et plus fun à réaliser. Peut-être que cela deviendra le backend privilégié pour les applications SF2.
Personnellement j’ai vraiment hâte de travailler sur des projets orientés services ou composants avec Drupal 8 de façon à pouvoir utiliser d’autres technologies bien plus performantes là où Drupal n’est pas adapté.

Références et articles sur le sujet :

Par juliendubreuil
julien dubreuil
Drupal since 2009

L’avenir des applications webs, des développeurs et des DSI

L’avenir des applications webs, des développeurs et des DSI

Il y a un mois de cela, lors de l’appel aux sessions pour Drupagora j’ai proposé plusieurs sujets en relation avec le thème de l’année qui était le E-commerce, malheureusement aucune session n’a passé la sélection. Néanmoins le comité de pilotage est revenu vers moi en me demandant de parler de l’avenir de Drupal, de l’impact sur le développement web et du futur des applications.

Dans ce sujet on ne peut plus vaste, qui touche à la fois à Drupal, aux technologies actuelles et à l’architecture logicielle j’ai souhaité ne pas uniquement donner mon point de vue et c’est pourquoi j’ai demandé à Frédéric G. Marand de co-animer cette session avec moi afin d’être le plus proche de la réalité. Difficile de trouver mieux comme co-présentateur en terme d’expérience et de contribution que ce soit dans la communauté Drupal ou ailleurs.

Nous avons donc passé quelques heures à confronter nos idées et points de vues afin de présenter notre vision du futur. Voici la synthèse de notre session résumée en quelques billets de blog :

La présentation de notre session :

Par juliendubreuil
julien dubreuil
Drupal since 2009

Liste des modules pour Drupal Commerce

Liste de module pour Drupal Commerce

Que vous soyez à la recherche d’un module pour un but précis, ou simplement à la recherche de nouvelles fonctionnalités pour votre site e-commerce il n’est pas simple de s’y retrouver dans tous ces modules. Ainsi chercher un module peu vite s’avérer long et fastidieux. Voici donc une petite liste de modules qui vous permettront de trouver votre chemin.

Comme avec le guide des modules pour Drupal 7, j’ai reparti les modules dédiés au e-commerce en différentes sections. Cette liste est une liste collaborative, ainsi, n’hésitez pas à commenter si vous trouvez des modules à ajouter !

E-commerce

Drupal Commerce est une suite de modules dédié au e-commerce qui s’est imposée sur Drupal.

Commerce VAT et Commerce EU VAT pour gérer les taxes en fonction du pays de votre client. Pensez à ne pas utiliser le module Taxe si vous utilisez ces deux modules. Ils sont bien maintenus et prennent en comptes les changements de lois.

Address book pour simplifier la vie de vos clients en leur permettant de créer un carnet d’adresse de façon ce qu’ils réutilisent leurs adresses dans le tunnel d’achat.

Shipping fourni un système de calcul de prix de frais de port. Ce module est un framework que vous devrez utiliser avec les modules de livraisons de votre transporteur préféré.

Commerce billy et Commerce billy mail pour générer des factures depuis votre site au format PDF afin que vos clients puissent les télécharger.

Commerce search api couplé à Search api vous permettra d’indexer les entités Drupal Commerce dans un moteur de recherche. Vous pourrez alors construire vos pages de catalogues robustes et performantes.

Search API ranges pour donner à vos visiteurs la possibilité de réduire les résultats entre deux prix.

Commerce backoffice afin d’avoir une meilleure expérience utilisateur dans la gestion et l’administration de votre boutique. Si vous avez déjà installé Commerce Kickstart v2 vous avez pu noter que le backoffice était plus beau que la version précédente et c’est principalement grâce à ce module.

Commerce reports permet aux marchands d’avoir une idée de ce qu’il se passe sur leur site. Ce module fourni un dashboard de statistiques sur l’évolution des commandes, clients…

Google analytics pour Commerce couplé à Google analytics vous permettra de traquer vos ventes en plus de vos statistiques de visites depuis le dashboard Google Analytics.

Cart and Checkout

Commerce checkout redirect redirige vos utilisateurs non connectés vers une page de création de compte ou de login avant de rentrer dans le tunnel d’achat. Notez que forcer les utilisateurs à créer un compte peut être source d’abandon de paniers.

Commerce checkout complete registration offre la possibilité aux clients de compléter le tunnel d’achat en anonyme et de créer un compte après le paiement s’ils le souhaitent.

Commerce checkout progress affichera dans votre checkout une barre en haut de la page de façon à indiquer à vos clients à quelle étape du checkout ils sont.

Commerce cart expiration permet de définir une durée de validité pour un panier. Par défaut les paniers n’ont pas de limite de validité, or il peut être intéressant d’en définir une de façon à faire un peu de ménage tous les 15 jours. Ce module vous permettra de supprimer les paniers selon vos critères. Pensez à avertir vos clients qu’ils ont laissé un panier histoire de les relancer.

Commerce add to cart confirmation affichera une pop-in lors de l’ajout au panier d’un produit. Cette pop-in offrira à vos clients le choix de poursuivre leurs achats ou de commencer le tunnel d’achat.

Commerce ajax cart donnera à vos clients la possibilité d’avoir une idée de leur panier via un bloc en Ajax. Cette fonctionnalité est bien moins intrusive que la pop-in de confirmation.

Products

Commerce stock vous aidera à gérer vos stocks et ainsi les produits disponibles à la vente.

Commerce stock notification pour ne plus louper une vente lorsque vous êtes en rupture de stock ! En cas de rupture de produit, le champ stock de la fiche de produit sera remplacé par un formulaire afin que le client puisse soumettre son email afin d’être notifié lors du réapprovisionnement.

Retour de marchandises Il arrive des fois où tout ne se passe pas comme prévu dans la vente à distance. Ce module permettra à vos clients de faire une demande de retour de leurs produits directement depuis leur commande. Notez qu’avec la loi Hamon, vous devez permettre à vos clients de pouvoir faire une demande de retour via un formulaire sur votre site.

Wishlist est utile lorsque vous voulez permettre à vos visiteurs de créer des listes d’envies afin d’acheter plus tard. Un lien permettant d’ajouter le produit dans une liste de souhaits sera inséré sur chaque fiche produit. L’utilisateur pourra par la suite retrouver ses produits préférés depuis son compte.

Commerce productpopularity vous permettra d’afficher un bloc des produits les plus populaires sur votre site.

Commerce rec permet d’afficher une liste de produits que d’autres clients ont acheté en commandant ce produit. Pratique pour booster le panier moyen, cette fonctionnalité vous demandera d’avoir déjà réalisé un certain nombres de vente pour être efficace.

Marketing

Discounts et Coupon 2.x vous permettront de créer des offres spéciales pour vos clients. Vous pourrez alors faire des réductions sur des produits, des profils de clients avec ou sans limite dans le temps.

Imports / Exports

Si vous utilisez le module Features pour exporter la configuration de votre site, vous pourrez ajouter Commerce Features à votre projet pour exporter ce qui est relatif au module Commerce.

Deux solutions s’offrent à vous si vous voulez importer des données. La plus simple des solutions consiste à utiliser Feeds, Commerce Feeds, voir même Xpathparser pour Feeds. Simple et efficace vous pourrez créer un import pas trop compliqué.
Si vous souhaitez quelque chose de plus robuste je vous conseille d’utiliser le couple Migrate et Commerce Migrate. Plus compliqué à prendre en main vous pourrez néanmoins réaliser des imports/exports complexes.

Performances et développement

Commerce Devel et un module additionnel pour Devel qui vous aidera dans votre développement de tous les jours.

Commerce Entitycache vous permettra en complément de Entitycache d’améliorer les performances de votre site en ajoutant aux caches les entités Drupal Commerce.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Développeurs, êtes-vous prêts pour Drupal 8 ?

Développeurs, soyez prêt pour Drupal 8 et les dernières nouveautés ajoutées au CMS

“It’s ready, when it’s ready!” Nous connaissons tous cette citation, qui fait partie de la communauté Drupal. Ce n’est un secret pour personne, Drupal 8 sera bien plus compliqué à appréhender que les versions précédentes. Malheureusement il est encore impossible de définir une date de sortie, néanmoins on peut se dire qu’il nous reste encore quelques mois devant nous. Utilisons ainsi ce temps pour comprendre et découvrir tous les pré-requis de cette nouvelle version.

Depuis quelques mois maintenant j’ai commencé à agréger une liste d’articles de façon à être au point sur les dernières nouveautés apportées par D8. Du coup, voici un résumé des meilleurs ressources que j’ai pu trouver.

Notez que dans ce billet je ne parlerai pas des nouveautés de Drupal 8 mais plutôt des bases à avoir pour commencer à développement avec Drupal 8.

Programmation PHP moderne

POO, Classes et objets.

La Programmation Orientée Objet n’a rien de nouveau et s’est standardisée dans tous les languages de développement et frameworks, pourtant c’est assez nouveau dans le monde de Drupal. Jusqu’à maintenant réservée à quelques spécificités, la POO fera partie intégrale de Drupal 8. Rien de tel que de revoir ses bases pour être au courant des dernières nouveautés, voici quelques liens qui pourront vous aider.

Ressources :

Namespace

Les namespaces sont arrivés avec PHP 5.3 afin de résoudre deux problèmes avec les fonctions et les classes quand on veut écrire du code réutilisable. Premièrement, la collision de même nom entre portion de code et deuxièmement la possibilité de créer des alias pour les noms longs de fonction ou de classe à rallonge. Avec cette nouvelle version de Drupal, vous trouverez l’utilisation des namespaces un peu partout.

Ressources :

Autoloaders, PSR-0 et PSR-4

PSR–0 est un standard de chargement de classe (l’autoloading) permettant de définir une façon automatique d’inclure des classes PHP sans avoir à utiliser les fonctions telles que require() ou include(). PSR-0 se base sur le namespace d’une classe afin de définir sa position dans le file system.

PSR-4 a pour objectif de réduire la structure des dossiers pour l’autoloader. Cela a fait couler pas mal d’encre dans sur drupal.org – Drupal and PSR-0/PSR-4 Class Loading.

Ressources :

Annotations

Les annotations sont des meta-datas qui peuvent être ajoutées à votre code afin d’être lues lors de l’execution de celui-ci. Cela sert pour la définition et la configuration mais les annotations n’affectent pas la sémantique du code.

Personnellement je ne suis pas un grand fan des annotations, pour moi les commentaires doivent rester des commentaires, de façon à donner des informations et de la description sur le comportement d’une fonction. Changer un commenta ire ne devrait pas changer le comportement d’une fonction.

Ressources :

Design patterns

Il y a de fortes chances que si vous avez à résoudre un problème de conception, un autre développeur l’ait déjà résolu. Ainsi les design patterns (En) sont des guides applicables à n’importe quel language de programmation de façon à solutionner un problème. L’avantage d’utiliser des design patterns est que cela rend votre code plus maintenable, et que cela offre une solution éprouvée.

Ressources :

Dependency injection

C’est certainement l’un des design patterns les plus compliqués à bien expliquer, toutefois c’est probablement l’un des plus simple à utiliser. Ok, le nom est effrayant, mais je suis sûr que vous l’appliquez sans le savoir. Pour bien comprendre ce que c’est, je vous suggère de regarder comment Fabien Potencier l’explique.

Ressources :

Symfony 2

Ce n’est plus la nouvelle de l’année, Drupal 8 utilisera quelques composants tout droit venus de Symfony 2. Comme souvent il y a du pour et du contre sur le fait d’apprendre Symfony 2 pour faire du Drupal 8. Personnellement, Je dirais qu’y jeter un coup d’oeil avant de jouer avec D8 ne vous tuera pas, au contraire cela vous permettra certainement de mieux comprendre certain concepts. En bref, quelques heures à regarder et découvrir Symfony 2 est un bon investissement.

Ressources :

Si vous souhaitez aller un peu plus loin et avoir une vue plus complète des composants SF2 inclus dans Drupal 8, je vous suggère de lire cet article you got Symfony in my Drupal 8 (En) ou celui-ci Symfony 2 in Drupal 8 (En)

Bibliothèques additionnelles ajoutées à D8

En plus de ce que l’on a déjà pu voir, Drupal 8 inclura des librairies externes de façon à ne pas réinventer ce qui existe. D’ailleurs quelques-unes de ces librairies sont utilisées dans l’écosystème Symfony.

Composer

Composer est un outil de gestion des dépendances qui a été adopté en D8 pour gérer les bibliothèques additionnelles telles que Symfony ou encore Twig.
A la racine de Drupal vous pourrez apercevoir un fichier nommé composer.json, structuré d’une certaine manière de façon à définir les dépendances ainsi que leurs versions.

Ressources :

Doctrine

Doctrine Database Abstraction Layer (DBAL) est une surcouche d’abstraction entre l’application et la base de données. Cette API permet de s’interfacer simplement avec la plupart des système de base de données.

N’ayez crainte, Doctrine ne fait pas vraiment parti de Drupal 8 (certainement pour D9), Drupal 8 utilise seulement le composant de lecture des annotations de Doctrine (Cf le commentaire de Chx sur drupal.stackexchange).

Ressources :

Easy RDF

EasyRdf est une bibliothèque PHP permettant de manipuler simplement et efficacement du RDF.

Ressources:

Guzzle

Guzzle est un client HTTP en Php qui permet de s’interfacer avec des applications tiers mettant à disposition des web-services.

Ressources :

PHPUnit

PHPUnit est un framework de test P-Sour PHP. Celui-ci à été choisi en remplacement de Simpletest comme nouvel outil afin d’assurer la qualité du code de D8. On ne le répétera jamais assez, mais les tests unitaires sont la meilleure méthode pour détecter une regression sur un projet.

Ressources :

Twig

Au revoir PHPTemplate, bonjour Twig! PHPTemplate nous aura bien rendu service mais il est maintenant temps pour lui de prendre sa retraite. Twig est un moteur de template moderne pour PHP qui peut être enrichi via un API. Il est facile d’utilisation, sécurisé et flexible.

Ressources :

YAML

Au lieu d’utiliser notre format de fichier maison, la décision a été prise pour D8 d’utiliser quelque chose de plus commun et standardisé. YAML est un standard pour la création de fichier de configuration.

Ressources :

Le mot de la fin

J’ai essayé de ne pas donner trop de lien et de sélectionner les meilleurs pour chaque sujet parce que cela représente beaucoup d’informations. Néanmoins si vous voulez proposer un article pour complémenter ce post, ce sera avec plaisir. En regardant la longueur de ce post de pré-requis, on peut dire que Drupal 8 a changé et est différent des précédentes versions. Cela montre aussi la volonté de plus de qualité et de professionnalisme de la part de la communauté.

Je continuerai de mettre à jour cette liste et en attendant, j’espère que vous y trouverez votre bonheur.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupal Commerce, ajouter un pane custom dans votre checkout

Drupal Commerce creation d'un pane de checkout

Comme nous avons pu le voir dans l’article précédent, il est simple de configurer le checkout de Drupal Commerce de façon à créer l’expérience utilisateur que vous désirez.

Dans cet article nous allons voir comment avec du code, ajouter et modifier des panes. Pour rappel, les panes sont les éléments qui composent les différentes pages du checkout. On y retrouve par exemple, le pane de paiement, d’adresse ou encore de choix de solution de transport.

Histoire d’illustrer cela, je vous propose de créer un module Drupal afin d’ajouter un pane permettant à vos clients de choisir parmi plusieurs emballages cadeaux. Ce simple module est accessible sur Github pour plus de compréhension.

Déclaration de notre nouveau Pane

La première chose à faire consiste à déclarer au système notre nouveau pane en utilisant le

hook_commerce_checkout_pane_info()

sandbox.module

1
2
3
4
5
6
7
8
9
<span class='line'><span class="k">function</span> <span class="nf">sandbox_commerce_checkout_pane_info</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nv">$panes</span><span class="p">[</span><span class="s1">&#39;paper_gift&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>    <span class="s1">&#39;title&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Paper gifts&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="s1">&#39;base&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;paper_gift_pane&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;page&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;checkout&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nv">$panes</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span>

Notre pane sera alors reconnu par Drupal et disponible dans le checkout. Dès à présent, vous pouvez activer le module et voir le pane apparaitre sur la page d’administration du checkout.

Comme à la manière des hooks de Drupal, le code qui génère l’affichage des panes va faire de l’introspection dans le code, de façon à chercher toutes les fonctions qui commenceront par la “base” que vous avez définie dans le hook_commerce_checkout_pane_info().

Ainsi le code sera à la recherche des fonctions suivantes :

  • BASE_settings_form()
  • BASE_checkout_form()
  • BASE_checkout_form_validate()
  • BASE_checkout_form_submit()
  • BASE_review()

Implémentation du formulaire d’administration du Pane

L’intérêt du pane est d’être affiché sur une page du checkout, néanmoins vous pouvez créer un formulaire de configuration pour celui-ci. Pour y accéder, rendez-vous sur l’interface d’administration du checkout. Notez qu’il n’y a pas de table dans laquelle les informations seront stockées, il vous faudra utiliser les méthodes variable_get() et variable_set() pour sauvegarder vos réglages.

sandbox.module

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Pane: settings form callback.</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">function</span> <span class="nf">paper_gift_pane_settings_form</span><span class="p">(</span><span class="nv">$checkout_pane</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nv">$form</span><span class="p">[</span><span class="s1">&#39;paper_gifts&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>    <span class="s1">&#39;#type&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;checkboxes&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;#title&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Ship this item in a gift box&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="s1">&#39;#default_value&#39;</span> <span class="o">=&gt;</span> <span class="nx">variable_get</span><span class="p">(</span><span class="s1">&#39;paper_gifts&#39;</span><span class="p">,</span> <span class="k">array</span><span class="p">()),</span>
</span><span class='line'>    <span class="s1">&#39;#options&#39;</span> <span class="o">=&gt;</span> <span class="nx">paper_gift_pane_default_paper_gifts</span><span class="p">(),</span>
</span><span class='line'>  <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nv">$form</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Defines a list of default paper gifts to use.</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">function</span> <span class="nf">paper_gift_pane_default_paper_gifts</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>    <span class="s1">&#39;boy&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Boys&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="s1">&#39;girl&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Girls&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="s1">&#39;christmas&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Christmas&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="s1">&#39;birthday&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Birthday&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="s1">&#39;none&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;None&#39;</span><span class="p">),</span>
</span><span class='line'>  <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span>

Dans le code ci-dessus, j’ai créé un formulaire d’administration et ajouté un champ texte, permettant au webmaster de modifier le texte qui sera affiché à l’utilisateur.

Création du Pane

Un pane n’est ni plus, ni moins qu’un formulaire dans le formulaire de checkout. Comme à l’habitude, vous y retrouverez le form, le form_validate et le form_submit.

Form

Le form contiendra ce qui sera affiché à l’utilisateur. Dans le cas de notre exemple, l’utilisateur pourra choisir entre plusieurs papiers cadeaux ou pas d’emballage.

sandbox.module

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Pane: form callback.</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">function</span> <span class="nf">paper_gift_pane_checkout_form</span><span class="p">(</span><span class="nv">$form</span><span class="p">,</span> <span class="o">&amp;</span><span class="nv">$form_state</span><span class="p">,</span> <span class="nv">$checkout_pane</span><span class="p">,</span> <span class="nv">$order</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nv">$paper_gifts</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span><span class='line'>  <span class="nv">$default_paper_gifts</span> <span class="o">=</span> <span class="nx">paper_gift_pane_default_paper_gifts</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">foreach</span> <span class="p">(</span><span class="nv">$default_paper_gifts</span> <span class="k">as</span> <span class="nv">$name</span> <span class="o">=&gt;</span> <span class="nv">$title</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nv">$image</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>      <span class="s1">&#39;path&#39;</span> <span class="o">=&gt;</span> <span class="nx">drupal_get_path</span><span class="p">(</span><span class="s1">&#39;module&#39;</span><span class="p">,</span> <span class="s1">&#39;sandbox&#39;</span><span class="p">)</span> <span class="o">.</span> <span class="s1">&#39;/images/&#39;</span> <span class="o">.</span> <span class="nv">$name</span> <span class="o">.</span> <span class="s1">&#39;.jpg&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="s1">&#39;title&#39;</span> <span class="o">=&gt;</span> <span class="nv">$title</span><span class="p">,</span>
</span><span class='line'>      <span class="s1">&#39;alt&#39;</span> <span class="o">=&gt;</span> <span class="nv">$title</span><span class="p">,</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'>    <span class="nv">$paper_gifts</span><span class="p">[</span><span class="nv">$name</span><span class="p">]</span> <span class="o">=</span> <span class="nx">theme</span><span class="p">(</span><span class="s1">&#39;image&#39;</span><span class="p">,</span> <span class="nv">$image</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">$pane_form</span><span class="p">[</span><span class="s1">&#39;paper_gift&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>    <span class="s1">&#39;#type&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;radios&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;#default_value&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;none&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;#title&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Select your paper gift&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="s1">&#39;#description&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Your items will be shipped in a gift box.&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="s1">&#39;#options&#39;</span> <span class="o">=&gt;</span> <span class="nv">$paper_gifts</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;#attributes&#39;</span> <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;class&#39;</span> <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;paper-gift-pane-selection&#39;</span><span class="p">)),</span>
</span><span class='line'>  <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">$pane_form</span><span class="p">[</span><span class="s1">&#39;paper_gift&#39;</span><span class="p">][</span><span class="s1">&#39;#attached&#39;</span><span class="p">][</span><span class="s1">&#39;css&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>    <span class="nx">drupal_get_path</span><span class="p">(</span><span class="s1">&#39;module&#39;</span><span class="p">,</span> <span class="s1">&#39;sandbox&#39;</span><span class="p">)</span> <span class="o">.</span> <span class="s1">&#39;/css/sandbox.css&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nv">$pane_form</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span>

Form validate

Le form_validate permet d’effectuer des opérations de validation sur les champs saisis par l’utilisateur.

sandbox.module

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Pane: form validation callback.</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">function</span> <span class="nf">paper_gift_pane_checkout_form_validate</span><span class="p">(</span><span class="nv">$form</span><span class="p">,</span> <span class="o">&amp;</span><span class="nv">$form_state</span><span class="p">,</span> <span class="nv">$checkout_pane</span><span class="p">,</span> <span class="nv">$order</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Validate the given value or set to none if null.</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$form_state</span><span class="p">[</span><span class="s1">&#39;values&#39;</span><span class="p">][</span><span class="nv">$checkout_pane</span><span class="p">[</span><span class="s1">&#39;pane_id&#39;</span><span class="p">]]))</span> <span class="p">{</span>
</span><span class='line'>    <span class="nv">$pane_values</span> <span class="o">=</span> <span class="nv">$form_state</span><span class="p">[</span><span class="s1">&#39;values&#39;</span><span class="p">][</span><span class="nv">$checkout_pane</span><span class="p">[</span><span class="s1">&#39;pane_id&#39;</span><span class="p">]];</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">empty</span><span class="p">(</span><span class="nv">$pane_values</span><span class="p">[</span><span class="s1">&#39;paper_gift&#39;</span><span class="p">]))</span> <span class="p">{</span>
</span><span class='line'>      <span class="nv">$pane_values</span><span class="p">[</span><span class="s1">&#39;paper_gift&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;none&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">TRUE</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span>

Ici, on regarde simplement s’il y a une valeur, sinon on définit que l’utilisateur ne veut pas d’emballage.

Form submit

La sauvegarde des informations intervient dans le form_submit une fois que l’on a passé la validation.

sandbox.module

1
2
3
4
5
6
7
8
9
10
11
<span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Pane: form submission callback.</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">function</span> <span class="nf">paper_gift_pane_checkout_form_submit</span><span class="p">(</span><span class="nv">$form</span><span class="p">,</span> <span class="o">&amp;</span><span class="nv">$form_state</span><span class="p">,</span> <span class="nv">$checkout_pane</span><span class="p">,</span> <span class="nv">$order</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$form_state</span><span class="p">[</span><span class="s1">&#39;values&#39;</span><span class="p">][</span><span class="nv">$checkout_pane</span><span class="p">[</span><span class="s1">&#39;pane_id&#39;</span><span class="p">]]))</span> <span class="p">{</span>
</span><span class='line'>    <span class="nv">$pane_values</span> <span class="o">=</span> <span class="nv">$form_state</span><span class="p">[</span><span class="s1">&#39;values&#39;</span><span class="p">][</span><span class="nv">$checkout_pane</span><span class="p">[</span><span class="s1">&#39;pane_id&#39;</span><span class="p">]];</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$pane_values</span><span class="p">[</span><span class="s1">&#39;paper_gift&#39;</span><span class="p">]))</span> <span class="p">{</span>
</span><span class='line'>      <span class="nv">$order</span><span class="o">-&gt;</span><span class="na">data</span><span class="p">[</span><span class="s1">&#39;paper_gift&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$pane_values</span><span class="p">[</span><span class="s1">&#39;paper_gift&#39;</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span>

Remarquez que vous avez accès à l’objet $order et que vous pouvez faire ce que vous en voulez. Pour l’exercice j’aurais pu créer un nouveau line item, mais pour faire simple le choix de l’utilisateur résidera comme simple information dans la commande.

Form review

Une fois l’information attachée à la commande, il ne nous reste plus qu’à la faire paraitre sur le pane de review afin que l’utilisateur puisse la voir.

Pour cela il suffit d’implémenter le form_review

sandbox.module

1
2
3
4
5
6
7
8
9
10
11
12
<span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd"> * Pane: Review</span>
</span><span class='line'><span class="sd"> */</span>
</span><span class='line'><span class="k">function</span> <span class="nf">paper_gift_pane_review</span><span class="p">(</span><span class="nv">$form</span><span class="p">,</span> <span class="nv">$form_state</span><span class="p">,</span> <span class="nv">$checkout_pane</span><span class="p">,</span> <span class="nv">$order</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nv">$order</span><span class="o">-&gt;</span><span class="na">data</span><span class="p">[</span><span class="s1">&#39;paper_gift&#39;</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="nv">$order</span><span class="o">-&gt;</span><span class="na">data</span><span class="p">[</span><span class="s1">&#39;paper_gift&#39;</span><span class="p">]</span>  <span class="o">!=</span> <span class="s1">&#39;none&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nv">$content</span><span class="p">[</span><span class="s1">&#39;paper_gift&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>      <span class="s1">&#39;#type&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;item&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="s1">&#39;#markup&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Items in your order will be wrapped with the %paper paper gift&#39;</span><span class="p">,</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;%paper&#39;</span> <span class="o">=&gt;</span> <span class="nv">$order</span><span class="o">-&gt;</span><span class="na">data</span><span class="p">[</span><span class="s1">&#39;paper_gift&#39;</span><span class="p">])),</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">drupal_render</span><span class="p">(</span><span class="nv">$content</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span>

Modification d’un Pane existant

Comme mentionné précédemment, les panes ne sont que des forms et comme tout form vous avez la possibilité de les alterer via un hook_form_alter() ou encore mieux un hook_form_ID_alter().

Dans le cas ou vous voudriez modifier les paramètres d’un pane, vous implémentez la fonction hook_commerce_checkout_pane_info_alter()

Le mot de la fin

Au final, ce n’était pas si compliqué que cela ? En plus du fait d’avoir maintenant un pane pour offrir un emballage papier cadeau à vos clients, vous savez maintenant qu’il y a 3 grandes étapes dans la vie d’un pane. Le formulaire de settings pour l’admin, le formulaire destiné aux clients et le formulaire de review. Je serais curieux de savoir pourquoi vous avez besoin d’ajouter un pane dans votre checkout…
Comme mentionné au début de ce post, le code est accéssible sur Github.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupal Commerce, maitriser votre checkout

Drupal Commerce configuration du checkout

Une des demandes récurrentes de la part des utilisateurs de Drupal Commerce est la possibilité de personnaliser le checkout. Que ce soit pour changer les étapes du checkout, ou pour recueillir des données supplémentaires, l’API de Drupal Commerce permet de répondre à ce besoin facilement.

Drupal Commerce vient avec deux concepts concernant le checkout, les Pages et les panes. Les “pages” permettent l’affichage et la configuration des différentes pages du checkout, comme par exemple la page de paiement, de livraison ou encore comme la page de résumé de commande. Ces pages contiennent des “panes”, permettant d’interagir avec le client, comme illustre la saisie de l’adresse ou du numéro de carte de crédit dans le checkout.

Attention toutefois, lorsque vous rallongez votre checkout, vous complexifiez le processus d’achat et augmentez les risques de perte de clients. Incontestablement, la bonne pratique est d’avoir le checkout le plus simple et court possible, néanmoins il existe certains cas où il faut déroger à la règle.

Ordonner les étapes de votre checkout

La façon la plus simple d’ordonner les étapes de votre checkout consiste à vous rendre sur l’interface d’administration de votre site dans la rubrique checkout settings de la section store > configuration

Cette page d’administration regroupe toutes les pages de votre checkout ainsi que les panes contenus dans chaque page. Drag’n dropable, vous pouvez déplacer un pane d’une page à une autre de façon à créer l’expérience utilisateur de votre choix.

Par défaut le checkout est découpé en 4 pages:
* Checkout : la page “Checkout”, est la première étape, elle permet la collecte des informations de base.
* Review order: la page “Review order” permet d’afficher un résumé de la commande avant la validation et la soumission du paiement.
* Payement : cette page, nommée “Payment”, est uniquement utilisée lorsque qu’une méthode de paiement est dite off-site.
* Checkout complete: la page “Checkout complete”, permet d’afficher une confirmation de commande au client.

Drupal Commerce checkout configurationDrupal Commerce checkout configuration

Ajouter des pages à votre checkout

Comme bien souvent, il existe deux façons de faire avec Drupal ou Drupal Commerce pour arriver à vos fins. Soit vous utilisez un module contrib, soit vous faites un peu de code custom.

Si vous souhaitez passer par un module, il vous faudra utiliser Drupal Commerce Checkout Pages qui vous permettra d’ajouter des pages depuis l’interface d’administration de votre site.

L’autre façon, consiste à utiliser l’API de Drupal Commerce en implémentant le hook_commerce_checkout_page_info() dans un module custom. Une fois créée votre page sera accessible dans l’interface d’administration. C’est de cette manière que sont créées les pages de Drupal Commerce. Pour plus d’information, rendez-vous dans le fichier commerce_checkout.api.php du sous module checkout.

Ajouter des panes à votre checkout

De la même manière que précédemment, il est possible de faire la même chose avec les panes.

Coté module vous pouvez vous baser sur Commerce extra panes afin d’afficher une ou plusieurs nodes dans votre checkout en guise d’information.

Coté code, il vous faudra implémenter le hook_commerce_checkout_pane_info() de façon à déclarer votre nouveau pane. Notez ensuite, que vous devrez créer vos callbacks, afin d’afficher les informations désirées.
Pour plus d’information, rendez-vous dans le fichier commerce_checkout.api.php du sous module checkout.

Le mot de la fin

Comme à l’accoutumée, il est simple de personnaliser le checkout de Drupal commerce que ce soit avec un module ou un peu de code custom. Encore une fois, attention de penser à l’expérience utilisateur de vos clients quand vous complexifiez le checkout.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Yaml, le format de configuration

Yaml, le format de configuration

L’une des premières choses que vous allez remarquer en regardant le code de Drupal 8, est le nouveau format de configuration. Terminé les extensions en .info, maintenant toute la configuration réside dans des fichiers .yml écrits au format YAML (YAML Ain’t Markup Language).

Aussi facile à lire que précédemment, il permet plus de choses et s’est imposé comme l’un des formats de standardisation dans plusieurs langages de programmation, tels que C, Perl et Python. L’une des grandes décisions prise pour Drupal 8 a été de standardiser le plus possible et de réutiliser des composants existant et fiables de façon à se concentrer sur autre chose. Ainsi le format YAML remplacera nos bons vieux fichiers maison.

L’ancienne version du fichier .info du module block:


1
2
3
4
5
6
7
8
<span class='line'># Drupal 7 block.info
</span><span class='line'>name = Block
</span><span class='line'>description = Controls the visual building blocks a page is constructed with. Blocks are boxes of content rendered into an area, or region, of a web page.
</span><span class='line'>package = Core
</span><span class='line'>version = VERSION
</span><span class='line'>core = 7.x
</span><span class='line'>files[] = block.test
</span><span class='line'>configure = admin/structure/block</span>

La nouvelle version du fichier info du module block au format YAML


1
2
3
4
5
6
7
8
<span class='line'># Drupal 8 block.info.yml
</span><span class='line'>name: Block
</span><span class='line'>type: module
</span><span class='line'>description: 'Controls the visual building blocks a page is constructed with. Blocks are boxes of content rendered into an area, or region, of a web page.'
</span><span class='line'>package: Core
</span><span class='line'>version: VERSION
</span><span class='line'>core: 8.x
</span><span class='line'>configure: admin/structure/block</span>

Comme vous pouvez le voir, les deux fichiers sont similaires. La bonne nouvelle est que vous ne serez pas dépaysé en écrivant au format YAML.

Pour vous aider à comprendre les avantages et la structure de ce nouveau format, voici dans les grandes lignes à quoi ressemble la syntaxe. Si vous voulez en savoir plus, rendez-vous directement sur la page wikipédia ou sur la documentation Symfony 2

  • Les commentaires doivent être précédés par un #
  • La valeur Null peut être exprimée de deux façons, avec la chaîne de caractère null ou le symbole ~
  • Les booléens s’écrivent true ou false
  • Les chaînes de caractères doivent être entourées par des apostrophes. Néanmoins si votre chaîne de caractère contient une ou plusieurs apostrophes, vous pouvez utiliser les guillemets.
  • Les listes d’éléments peuvent être définies sur une seule ligne ou dans un bloc (sur plusieurs lignes). Utilisez un tiret pour ajouter un nouvel élément dans une liste.


1
2
3
4
5
<span class='line'># comment.info.yml
</span><span class='line'>dependencies:
</span><span class='line'> - datetime
</span><span class='line'> - node
</span><span class='line'> - text</span>

Ou si vous préférez, vous pouvez créer vos listes sur une seul ligne.


1
<span class='line'>[datetime, node, text]</span>

Les tableaux sont de simples objets au format clé:valeur.


1
2
3
4
5
6
7
<span class='line'># comment.info.yml
</span><span class='line'>name: Comment
</span><span class='line'>type: module
</span><span class='line'>description: 'Allows users to comment on and discuss published content.'
</span><span class='line'>package: Core
</span><span class='line'>version: VERSION
</span><span class='line'>core: 8.x</span>

Il est possible d’imbriquer les tableaux, il suffit simplement d’ajouter une indentation à un tableau. Attention, les indentations doivent utiliser deux espaces et non pas des tabulations.


1
2
3
4
5
6
7
8
<span class='line'>#block.routing.yml
</span><span class='line'>block_admin_display:
</span><span class='line'>  pattern: '/admin/structure/block'
</span><span class='line'>  defaults:
</span><span class='line'>    _content: '\Drupal\block\Controller\BlockListController::listing'
</span><span class='line'>    entity_type: 'block'
</span><span class='line'>  requirements:
</span><span class='line'>    _permission: 'administer blocks'</span>

Au final rien de méchant et rien de compliqué, l’intégration du format YAML ne vous donnera pas du fil à retordre. Cela aura juste pour conséquence d’unifier tous les fichiers de configurations en imposant un standard. Que ce soit pour la déclaration des modules, de fichiers de configuration en passant par le nouveau système de plug-in tout sera fait dans ce format.

Crédits Photo

Par juliendubreuil
julien dubreuil
Drupal since 2009

Compte rendu de la DrupalCon Prague 2013

La DrupalCon étant maintenant terminée, il est temps de faire le point sur l’évènement. Cette année, la conférence européenne autour de Drupal se déroulait à Prague, capitale de la République Tchèque, un endroit idéal en plein coeur de l’Europe.

On peut dire que la communauté Drupal va bien et qu’elle grossit toujours autant, plus de 1800 billets ont été vendus, ce qui fait de cette conférence la plus grosse DrupalCon Européenne organisée. On notera au passage la présence de 72 Francais. Même si l’on a souffert du fait de ne pas avoir de café en continu, on peut dire que cette conférence a été un succès avec pour mot d’ordre la communauté.

Prague

Cette ville est vraiment magnifique, je vous conseille vivement d’aller y poser vos valises le temps d’un week-end pour profiter de la beauté de son architecture. Amateurs de bières, vous allez être servis, car cela ne coute vraiment rien. Il faut dire que la consommation moyenne de bières en République tchèque est la plus élevée au monde, avec environ 160 litres, soit 320 pintes par personne et par an.


crédit photo Bradhammonds

Voici 3 choses à faire à Prague pour être un parfait touriste :

  • Marcher sur le pont Saint-Charles
  • Admirer l’horloge astronomique et monter au sommet pour avoir une magnifique vue de la ville
  • Visiter le château et ses jardins

Voici un petit clip vidéo qui devrait vous en apprendre plus !

Le « community summit »

Avant le démarrage officiel de la conférence, il y a toujours une journée dédiée aux ateliers de formations et cette année un nouvel évènement a vu le jour : une rencontre des communautés.

Cette excellente initiative avait pour but de mettre en relation les animateurs de groupes utilisateurs Drupal afin d’échanger et d’avancer sur des sujets communs. Les volontaires ont été divisés en groupes afin de travailler sur plusieurs sujets tels que :

  • L’amélioration du DrupalCamp kit, qui est composé de documents utiles à l’organisation d’un camp ainsi qu’une distribution Drupal pour créer un site simplement.
  • Drupal ladder, ou comment aider les développeurs, site builders et thémeurs à progresser plus rapidement qu’actuellement et à réduire la courbe de montée en compétences.
  • L’organisation des communautés en Europe, ce qui marche, ce qui ne marche pas et comment faire évoluer tout cela.
  • Comment aider et sponsoriser des billets de conférences aux contributeurs reconnus qui n’ont pas la chance de pouvoir se payer le déplacement.

crédit photo Amazeelabs

Cette journée m’a ainsi permis de discuter et d’échanger avec d’autres organisateurs d’évènements de Drupal en Europe et de voir que l’on avait les mêmes problématiques à gérer.

Cela restera pour moi l’un des temps fort de cette conférence et j’espère que d’autres journées dédiées à la communauté seront organisées sans forcément attendre la prochaine DrupalCon. J’espère simplement que le travail accompli par chaque groupe pendant cette journée ne tombera pas dans le néant. Merci à Addison Berry, Morten DK et aux différents leaders d’ateliers pour avoir organisé cela !

A noter aussi que l’Association Drupal va ouvrir un bureau en Europe et plus précisément à Londres.

La keynote de Dries

Comme à chaque fois, c’est Dries qui a le plaisir d’ouvrir la conférence avec sa traditionnelle keynote après avoir été introduit sur scène par une chorale de carottes. Cette fois-ci, aucune statistique d’utilisation de Drupal, aucun chiffre sur le projet de domination du monde et assez peu de chose sur le produit et ses évolutions. On notera quand même que le nombre de contributeurs entre D7 et D8 a doublé.

On parle beaucoup des 6 initiatives qui sont CMI, Mobile, Block + context, Multilingue, Views et Webservices et on ne parle vraiment du reste et des autres innovations qui seront intégrées au corps. Ainsi vous serez content d’apprendre qu’il y a plus de 200 nouvelles fonctionnalités qui feront leur apparition, telles qu’une meilleur accessibilité, l’arrivée de schema.org pour le web sémantique, des nouvelles interfaces d’administrations et j’en passe…


crédit photo Amazeelabs

Pour Dries, Drupal 8 sera une bonne version et complètera les attentes des différents profils d’utilisateurs :

  • Pour le site builder, il y aura de nouvelles UIs, plus d’aide, une nouvelle architecture des interfaces, une meilleur navigation et expérience utilisateur et l’inline editing
  • Les développeurs front-end seront ravis de savoir que s’en est fini du markup trop verbeux de Drupal, un gros nettoyage a été fait ainsi que l’intégration de HTML 5. Underscore.js sera aussi intégré ainsi que Twig le moteur de template.
  • Pour les développeurs, Drupal 8 sera orienté objet et intégrera plusieurs briques de Symfony. La configuration résidera dorénavant dans des fichiers de settings et non plus dans la base de données. Ces nouvelles améliorations permettront de rendre Drupal plus testable et plus scalable.
  • Côté utilisateurs, il y aura une meilleure intégration avec les systèmes de troisième partie, la rédaction de contenu sera moins pénible qu’auparavant et plus user friendly.

Ainsi, la keynote d’ouverture n’était pas tournée vers Drupal comme à l’accoutumé mais vers la communauté et ses contributeurs. Dries a profité de quelques instants pour remercier certaines personnes impliquées et pourtant méconnues, ce qui pour moi est une bonne chose car cela permet de voir qu’il n’y a pas que les contributeurs connus qui contribuent.

Dries a cité Al gore, qui reflète bien le message qu’il a voulu faire passer avec sa keynote.

Le ton de cette keynote était lourd et ne respirait pas la joie, ce qui m’a semblé en opposition avec ce qu’évoque pour moi la communauté. Peut être que tout cela était pour concentrer les efforts de la communauté à rester uni et à arrêter les blablas autours de Backdrop… D’ailleurs lors de la série de questions réponses, Dries a justifié cette initiative en disant que les forks faisaient partie du monde de l’open source et que certaines fois cela marchait. Néanmoins, pour lui ce n’est pas grave, il veut discuter afin de comprendre les motivations des personnes à l’origine de cette initiative histoire de peut-être les réintégrer le moment voulu à Drupal.


crédit photo Access Advertising

Keynotes et Sessions

Les keynotes de cette année étaient vraiment intéressantes et permettaient de sortir de notre éco-sphère Drupal et de s’ouvrir à autre chose.

Mercredi la journée a débuté avec le sujet sur la Gouvernance de communautés dans le monde de l’open-source par Lisa Welchman, un sujet intéressant mais relativement complexe. Elle nous encourage à nous concentrer sur la communauté et sur nos valeurs sans pour autant nous isoler du reste du monde.

Aral Balkan a ouvert la dernière journée de conférence avec son idée de concevoir des applications dirigées par l’expérience et le comportement de l’utilisateur comme le font des grands noms tels que Appel, Google mais appliquée au monde de l’open source. Honnêtement l’une des meilleures sessions que j’ai pu voir, tous les ingrédients y étaient. Un présentateur qui maitrise ce dont il parle et qui sait jouer avec son public et un thème intéressant qui nous concerne tous, voici en quelques mots les clés du succès. De quoi donner matière à réfléchir :) Si vous ne devez voir qu’une seule keynote, c’est celle-ci.

Quelques heures à peine après les sessions, les enregistrements étaient déjà disponibles sur le site de la Drupacon, alors n’hésitez pas à les visionner !

Cette année, il y a eut une innovation au programme, avec l’organisation de « Labs ». Ces ateliers de 2 heures ont ainsi permis à pas mal de participants de jouer avec Drupal 8 et de se familiariser avec ses nouveaux concepts. L’idée était vraiment bonne, néanmoins c’est toujours compliqué de réaliser ce genre d’atelier d’autant plus qu’il y avait beaucoup de monde dans la pièce, du coup je suis resté un peu sur ma faim.


crédit photo Amazeelabs

Code sprint

La DrupalCon s’est achevée par le traditionnel code sprint afin de faire avancer Drupal 8. 106 commits au corps de Drupal ont été fait pendant la semaine.
On peut féliciter l’organisation et les bénévoles qui se sont donnés du mal pour permettre aux plus débutants de participer à Drupal 8 ! Quelques jours avant le sprint, des ateliers ont été réalisés afin d’aider les participants à avoir un environnement de développement prêt pour le jour J. Le vendredi matin, les « mentoring hours » ont permis aux plus novices de comprendre comment fonctionnait la contribution à Drupal, comment soumettre un patch et comment utiliser GIT dans les grandes lignes.

Toute cette préparation et cette communication en amont, a permis à plein de personnes de participer. Il suffisait pour cela de voir les deux salles pleines à craquer de contributeurs pour s’en persuader.


crédit photo Amazeelabs

Rendez-vous l’année prochaine !

Comme d’habitude, c’est à la fin des 3 jours de conférences que l’annonce de la prochaine ville organisatrice de la Drupalcon a été faite, même si le secret avait été dévoilé au début de de la DrupalCon. Ainsi, rendez-vous à Amsterdam en 2014!

Toutefois, notez que les prochains Drupal dev day auront lieu à Szeged en Hongrie du 24 au 30 mars 2014

Crédit photo :
Nikola Arežina

Cet article Compte rendu de la DrupalCon Prague 2013 est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Compte rendu de la DrupalCon Prague 2013

Compte rendu de la DrupalCon Prague 2013

La DrupalCon étant maintenant terminée, il est temps de faire le point sur l’évènement. Cette année, la conférence européenne autour de Drupal se déroulait à Prague, capitale de la République Tchèque, un endroit idéal en plein coeur de l’Europe.

On peut dire que la communauté Drupal va bien et qu’elle grossit toujours autant, plus de 1800 billets ont été vendus, ce qui fait de cette conférence la plus grosse DrupalCon Européenne organisée. On notera au passage la présence de 72 Francais. Même si l’on a souffert du fait de ne pas avoir de café en continu, on peut dire que cette conférence a été un succès avec pour mot d’ordre la communauté.

Prague

Cette ville est vraiment magnifique, je vous conseille vivement d’aller y poser vos valises le temps d’un week-end pour profiter de la beauté de son architecture. Amateurs de bières, vous allez être servis, car cela ne coute vraiment rien. Il faut dire que la consommation moyenne de bières en République tchèque est la plus élevée au monde, avec environ 160 litres, soit 320 pintes par personne et par an.

crédit photo [Bradhammonds](http://www.flickr.com/photos/bradhammonds/7385422190/)crédit photo Bradhammonds

Voici 3 choses à faire à Prague pour être un parfait touriste :

  • Marcher sur le pont Saint-Charles
  • Admirer l’horloge astronomique et monter au sommet pour avoir une magnifique vue de la ville
  • Visiter le château et ses jardins

Voici un petit clip vidéo qui devrait vous en apprendre plus !

Le “community summit”

Avant le démarrage officiel de la conférence, il y a toujours une journée dédiée aux ateliers de formations et cette année un nouvel évènement a vu le jour : une rencontre des communautés.

Cette excellente initiative avait pour but de mettre en relation les animateurs de groupes utilisateurs Drupal afin d’échanger et d’avancer sur des sujets communs. Les volontaires ont été divisés en groupes afin de travailler sur plusieurs sujets tels que :

  • L’amélioration du DrupalCamp kit, qui est composé de documents utiles à l’organisation d’un camp ainsi qu’une distribution Drupal pour créer un site simplement.
  • Drupal ladder, ou comment aider les développeurs, site builders et thémeurs à progresser plus rapidement qu’actuellement et à réduire la courbe de montée en compétences.
  • L’organisation des communautés en Europe, ce qui marche, ce qui ne marche pas et comment faire évoluer tout cela.
  • Comment aider et sponsoriser des billets de conférences aux contributeurs reconnus qui n’ont pas la chance de pouvoir se payer le déplacement.

crédit photo [Amazeelabs](http://www.flickr.com/photos/amazeelabs/9910464713/)crédit photo Amazeelabs

Cette journée m’a ainsi permis de discuter et d’échanger avec d’autres organisateurs d’évènements de Drupal en Europe et de voir que l’on avait les mêmes problématiques à gérer.

Cela restera pour moi l’un des temps fort de cette conférence et j’espère que d’autres journées dédiées à la communauté seront organisées sans forcément attendre la prochaine DrupalCon. J’espère simplement que le travail accompli par chaque groupe pendant cette journée ne tombera pas dans le néant. Merci à Addison Berry, Morten DK et aux différents leaders d’ateliers pour avoir organisé cela !

A noter aussi que l’Association Drupal va ouvrir un bureau en Europe et plus précisément à Londres.

La keynote de Dries

Comme à chaque fois, c’est Dries qui a le plaisir d’ouvrir la conférence avec sa traditionnelle keynote après avoir été introduit sur scène par une chorale de carottes. Cette fois-ci, aucune statistique d’utilisation de Drupal, aucun chiffre sur le projet de domination du monde et assez peu de chose sur le produit et ses évolutions. On notera quand même que le nombre de contributeurs entre D7 et D8 a doublé.

On parle beaucoup des 6 initiatives qui sont CMI, Mobile, Block + context, Multilingue, Views et Webservices et on ne parle vraiment du reste et des autres innovations qui seront intégrées au corps. Ainsi vous serez content d’apprendre qu’il y a plus de 200 nouvelles fonctionnalités qui feront leur apparition, telles qu’une meilleur accessibilité, l’arrivée de schema.org pour le web sémantique, des nouvelles interfaces d’administrations et j’en passe…

crédit photo [Amazeelabs](http://www.flickr.com/photos/amazeelabs/9911734816/)crédit photo Amazeelabs

Pour Dries, Drupal 8 sera une bonne version et complètera les attentes des différents profils d’utilisateurs :

  • Pour le site builder, il y aura de nouvelles UIs, plus d’aide, une nouvelle architecture des interfaces, une meilleur navigation et expérience utilisateur et l’inline editing
  • Les développeurs front-end seront ravis de savoir que s’en est fini du markup trop verbeux de Drupal, un gros nettoyage a été fait ainsi que l’intégration de HTML 5. Underscore.js sera aussi intégré ainsi que Twig le moteur de template.
  • Pour les développeurs, Drupal 8 sera orienté objet et intégrera plusieurs briques de Symfony. La configuration résidera dorénavant dans des fichiers de settings et non plus dans la base de données. Ces nouvelles améliorations permettront de rendre Drupal plus testable et plus scalable.
  • Côté utilisateurs, il y aura une meilleure intégration avec les systèmes de troisième partie, la rédaction de contenu sera moins pénible qu’auparavant et plus user friendly.

Ainsi, la keynote d’ouverture n’était pas tournée vers Drupal comme à l’accoutumé mais vers la communauté et ses contributeurs. Dries a profité de quelques instants pour remercier certaines personnes impliquées et pourtant méconnues, ce qui pour moi est une bonne chose car cela permet de voir qu’il n’y a pas que les contributeurs connus qui contribuent.

Dries a cité Al gore, qui reflète bien le message qu’il a voulu faire passer avec sa keynote.

Le ton de cette keynote était lourd et ne respirait pas la joie, ce qui m’a semblé en opposition avec ce qu’évoque pour moi la communauté. Peut être que tout cela était pour concentrer les efforts de la communauté à rester uni et à arrêter les blablas autours de Backdrop… D’ailleurs lors de la série de questions réponses, Dries a justifié cette initiative en disant que les forks faisaient partie du monde de l’open source et que certaines fois cela marchait. Néanmoins, pour lui ce n’est pas grave, il veut discuter afin de comprendre les motivations des personnes à l’origine de cette initiative histoire de peut-être les réintégrer le moment voulu à Drupal.

crédit photo [Access Advertising](http://www.flickr.com/photos/accessadvertising/9930442183/in/pool-drupalconprague/)crédit photo Access Advertising

Keynotes et Sessions

Les keynotes de cette année étaient vraiment intéressantes et permettaient de sortir de notre éco-sphère Drupal et de s’ouvrir à autre chose.

Mercredi la journée a débuté avec le sujet sur la Gouvernance de communautés dans le monde de l’open-source par Lisa Welchman, un sujet intéressant mais relativement complexe. Elle nous encourage à nous concentrer sur la communauté et sur nos valeurs sans pour autant nous isoler du reste du monde.

Aral Balkan a ouvert la dernière journée de conférence avec son idée de concevoir des applications dirigées par l’expérience et le comportement de l’utilisateur comme le font des grands noms tels que Appel, Google mais appliquée au monde de l’open source. Honnêtement l’une des meilleures sessions que j’ai pu voir, tous les ingrédients y étaient. Un présentateur qui maitrise ce dont il parle et qui sait jouer avec son public et un thème intéressant qui nous concerne tous, voici en quelques mots les clés du succès. De quoi donner matière à réfléchir :) Si vous ne devez voir qu’une seule keynote, c’est celle-ci.

Quelques heures à peine après les sessions, les enregistrements étaient déjà disponibles sur le site de la Drupacon, alors n’hésitez pas à les visionner !

Cette année, il y a eut une innovation au programme, avec l’organisation de “Labs”. Ces ateliers de 2 heures ont ainsi permis à pas mal de participants de jouer avec Drupal 8 et de se familiariser avec ses nouveaux concepts. L’idée était vraiment bonne, néanmoins c’est toujours compliqué de réaliser ce genre d’atelier d’autant plus qu’il y avait beaucoup de monde dans la pièce, du coup je suis resté un peu sur ma faim.

crédit photo [Amazeelabs](http://www.flickr.com/photos/amazeelabs/9911868233/in/pool-drupalconprague/)crédit photo Amazeelabs

Code sprint

La DrupalCon s’est achevée par le traditionnel code sprint afin de faire avancer Drupal 8. 106 commits au corps de Drupal ont été fait pendant la semaine.
On peut féliciter l’organisation et les bénévoles qui se sont donnés du mal pour permettre aux plus débutants de participer à Drupal 8 ! Quelques jours avant le sprint, des ateliers ont été réalisés afin d’aider les participants à avoir un environnement de développement prêt pour le jour J. Le vendredi matin, les “mentoring hours” ont permis aux plus novices de comprendre comment fonctionnait la contribution à Drupal, comment soumettre un patch et comment utiliser GIT dans les grandes lignes.

Toute cette préparation et cette communication en amont, a permis à plein de personnes de participer. Il suffisait pour cela de voir les deux salles pleines à craquer de contributeurs pour s’en persuader.

crédit photo [Amazeelabs](http://www.flickr.com/photos/amazeelabs/9963614865/sizes/l/in/pool-2141068@N20/)crédit photo Amazeelabs

Rendez-vous l’année prochaine !

Comme d’habitude, c’est à la fin des 3 jours de conférences que l’annonce de la prochaine ville organisatrice de la Drupalcon a été faite, même si le secret avait été dévoilé au début de de la DrupalCon. Ainsi, rendez-vous à Amsterdam en 2014!

Toutefois, notez que les prochains Drupal dev day auront lieu à Szeged en Hongrie du 24 au 30 mars 2014

Crédit photo :
Nikola Arežina

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupalcamp Paris – Participez à l’écosystème et animez une session!

Vous faites du Drupal, vous développez vos sites avec, vous réalisez les projets de vos clients sur cette techno, vous faites de la gestion de projet Drupal ? Bref vous êtes affectés de près ou de loin à l’écosphère Drupal! N’ayez crainte ce n’est pas grave, bien au contraire ! Qui peut dire qu’il travaille sur une technologie qui a autant de succès avec un taux d’adoption qui grandit de jour en jour ?

Utilisateurs de Drupal, c’est maintenant votre tour de rendre un peu à la communauté en proposant une session au Drupalcamp Paris qui aura lieu les 21, 22 et 23 juin 2013. A quelques jours de la clôture des soumissions de sessions (ven 26 avril) il vous reste encore un peu de temps pour le faire, ce n’est pas trop tard !

Comme je le dis toujours, pas besoin d’être un super expert de la mort qui tue pour parler de tel ou tel sujet, rien ne vaut le discours d’un passionné ou d’un utilisateur conquis! Venez partager vos connaissances avec la communauté en proposant une session dans l’une de ces thématiques :

  • Découverte de Drupal
  • Etude de cas, retours d’expériences
  • Cloud, mobilité, ECM, etc
  • Gestion de projet et méthodologie (spécificités de la gestion de projet en Drupal)
  • Développement, performances, industrialisation
  • Site building
  • Mobile, theming et design
  • Nouveautés, modules et développements, initiatives…

Toutefois, si vous avez une idée qui ne rentre pas dans l’une de ces catégories, proposez la car rien n’est figé !

Si vous êtes en manque d’inspiration, regardez ce qui ce passe sur les autres camps! Voici une petite liste de sessions qui ont ou qui seront présentées dans d’autres Drupalcamp :

Drupalcamp Lyon 2012
Drupalcamp London 2013
Drupalcamp Floride 2013
Drupalcon Portland 2013
Drupalcon Sydney 2013

N’attendez pas plus, faites vous connaître en proposant une session sur le site du camp – http://paris2013.drupalcamp.fr/appel-a-conferenciers !

Cet article Drupalcamp Paris – Participez à l’écosystème et animez une session! est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupalcamp Paris - Participez à l’écosystème et animez une session!

Drupalcamp Paris - Participez à l'écosystème et animez une session!

Vous faites du Drupal, vous développez vos sites avec, vous réalisez les projets de vos clients sur cette techno, vous faites de la gestion de projet Drupal ? Bref vous êtes affectés de près ou de loin à l’écosphère Drupal! N’ayez crainte ce n’est pas grave, bien au contraire ! Qui peut dire qu’il travaille sur une technologie qui a autant de succès avec un taux d’adoption qui grandit de jour en jour ?

Utilisateurs de Drupal, c’est maintenant votre tour de rendre un peu à la communauté en proposant une session au Drupalcamp Paris qui aura lieu les 21, 22 et 23 juin 2013. A quelques jours de la clôture des soumissions de sessions (ven 26 avril) il vous reste encore un peu de temps pour le faire, ce n’est pas trop tard !

Comme je le dis toujours, pas besoin d’être un super expert de la mort qui tue pour parler de tel ou tel sujet, rien ne vaut le discours d’un passionné ou d’un utilisateur conquis! Venez partager vos connaissances avec la communauté en proposant une session dans l’une de ces thématiques :

  • Découverte de Drupal
  • Etude de cas, retours d’expériences
  • Cloud, mobilité, ECM, etc
  • Gestion de projet et méthodologie (spécificités de la gestion de projet en Drupal)
  • Développement, performances, industrialisation
  • Site building
  • Mobile, theming et design
  • Nouveautés, modules et développements, initiatives…

Toutefois, si vous avez une idée qui ne rentre pas dans l’une de ces catégories, proposez la car rien n’est figé !

Si vous êtes en manque d’inspiration, regardez ce qui ce passe sur les autres camps! Voici une petite liste de sessions qui ont ou qui seront présentées dans d’autres Drupalcamp :

Drupalcamp Lyon 2012

Drupalcamp London 2013

Drupalcamp Floride 2013

Drupalcon Portland 2013

Drupalcon Sydney 2013

N’attendez pas plus, faites vous connaître en proposant une session sur le site du camp – http://paris2013.drupalcamp.fr/appel-a-conferenciers !

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupalcamp Paris - Ne loupez pas l’événement de l’année!

Drupalcamp Paris - Ne loupez pas l’événement de l’année!

Depuis quelques mois maintenant (oui ça passe vite) une équipe de bénévoles ultra motivés travaille sans relâche à la réalisation du prochain camp Drupal. Cette fois l’évènement s’arrête à Paris et aura lieu au centre de conférence de Microsoft à Issy les moulineaux les 21, 22 et 23 juin – http://paris2013.drupalcamp.fr.

Laissez donc tomber l’anniversaire de papy en famille, revendez vos places pour le Hellfest et venez au Drupalcamp car ça va être d’enfer !

Pour cette nouvelle édition, nous avons fait le choix de rallonger la durée du camp d’une journée. Ainsi le vendredi est venu se greffer à la journée de conférences du samedi et aux codes sprints du dimanche.

Pendant ces 72 heures vous pourrez assister à des sessions techniques traitant de sujets de fond, de technologies gravitant autour de Drupal, à des demos de modules ou encore des retours d’expériences…
Cette conférence, préparée par l’association Drupal France & Francophonie n’est destinée ni aux développeurs ni aux utilisateurs confirmés. Elle vise toutes les personnes travaillant de près ou de loin avec Drupal. Quel que soit votre niveau vous y apprendrez quelque chose !

Pour toute information complémentaire, rendez-vous sur le site de l’évènement : http://paris2013.drupalcamp.fr

Pour résumer en quelques mots le Drupalcamp Paris 2013 :

Quoi ? Un Drupalcamp

Où ? A Paris, ou plus précisément au centre de conférence de Microsoft.

Quand ? Les 21, 22 et 23 juin 2013

Combien ? 300 personnes attendues, 3 jours de conférence, 48 sessions, des codes sprints et des litres de café.

Pour quoi ? Parce que vous en apprendrez plus en un week-end sur Drupal et sa communauté qu’en une année derrière votre ordinateur.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupalcamp Paris – Ne loupez pas l’événement de l’année!

Depuis quelques mois maintenant (oui ça passe vite) une équipe de bénévoles ultra motivés travaille sans relâche à la réalisation du prochain camp Drupal. Cette fois l’évènement s’arrête à Paris et aura lieu au centre de conférence de Microsoft à Issy les moulineaux les 21, 22 et 23 juin – http://paris2013.drupalcamp.fr.

Laissez donc tomber l’anniversaire de papy en famille, revendez vos places pour le Hellfest et venez au Drupalcamp car ça va être d’enfer !

Pour cette nouvelle édition, nous avons fait le choix de rallonger la durée du camp d’une journée. Ainsi le vendredi est venu se greffer à la journée de conférences du samedi et aux codes sprints du dimanche.

Pendant ces 72 heures vous pourrez assister à des sessions techniques traitant de sujets de fond, de technologies gravitant autour de Drupal, à des demos de modules ou encore des retours d’expériences…
Cette conférence, préparée par l’association Drupal France & Francophonie n’est destinée ni aux développeurs ni aux utilisateurs confirmés. Elle vise toutes les personnes travaillant de près ou de loin avec Drupal. Quel que soit votre niveau vous y apprendrez quelque chose !

Pour toute information complémentaire, rendez-vous sur le site de l’évènement : http://paris2013.drupalcamp.fr

Pour résumer en quelques mots le Drupalcamp Paris 2013 :
Quoi ? Un Drupalcamp
Où ? A Paris, ou plus précisément au centre de conférence de Microsoft.
Quand ? Les 21, 22 et 23 juin 2013
Combien ? 300 personnes attendues, 3 jours de conférence, 48 sessions, des codes sprints et des litres de café.
Pour quoi ? Parce que vous en apprendrez plus en un week-end sur Drupal et sa communauté qu’en une année derrière votre ordinateur.

Cet article Drupalcamp Paris – Ne loupez pas l’événement de l’année! est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupal, Afficher les erreurs PHP.

Ce billet aurait tout aussi bien pu être nommé, comment faire face à la bien connue page blanche de Drupal. Je suis sûr que ce problème vous est déjà arrivé, vous retrouver nez à nez avec cette page, sans un mot d’explication. Pour comprendre ce qui se passe, quand on en est là et que l’on n’a pas accès aux logs du serveur, c’est mission impossible.

La façon la plus simple pour déboguer est d’afficher les erreurs PHP. D’ailleurs je suis convaincu de l’obligation pour tout développeur de travailler ainsi, vous verrez plus facilement les erreurs (même minimes) de votre code. On peut penser qu’une notice ou deux, par ci, par là ce n’est pas grave, mais lorsqu’elles commencent à s’additionner les unes aux autres, on dégrade les performances du site!

Method 1. La première chose à faire si vous avez accès au fichier php.ini de votre serveur, est de modifier les variables error_reporting, display_errors et display_startup_errors. Cela vous permettra lorsque vous développerez des scripts PHP hors Drupal de voir vos erreurs.

error_reporting = E_ALL
display_errors = On
display_startup_errors = On

Method 2. La deuxième solution consiste à modifier le fichier settings.php de Drupal

error_reporting(-1);
$conf['error_level'] = 2;
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

A partir de maintenant vous devriez voir les erreurs s’afficher. Attention ne faites surtout pas cette manipulation sur un site en production, mais uniquement sur vos postes de développement.

Cet article Drupal, Afficher les erreurs PHP. est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupal, Afficher les erreurs PHP.

Drupal, Afficher les erreurs PHP.

Ce billet aurait tout aussi bien pu être nommé, comment faire face à la bien connue page blanche de Drupal. Je suis sûr que ce problème vous est déjà arrivé, vous retrouver nez à nez avec cette page, sans un mot d’explication. Pour comprendre ce qui se passe, quand on en est là et que l’on n’a pas accès aux logs du serveur, c’est mission impossible.

La façon la plus simple pour déboguer est d’afficher les erreurs PHP. D’ailleurs je suis convaincu de l’obligation pour tout développeur de travailler ainsi, vous verrez plus facilement les erreurs (même minimes) de votre code. On peut penser qu’une notice ou deux, par ci, par là ce n’est pas grave, mais lorsqu’elles commencent à s’additionner les unes aux autres, on dégrade les performances du site!

Method 1. La première chose à faire si vous avez accès au fichier php.ini de votre serveur, est de modifier les variables error_reporting, display_errors et display_startup_errors. Cela vous permettra lorsque vous développerez des scripts PHP hors Drupal de voir vos erreurs.


1
2
3
<span class='line'><span class="nb">error_reporting</span> <span class="o">=</span> <span class="k">E_ALL</span>
</span><span class='line'><span class="nx">display_errors</span> <span class="o">=</span> <span class="nx">On</span>
</span><span class='line'><span class="nx">display_startup_errors</span> <span class="o">=</span> <span class="nx">On</span>
</span>

Method 2. La deuxième solution consiste à modifier le fichier settings.php de Drupal


1
2
3
4
<span class='line'><span class="nb">error_reporting</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'><span class="nv">$conf</span><span class="p">[</span><span class="s1">&#39;error_level&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span><span class='line'><span class="nb">ini_set</span><span class="p">(</span><span class="s1">&#39;display_errors&#39;</span><span class="p">,</span> <span class="k">TRUE</span><span class="p">);</span>
</span><span class='line'><span class="nb">ini_set</span><span class="p">(</span><span class="s1">&#39;display_startup_errors&#39;</span><span class="p">,</span> <span class="k">TRUE</span><span class="p">);</span>
</span>

A partir de maintenant vous devriez voir les erreurs s’afficher. Attention ne faites surtout pas cette manipulation sur un site en production, mais uniquement sur vos postes de développement.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Traiter de grandes quantités de données avec la batch api de Drupal et Drush

Traiter de grandes quantités de données avec la batch api de Drupal et Drush

Lorsque l’on est confronté aux joies de la production et de la maintenance de sites Internet il arrive souvent que l’on doive effectuer certaines manipulations sur des données existantes, comme l’ajout, la modification ou la suppression d’informations. Ces opérations sont en générale longues et coûteuses en mémoire car les quantités de données à traiter sont importantes et c’est pour cela que l’on utilise des batchs qui permettent de relâcher les processus une fois terminés évitant ainsi la saturation des ressources disponibles.

Quand la quantité de données à manipuler semble faible, le traitement avec un batch n’est pas nécessaire car il prendrait bien plus de temps qu’avec un simple script php. Même s’il est difficile de quantifier quand utiliser un batch ou un simple script, car tout dépend du travail à effectuer, des machines et du contexte, sachez que si vous devez réaliser un traitement lourd, l’utilisation d’un batch vous permettra de ne pas avoir peur que PHP s’arrête, simulant un malaise par manque de mémoire ou de temps.

La réalisation d’un batch avec Drupal c’est chose facile, puisqu’il existe une API pour cela, la Batch Api – http://drupal.org/node/180528 qui permet de créer de simplement des scripts de traitement.Il y a plein d’exemples sur le sujet, regardez le module example – http://drupal.org/project/examples – qui vous explique de A à Z comment coder et exécuter depuis l’interface web un batch.

Dans mon cas, je cherchais à réaliser un batch sans avoir besoin d’être connecté à l’interface d’administration de mon site et c’est naturellement que je me suis tourné vers Drush pour réaliser cette tâche.

Voici donc un petit snipet que vous pourrez réutiliser pour vos batch.

Déclaration de la commande Drush

Pour commencer nous allons créer notre commande drush. Dans un module, créez un fichier portant le nom de votre module avec l’extension drush.inc (dans mon cas sandbox.drush.inc)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<span class='line'><span class="k">function</span> <span class="nf">sandbox_drush_command</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'> <span class="nv">$items</span>  <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span><span class='line'> <span class="nv">$items</span><span class="p">[</span><span class="s1">&#39;my-import&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>    <span class="s1">&#39;callback&#39;</span>      <span class="o">=&gt;</span> <span class="s1">&#39;sandbox_setup_batch&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;description&#39;</span> <span class="o">=&gt;</span> <span class="nx">dt</span><span class="p">(</span><span class="s1">&#39;Import&#39;</span><span class="p">),</span>
</span><span class='line'> <span class="p">);</span>
</span><span class='line'> <span class="k">return</span> <span class="nv">$items</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">function</span> <span class="nf">sandbox_drush_help</span><span class="p">(</span><span class="nv">$section</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'> <span class="k">switch</span> <span class="p">(</span><span class="nv">$section</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">case</span> <span class="s1">&#39;drush:myimport&#39;</span><span class="o">:</span>
</span><span class='line'>     <span class="k">return</span> <span class="nx">dt</span><span class="p">(</span><span class="s2">&quot;Traitement des utilisateurs.&quot;</span><span class="p">);</span>
</span><span class='line'> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span>

Déclaration du Batch

Une fois notre commande prête il nous faut déclarer notre batch, sandbox_setup_batch().


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<span class='line'><span class="k">function</span> <span class="nf">sandbox_setup_batch</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">// Ici nous créons un tableau nommé opérations, qui contiendra toutes les fonctions qui devront être invoquées lors de l&#39;exécution du batch. Il est ainsi possible de réaliser plusieurs traitements différents avec un seul batch.</span>
</span><span class='line'> <span class="nv">$operations</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span><span class='line'> <span class="nv">$operations</span><span class="p">[]</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;sandbox_batch_process&#39;</span><span class="p">,</span> <span class="k">array</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">// Déclaration des propriétés de notre batch.</span>
</span><span class='line'> <span class="nv">$batch</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>   <span class="c1">// Le tableau d’opérations à effectuer lors du traitement de notre batch.</span>
</span><span class='line'>   <span class="s1">&#39;operations&#39;</span> <span class="o">=&gt;</span> <span class="nv">$operations</span><span class="p">,</span>
</span><span class='line'>   <span class="s1">&#39;title&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Import batch&#39;</span><span class="p">),</span>
</span><span class='line'>   <span class="s1">&#39;init_message&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Initializing&#39;</span><span class="p">),</span>
</span><span class='line'>   <span class="s1">&#39;error_message&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;An error occurred&#39;</span><span class="p">),</span>
</span><span class='line'>   <span class="c1">// Fonction qui sera appelée à la fin du batch.</span>
</span><span class='line'>   <span class="s1">&#39;finished&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;sandbox_finished_method&#39;</span>
</span><span class='line'> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">// Initialisation du batch.</span>
</span><span class='line'> <span class="nx">batch_set</span><span class="p">(</span><span class="nv">$batch</span><span class="p">);</span>
</span><span class='line'> <span class="nv">$batch</span> <span class="o">=&amp;</span> <span class="nx">batch_get</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'> <span class="nv">$batch</span><span class="p">[</span><span class="s1">&#39;progressive&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">FALSE</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">// Execution du batch.</span>
</span><span class='line'> <span class="nx">drush_backend_batch_process</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span>

Opération de batch à réaliser

A ce stade notre commande Drush est créée et notre batch déclaré, mais pour le moment il ne fait rien car nous n’avons pas encore implémenté la fonction principale, celle que notre batch devra exécuter. Ici, je récupère un par un tous les utilisateurs ayant le statut actif du site.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<span class='line'><span class="k">function</span> <span class="nf">sandbox_batch_process</span><span class="p">(</span><span class="o">&amp;</span><span class="nv">$context</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;progress&#39;</span><span class="p">]))</span> <span class="p">{</span>
</span><span class='line'>   <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;progress&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>   <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;current_user&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>   <span class="c1">// Récupération du nombre d’élément à traiter.</span>
</span><span class='line'>   <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;max&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">db_result</span><span class="p">(</span><span class="nx">db_query</span><span class="p">(</span><span class="s1">&#39;SELECT COUNT(DISTINCT uid) FROM {users} WHERE status = 1&#39;</span><span class="p">));</span>
</span><span class='line'> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">// Histoire de ne pas avoir de problèmes nous récupérerons les utilisateurs 50 par 50</span>
</span><span class='line'> <span class="nv">$limit</span> <span class="o">=</span> <span class="mi">50</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'> <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">&quot;SELECT uid FROM {users} WHERE status = 1 AND uid &gt; %d ORDER BY uid ASC&quot;</span><span class="p">;</span>
</span><span class='line'> <span class="nv">$result</span> <span class="o">=</span> <span class="nx">db_query_range</span><span class="p">(</span><span class="nv">$sql</span><span class="p">,</span> <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;current_user&#39;</span><span class="p">],</span> <span class="mi">0</span><span class="p">,</span> <span class="nv">$limit</span><span class="p">);</span>
</span><span class='line'> <span class="k">while</span> <span class="p">(</span><span class="nv">$row</span> <span class="o">=</span> <span class="nx">db_fetch_array</span><span class="p">(</span><span class="nv">$result</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>   <span class="c1">// C’est ici que doit se faire le traitement de votre batch.</span>
</span><span class='line'>   <span class="c1">//...</span>
</span><span class='line'>
</span><span class='line'>   <span class="c1">// Une fois que nous en avons terminé avec les données en cours il nous suffit de mettre à jour les informations du batch et de passer à la suivante.</span>
</span><span class='line'>   <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;progress&#39;</span><span class="p">]</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>   <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;current_user&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$account</span><span class="o">-&gt;</span><span class="na">uid</span><span class="p">;</span>
</span><span class='line'> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">// Tant que l’on n’a pas traité tout le jeu de données on continue à exécuter notre batch.</span>
</span><span class='line'> <span class="k">if</span> <span class="p">(</span><span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;progress&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;max&#39;</span><span class="p">])</span> <span class="p">{</span>
</span><span class='line'>   <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;finished&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;progress&#39;</span><span class="p">]</span> <span class="o">/</span> <span class="nv">$context</span><span class="p">[</span><span class="s1">&#39;sandbox&#39;</span><span class="p">][</span><span class="s1">&#39;max&#39;</span><span class="p">];</span>
</span><span class='line'> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">function</span> <span class="nf">sandbox_finished_method</span><span class="p">(</span><span class="nv">$success</span><span class="p">,</span> <span class="nv">$results</span><span class="p">,</span> <span class="nv">$operations</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'> <span class="nx">drush_print</span><span class="p">(</span><span class="s1">&#39;Finished importing!&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span>

Et voilà, en quelques lignes nous avons un batch prêt à l’emploi pour traiter nos données. Notez que cette commande drush peut être ajoutée dans un CRON afin d’être exécutée régulièrement.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Traiter de grandes quantités de données avec la batch api de Drupal et Drush

Lorsque l’on est confronté aux joies de la production et de la maintenance de sites Internet il arrive souvent que l’on doive effectuer certaines manipulations sur des données existantes, comme l’ajout, la modification ou la suppression d’informations. Ces opérations sont en générale longues et coûteuses en mémoire car les quantités de données à traiter sont importantes et c’est pour cela que l’on utilise des batchs qui permettent de relâcher les processus une fois terminés évitant ainsi la saturation des ressources disponibles.

Quand la quantité de données à manipuler semble faible, le traitement avec un batch n’est pas nécessaire car il prendrait bien plus de temps qu’avec un simple script php. Même s’il est difficile de quantifier quand utiliser un batch ou un simple script, car tout dépend du travail à effectuer, des machines et du contexte, sachez que si vous devez réaliser un traitement lourd, l’utilisation d’un batch vous permettra de ne pas avoir peur que PHP s’arrête, simulant un malaise par manque de mémoire ou de temps.

La réalisation d’un batch avec Drupal c’est chose facile, puisqu’il existe une API pour cela, la Batch Api – http://drupal.org/node/180528 qui permet de créer de simplement des scripts de traitement.Il y a plein d’exemples sur le sujet, regardez le module example – http://drupal.org/project/examples – qui vous explique de A à Z comment coder et exécuter depuis l’interface web un batch.

Dans mon cas, je cherchais à réaliser un batch sans avoir besoin d’être connecté à l’interface d’administration de mon site et c’est naturellement que je me suis tourné vers Drush pour réaliser cette tâche.

Voici donc un petit snipet que vous pourrez réutiliser pour vos batch.

Déclaration de la commande Drush

Pour commencer nous allons créer notre commande drush. Dans un module, créez un fichier portant le nom de votre module avec l’extension drush.inc (dans mon cas sandbox.drush.inc)

function sandbox_drush_command() {
 $items  = array();
 $items['my-import'] = array(
    'callback'      => 'sandbox_setup_batch',
    'description' => dt('Import'),
 );
 return $items;
}

function sandbox_drush_help($section) {
 switch ($section) {
    case 'drush:myimport':
     return dt("Traitement des utilisateurs.");
 }
}

Déclaration du Batch

Une fois notre commande prête il nous faut déclarer notre batch, sandbox_setup_batch().

function sandbox_setup_batch() {

 // Ici nous créons un tableau nommé opérations, qui contiendra toutes les fonctions qui devront être invoquées lors de l'exécution du batch. Il est ainsi possible de réaliser plusieurs traitements différents avec un seul batch.
 $operations = array();
 $operations[] = array('sandbox_batch_process', array());

 // Déclaration des propriétés de notre batch.
 $batch = array(
   // Le tableau d’opérations à effectuer lors du traitement de notre batch.
   'operations' => $operations,
   'title' => t('Import batch'),
   'init_message' => t('Initializing'),
   'error_message' => t('An error occurred'),
   // Fonction qui sera appelée à la fin du batch.
   'finished' => 'sandbox_finished_method'
 );

 // Initialisation du batch.
 batch_set($batch);
 $batch =& batch_get();

 $batch['progressive'] = FALSE;

 // Execution du batch.
 drush_backend_batch_process();
}

Opération de batch à réaliser

A ce stade notre commande Drush est créée et notre batch déclaré, mais pour le moment il ne fait rien car nous n’avons pas encore implémenté la fonction principale, celle que notre batch devra exécuter. Ici, je récupère un par un tous les utilisateurs ayant le statut actif du site.

function sandbox_batch_process(&$context) {

 if (!isset($context['sandbox']['progress'])) {
   $context['sandbox']['progress'] = 0;
   $context['sandbox']['current_user'] = 0;
   // Récupération du nombre d’élément à traiter.
   $context['sandbox']['max'] = db_result(db_query('SELECT COUNT(DISTINCT uid) FROM {users} WHERE status = 1'));
 }

 // Histoire de ne pas avoir de problèmes nous récupérerons les utilisateurs 50 par 50
 $limit = 50;

 $sql = "SELECT uid FROM {users} WHERE status = 1 AND uid > %d ORDER BY uid ASC";
 $result = db_query_range($sql, $context['sandbox']['current_user'], 0, $limit);
 while ($row = db_fetch_array($result)) {

   // C’est ici que doit se faire le traitement de votre batch.
   //...

   // Une fois que nous en avons terminé avec les données en cours il nous suffit de mettre à jour les informations du batch et de passer à la suivante.
   $context['sandbox']['progress']++;
   $context['sandbox']['current_user'] = $account->uid;
 }

 // Tant que l’on n’a pas traité tout le jeu de données on continue à exécuter notre batch.
 if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
   $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
 }
}

function sandbox_finished_method($success, $results, $operations) {
 drush_print('Finished importing!');
}


Et voilà, en quelques lignes nous avons un batch prêt à l’emploi pour traiter nos données. Notez que cette commande drush peut être ajoutée dans un CRON afin d’être exécutée régulièrement.

Cet article Traiter de grandes quantités de données avec la batch api de Drupal et Drush est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

7 Choses à faire pour améliorer vos compétences sur Drupal

7 Choses à faire pour améliorer vos compétences sur Drupal

Voici un article que j’aurais aimé lire quand j’ai commencé Drupal, quelques conseils simples permettant d’aborder sereinement le CMS et sa communauté. Aujourd’hui ces étapes tombent sous le sens pour moi mais vu l’essor que rencontre la version 7 de Drupal je me dis qu’il y en a d’autres à qui cela pourrait servir.

1) Inscrivez-vous sur Drupal.org

Avoir un compte sur Drupal.org c’est essentiel. Cela vous permettra en cas de besoin de poster une question, de proposer un patch ou encore d’apporter une nouvelle fonctionnalité à un module. Pour moi la création de votre compte est la première étape, c’est celle qui vous mettra en relation avec la communauté.

2) Intéressez-vous aux initiatives D8

Si vous utilisez Drupal, vous n’êtes pas sans savoir que la version 8 est en cours de réalisation. Sachez qu’ils existe plusieurs initiatives regroupant chacune les changements majeurs à venir pour Drupal. Je vous conseille donc de faire le tour des ces initiatives et de les suivre attentivement. Libre à vous si vous vous en sentez l’âme de contribuer et d’apporter votre petite graine à l’une d’entre elle. Vous trouverez toutes les initiatives D8 à cet endroit.

3) Testez, testez et testez des modules

Il parait que c’est en forgeant qu’on devient forgeron, en tout cas une chose est sûre, plus vous testerez de modules, d’outils ou de méthodologie, plus vous apprendrez. A mon sens il est important de vous créer un référentiel de modules, chaque module devant être générique et réutilisable pour vos projets.

4) Documentez-vous, lisez

Lorsque je m’attaque à une nouvelle techno ou lorsque je m’intéresse à un nouveau sujet je procède toujours de la même façon, j’essaie d’identifier des acteurs majeurs, des aguerris qui savent de quoi ils parlent, je m’abonne aux flux de leurs blogs, à leurs comptes Twitter et je lis ce qu’ils partagent. Après il ne reste qu’à maintenir cette liste de blogs à jour, en supprimant ceux qui ne produisent pas de contenus de qualité et en ajoutant de nouveaux. Ainsi vous obtenez la crème de la crème et cela me permet de rester au courant des dernières nouveautés, même si je suis quelques temps sans travailler sur le sujet.

Pour vous, voici quelques liens à suivre :

Une autre façon d’apprendre par la lecture est d’acheter quelques livres qui traitent du sujet. Cette solution est plus onéreuse qu’une recherche sur le web mais est souvent plus efficace lorsqu’on cherche un point précis (pour peu que ce soit un bon bouquin).

5) Connectez-vous aux channels IRC

Une bonne façon pour être en contact directe avec la communauté est de venir la rencontrer sur les channels IRC #drupal et #drupal-fr. Ici vous aurez les membres les plus actifs de la communauté, ceux qui arpentent les méandres de Drupal depuis plusieurs années. Pour moi c’est le meilleur moyen de trouver de l’aide, de récupérer de précieux conseils ou d’obtenir des pistes à creuser. Néanmoins, n’attendez pas de ces personnes connectées qu’elles fassent le travail à votre place et qu’elles vous prennent par la main pour vous montrer quoi et comment faire, tout ce qu’elles pourront faire c’est vous aiguiller. Plus d’info sur cette page : drupal.org/irc

6) Rencontrer la communauté

Sortez! Allez à la rencontre de la communauté qui se trouve près de chez vous. Rien ne vaut les rencontres que vous pourrez faire lors d’évènements de type barcamp, meetup ou drink. Vous en apprendrez bien plus lors de ces rencontres que derrière votre ordinateur à chercher sur Google. Sachez qu’il existe plusieurs groupes utilisateurs Drupal répartis dans les villes de Lille, Lyon, Nantes, Paris et Toulouse. Vous trouverez toutes les informations nécessaires sur la page officielle Drupal France.

7) Contribuez !

Le dernier point et pas des moindres, contribuer, participer activement à améliorer et enrichir Drupal. Lorsqu’on parle de contribution on pense tout de suite à la réalisation de module. C’est vrai, mais il n’y a pas que ça, il existe d’autres possibilités comme par exemple, soumettre ou tester un patch, écrire les tests unitaires d’un module, rédiger de la documentation, ou encore traduire des modules. Un conseil si vous voulez participer, ne restez pas focalisé sur la création de module, pour moi faire de la traduction c’est aussi méritant. Bref les possibilités sont vastes pour participer à l’écosysteme de Drupal, à vous de trouvez la votre.

Par juliendubreuil
julien dubreuil
Drupal since 2009

7 Choses à faire pour améliorer vos compétences sur Drupal

Voici un article que j’aurais aimé lire quand j’ai commencé Drupal, quelques conseils simples permettant d’aborder sereinement le CMS et sa communauté. Aujourd’hui ces étapes tombent sous le sens pour moi mais vu l’essor que rencontre la version 7 de Drupal je me dis qu’il y en a d’autres à qui cela pourrait servir.

1) Inscrivez-vous sur Drupal.org

Avoir un compte sur Drupal.org c’est essentiel. Cela vous permettra en cas de besoin de poster une question, de proposer un patch ou encore d’apporter une nouvelle fonctionnalité à un module. Pour moi la création de votre compte est la première étape, c’est celle qui vous mettra en relation avec la communauté.

2) Intéressez-vous aux initiatives D8

Si vous utilisez Drupal, vous n’êtes pas sans savoir que la version 8 est en cours de réalisation. Sachez qu’ils existe plusieurs initiatives regroupant chacune les changements majeurs à venir pour Drupal. Je vous conseille donc de faire le tour des ces initiatives et de les suivre attentivement. Libre à vous si vous vous en sentez l’âme de contribuer et d’apporter votre petite graine à l’une d’entre elle. Vous trouverez toutes les initiatives D8 à cet endroit.

3) Testez, testez et testez des modules

Il parait que c’est en forgeant qu’on devient forgeron, en tout cas une chose est sûre, plus vous testerez de modules, d’outils ou de méthodologie, plus vous apprendrez. A mon sens il est important de vous créer un référentiel de modules, chaque module devant être générique et réutilisable pour vos projets.

4) Documentez-vous, lisez

Lorsque je m’attaque à une nouvelle techno ou lorsque je m’intéresse à un nouveau sujet je procède toujours de la même façon, j’essaie d’identifier des acteurs majeurs, des aguerris qui savent de quoi ils parlent, je m’abonne aux flux de leurs blogs, à leurs comptes Twitter et je lis ce qu’ils partagent. Après il ne reste qu’à maintenir cette liste de blogs à jour, en supprimant ceux qui ne produisent pas de contenus de qualité et en ajoutant de nouveaux. Ainsi vous obtenez la crème de la crème et cela me permet de rester au courant des dernières nouveautés, même si je suis quelques temps sans travailler sur le sujet.

Pour vous, voici quelques liens à suivre :

Une autre façon d’apprendre par la lecture est d’acheter quelques livres qui traitent du sujet. Cette solution est plus onéreuse qu’une recherche sur le web mais est souvent plus efficace lorsqu’on cherche un point précis (pour peu que ce soit un bon bouquin).

5) Connectez-vous aux channels IRC

Une bonne façon pour être en contact directe avec la communauté est de venir la rencontrer sur les channels IRC #drupal et #drupal-fr. Ici vous aurez les membres les plus actifs de la communauté, ceux qui arpentent les méandres de Drupal depuis plusieurs années. Pour moi c’est le meilleur moyen de trouver de l’aide, de récupérer de précieux conseils ou d’obtenir des pistes à creuser. Néanmoins, n’attendez pas de ces personnes connectées qu’elles fassent le travail à votre place et qu’elles vous prennent par la main pour vous montrer quoi et comment faire, tout ce qu’elles pourront faire c’est vous aiguiller. Plus d’info sur cette page : drupal.org/irc

6) Rencontrer la communauté

Sortez! Allez à la rencontre de la communauté qui se trouve près de chez vous. Rien ne vaut les rencontres que vous pourrez faire lors d’évènements de type barcamp, meetup ou drink. Vous en apprendrez bien plus lors de ces rencontres que derrière votre ordinateur à chercher sur Google. Sachez qu’il existe plusieurs groupes utilisateurs Drupal répartis dans les villes de Lille, Lyon, Nantes, Paris et Toulouse. Vous trouverez toutes les informations nécessaires sur la page officielle Drupal France.

7) Contribuez !

Le dernier point et pas des moindres, contribuer, participer activement à améliorer et enrichir Drupal. Lorsqu’on parle de contribution on pense tout de suite à la réalisation de module. C’est vrai, mais il n’y a pas que ça, il existe d’autres possibilités comme par exemple, soumettre ou tester un patch, écrire les tests unitaires d’un module, rédiger de la documentation, ou encore traduire des modules. Un conseil si vous voulez participer, ne restez pas focalisé sur la création de module, pour moi faire de la traduction c’est aussi méritant. Bref les possibilités sont vastes pour participer à l’écosysteme de Drupal, à vous de trouvez la votre.

Cet article 7 Choses à faire pour améliorer vos compétences sur Drupal est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

DrupalEveryDay un petit service pour apprendre un peu plus chaque jour

Cela fait quelques mois maintenant que Drupal 7 est arrivé, de nouveaux concepts sont apparus, de nouvelles API ont été mises en place et beaucoup de hooks ont été modifiés.

Comme pas mal de monde, j’ai lu plein d’articles sur Internet mais aujourd’hui encore j’ai l’impression de n’avoir découvert qu’une petite partie des nouvelles fonctionnalités. Forcément j’ai du passer à côté de certaines choses, du coup j’ai cherché une façon de découvrir l’api en profondeur.
L’idée m’est venue d’un calendrier d’énigmes que l’on m’a offert à noël (merci belle-sœur), où chaque jour vous retrouvez une nouvelle devinette à affronter. A ce moment la, je me suis dit pourquoi ne pas faire la même chose avec l’api de Drupal7, chaque jour un nouveau truc à apprendre.
Au début je pensais faire cela uniquement pour moi mais après réflexion je me suis dis que cela pourrait être utile à l’ensemble de la communauté et ce qui prouve que je ne me suis pas trompé, c’est que les premiers échos sont positifs.

J’ai donc crée drupaleveryday.com dont le principe est vraiment basique, puisque chaque jour, 4 fonctions piochées au hasard sont affichées sur le site et publiées sur Twitter. Sur chacune des fonctions vous avez la possibilité de voter en positif ou en négatif selon si vous trouvez cette fonction utile ou non. S’il y a suffisamment de vote on pourrait imaginer plein de choses, comme des quizz et des best-of, donc à vos votes :p

Ce service n’a pas pour but de concurrencer l’api officielle, la documentation et les commentaires doivent rester là bas! Ceci est juste une petite contribution de ma part pour l’écosystème Drupal. N’étant pas graphiste j’ai fait de mon mieux :) néanmoins si une âme charitable pouvait me donner un coup de main sur la mise en forme et l’harmonisation du contenu ça ne serait pas de refu.

Que vous trouviez cette idée utile ou non, n’hésitez pas à me contacter pour me faire part de vos avis, de vos remarques et de comment améliorer ce site web.

Je profite aussi de ce billet pour remercier Opi pour le coup de main sur les media queries !

Cet article DrupalEveryDay un petit service pour apprendre un peu plus chaque jour est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

DrupalEveryDay un petit service pour apprendre un peu plus chaque jour

DrupalEveryDay un petit service pour apprendre un peu plus chaque jour

Cela fait quelques mois maintenant que Drupal 7 est arrivé, de nouveaux concepts sont apparus, de nouvelles API ont été mises en place et beaucoup de hooks ont été modifiés.

Comme pas mal de monde, j’ai lu plein d’articles sur Internet mais aujourd’hui encore j’ai l’impression de n’avoir découvert qu’une petite partie des nouvelles fonctionnalités. Forcément j’ai du passer à côté de certaines choses, du coup j’ai cherché une façon de découvrir l’api en profondeur.
L’idée m’est venue d’un calendrier d’énigmes que l’on m’a offert à noël (merci belle-sœur), où chaque jour vous retrouvez une nouvelle devinette à affronter. A ce moment la, je me suis dit pourquoi ne pas faire la même chose avec l’api de Drupal7, chaque jour un nouveau truc à apprendre.
Au début je pensais faire cela uniquement pour moi mais après réflexion je me suis dis que cela pourrait être utile à l’ensemble de la communauté et ce qui prouve que je ne me suis pas trompé, c’est que les premiers échos sont positifs.

J’ai donc crée drupaleveryday.com dont le principe est vraiment basique, puisque chaque jour, 4 fonctions piochées au hasard sont affichées sur le site et publiées sur Twitter. Sur chacune des fonctions vous avez la possibilité de voter en positif ou en négatif selon si vous trouvez cette fonction utile ou non. S’il y a suffisamment de vote on pourrait imaginer plein de choses, comme des quizz et des best-of, donc à vos votes :p

Ce service n’a pas pour but de concurrencer l’api officielle, la documentation et les commentaires doivent rester là bas! Ceci est juste une petite contribution de ma part pour l’écosystème Drupal. N’étant pas graphiste j’ai fait de mon mieux :) néanmoins si une âme charitable pouvait me donner un coup de main sur la mise en forme et l’harmonisation du contenu ça ne serait pas de refu.

Que vous trouviez cette idée utile ou non, n’hésitez pas à me contacter pour me faire part de vos avis, de vos remarques et de comment améliorer ce site web.

Je profite aussi de ce billet pour remercier Opi pour le coup de main sur les media queries !

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupal et les tâches planifiées

Pour exécuter des tâches récurrentes et automatisées, il existe un utilitaire commun à toutes les distributions Unix nommé Cron. Cet outil est vraiment pratique puisqu’il permet l’exécution d’un script à un moment précis. Vous pouvez par exemple lancer un script toutes les 5 minutes ou encore tous les lundi à 21h, les possibilités sont immenses.

Pour bien comprendre comment cela fonctionne je vous invite à lire la doc disponible sur wikipedia

Exécuter la cron de Drupal 7

Pour les versions antérieurs à Drupal 7 il était simple de l’exécuter, il suffisait simplement d’accéder à l’url exemple.fr/cron.php pour lancer le déclenchement. Depuis Drupal 7 il est nécessaire d’ajouter un paramètre supplémentaire à l’adresse, à savoir « cron_key ». Cette option n’est autre qu’un token unique d’authentification qui permet de ne restreindre le déclenchement du service Cron qu’à ceux qui possède cette clé.

Si comme moi vous avez cherché où pouvait bien se trouver cette clé, sachez que pour la récupérer il suffit de se rendre sur le tableau de bord d’administration du site à l’adresse “admin/reports/status”. Vous trouverez une ligne, dans le tableau de votre site, dédiée au Cron, vous indiquant la dernière date à laquelle le service a été exécuté ainsi que l’url pour l’exécuter et c’est cette url que vous devez récupérer.

Vous pouvez déclencher le Cron directement depuis votre navigateur en collant cette adresse ou via un script en accédant à cette adresse grâce à la commande wget.

0 2 * * * wget -O - -q -t 1 http://exemple.com/cron.php?cron_key=obwzqaAADCi-POSvSnVX3LayhESdCy7Dsdw4DQsYr

Exécuter la cron Drupal 7 chez OVH

J’ai découvert il y a peu qu’OVH proposait la possibilité aux hébergements mutualisés d’utiliser le service de Cron du serveur pour déclencher des tâches plannifiées.

Pour configurer celui-ci, rendez-vous dans l’interface d’administration de votre manager OVH et cliquez sur le Planificateur de tâches.

Comme vous pouvez le constater, il faut spécifier le chemin d’un fichier qui contiendra nos scripts d’exécution. Dans mon cas, j’ai créé un fichier à la racine de mon serveur nommé cronscript.php dans lequel j’ai ajouté le code suivant afin de déclencher les tâches plannifiées de Drupal.

system('/usr/bin/wget -O - -q http://www.exemple.comain.com/cron.php?cron_key=rGcinK08iqoZq-XyL2DibY...')

Du coup, dans l’interface de manager OVH, il ne vous reste plus qu’à spécifier le chemin de votre fichier (/www/cronscript.php pour moi) et à définir la périodicité à laquelle il doit être lancé.

Cet article Drupal et les tâches planifiées est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupal et les tâches planifiées

Drupal et les tâches planifiées

Pour exécuter des tâches récurrentes et automatisées, il existe un utilitaire commun à toutes les distributions Unix nommé Cron. Cet outil est vraiment pratique puisqu’il permet l’exécution d’un script à un moment précis. Vous pouvez par exemple lancer un script toutes les 5 minutes ou encore tous les lundi à 21h, les possibilités sont immenses.

Pour bien comprendre comment cela fonctionne je vous invite à lire la doc disponible sur wikipedia

Exécuter la cron de Drupal 7

Pour les versions antérieurs à Drupal 7 il était simple de l’exécuter, il suffisait simplement d’accéder à l’url exemple.fr/cron.php pour lancer le déclenchement. Depuis Drupal 7 il est nécessaire d’ajouter un paramètre supplémentaire à l’adresse, à savoir “cron_key”. Cette option n’est autre qu’un token unique d’authentification qui permet de ne restreindre le déclenchement du service Cron qu’à ceux qui possède cette clé.

Si comme moi vous avez cherché où pouvait bien se trouver cette clé, sachez que pour la récupérer il suffit de se rendre sur le tableau de bord d’administration du site à l’adresse “admin/reports/status”. Vous trouverez une ligne, dans le tableau de votre site, dédiée au Cron, vous indiquant la dernière date à laquelle le service a été exécuté ainsi que l’url pour l’exécuter et c’est cette url que vous devez récupérer.

Vous pouvez déclencher le Cron directement depuis votre navigateur en collant cette adresse ou via un script en accédant à cette adresse grâce à la commande wget.


1
<span class='line'>0 2 * * * wget -O - -q -t 1 http://exemple.com/cron.php?cron_key<span class="o">=</span>obwzqaAADCi-POSvSnVX3LayhESdCy7Dsdw4DQsYr
</span>

Exécuter la cron Drupal 7 chez OVH

J’ai découvert il y a peu qu’OVH proposait la possibilité aux hébergements mutualisés d’utiliser le service de Cron du serveur pour déclencher des tâches plannifiées.

Pour configurer celui-ci, rendez-vous dans l’interface d’administration de votre manager OVH et cliquez sur le Planificateur de tâches.

Comme vous pouvez le constater, il faut spécifier le chemin d’un fichier qui contiendra nos scripts d’exécution. Dans mon cas, j’ai créé un fichier à la racine de mon serveur nommé cronscript.php dans lequel j’ai ajouté le code suivant afin de déclencher les tâches plannifiées de Drupal.


1
<span class='line'>system<span class="o">(</span><span class="s1">&#39;/usr/bin/wget -O - -q http://www.exemple.comain.com/cron.php?cron_key=rGcinK08iqoZq-XyL2DibY...&#39;</span><span class="o">)</span>
</span>

Du coup, dans l’interface de manager OVH, il ne vous reste plus qu’à spécifier le chemin de votre fichier (/www/cronscript.php pour moi) et à définir la périodicité à laquelle il doit être lancé.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Exporter vos views dans vos modules

Voici un petit billet pour vous montrer qu’il est simple d’exporter vos vues créées depuis l’interface d’administration directement dans vos modules. Pourquoi ? Simplement pour ne pas laisser le code dans la base de données et pour avoir une copie de celui-ci quelque part dans des fichiers bien au chaud.

Avant toute chose, sachez qu’il existe presque toujours une solution afin d’exporter ce que vous avez fait sur le site dans un module, pour cela vous pouvez utiliser l’API d’un module, un autre module dédié à l’export ou encore utiliser le module Features qui permet d’exporter pas mal de choses en quelques clics. Pour si peu, j’avoue que je préfère mettre ça dans un module et puis de toute façon je ne suis pas un grand fan de Features.

Le code ci dessous est basé sur views 3 et Drupal 7 mais il est semblable à ce que l’on pouvait trouver avec la version 6. Pour cet exemple j’ai crée un module Drupal nommé sandbox dans lequel j’ai ajouté un fichier sandbox.info et sandbox.module.

Première étape : Préparation de notre module l’api de Views

La première étape consiste à se faire connaître auprès de views en invoquant son API, dans notre cas la dernière version, la 3.

/**
* Implements hook_views_api().
*/
function sandbox_views_api() {
 return array(
   'api' => 3,
 );
}

Pour une question de lisibilité et pour mieux nous y retrouver dans nos fichiers, créez un nouveau répertoire nommé views à la racine de votre module dans lequel nous placerons par la suite toutes les vues que nous exporterons.

Créez un nouveau fichier portant par exemple le nom de votre vue et l’extension “.inc” (ex : ma_gestion_des_articles.inc), ouvrez le et placez y la balise d’ouverture PHP (

Chaque vue aura ainsi son propre fichier de configuration.

Deuxième étape : Exporter vos vues.

L’exportation d’une vue se fait directement depuis l’interface d’administration de views (admin/structure/views). Cliquez sur le lien “exportez” qui se trouve dans le petit menu d’édition à droite dans la catégorie “opérations” de chaque vue. A ce moment là, votre page se recharge vous mettant face à votre export. Copiez le code, collez le dans le fichier que nous avons crée à l’étape précédente puis sauvegardez le.

Voila, vous avez exporté une copie de sauvegarde de votre vue mais pour le moment Views ne sait pas encore qu’elle existe.

Troisième étape : Indiquer à Views où trouver les fichiers d’export de nos vues.

Dans un nouveau fichier sandbox.views_default.inc à la racine de notre module nous allons créer un petit bout de code qui va nous permettre de scanner automatiquement notre repertoire afin d’indiquer à Views où sont stockés nos fichiers d’export.

/**
* Implements hook_views_default_views().
*/
function sandbox_views_default_views() {
 static $views;

 if (isset($views)) {
   return $views;
 }

 // Remplacer le nom de mon module “sandbox” par le nom de votre module.
 $files = file_scan_directory(drupal_get_path('module', 'sandbox') . '/views', '/\.inc$/');
 foreach ($files as $filepath => $file) {
   include $filepath;
   if (isset($view)) {
     $views[$view->name] = $view;
   }
 }
 return $views;
}

A partir de maintenant, Views est capable de venir lire dans ce répertoire et de charger les vues sur votre site. Vous pouvez ainsi stocker une copie de chacune de vos vues, ce qui vous sera pratique si vous voulez installer votre module sur plusieurs sites.

La mise à jour d’une vue ?

Une vue ça vit et, même si vous l’avez exportée dans un module, vous pouvez encore effectuer des modifications sur celle-ci depuis l’interface d’administration des views, elle passera alors dans un état “surchargée”. Notez que si vous la modifiez, elle ne sera plus identique à celle que possède votre module, n’oubliez donc pas de l’exporter à nouveau dans votre module. Néanmoins pour views, la vue à utiliser est toujours la copie qu’il a créée lorsque vous avez sauvegardé vos modifications. Pour revenir à la version qui se trouve dans votre module, vous devez cliquer sur le lien “revert view”.

Cet article Exporter vos views dans vos modules est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Exporter vos views dans vos modules

Exporter vos views dans vos modules

Voici un petit billet pour vous montrer qu’il est simple d’exporter vos vues créées depuis l’interface d’administration directement dans vos modules. Pourquoi ? Simplement pour ne pas laisser le code dans la base de données et pour avoir une copie de celui-ci quelque part dans des fichiers bien au chaud.

Avant toute chose, sachez qu’il existe presque toujours une solution afin d’exporter ce que vous avez fait sur le site dans un module, pour cela vous pouvez utiliser l’API d’un module, un autre module dédié à l’export ou encore utiliser le module Features qui permet d’exporter pas mal de choses en quelques clics. Pour si peu, j’avoue que je préfère mettre ça dans un module et puis de toute façon je ne suis pas un grand fan de Features.

Le code ci dessous est basé sur views 3 et Drupal 7 mais il est semblable à ce que l’on pouvait trouver avec la version 6. Pour cet exemple j’ai crée un module Drupal nommé sandbox dans lequel j’ai ajouté un fichier sandbox.info et sandbox.module.

Première étape : Préparation de notre module l’api de Views

La première étape consiste à se faire connaître auprès de views en invoquant son API, dans notre cas la dernière version, la 3.


1
2
3
4
5
6
7
8
<span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd">* Implements hook_views_api().</span>
</span><span class='line'><span class="sd">*/</span>
</span><span class='line'><span class="k">function</span> <span class="nf">sandbox_views_api</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'> <span class="k">return</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>   <span class="s1">&#39;api&#39;</span> <span class="o">=&gt;</span> <span class="mi">3</span><span class="p">,</span>
</span><span class='line'> <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span>

Pour une question de lisibilité et pour mieux nous y retrouver dans nos fichiers, créez un nouveau répertoire nommé views à la racine de votre module dans lequel nous placerons par la suite toutes les vues que nous exporterons.

Créez un nouveau fichier portant par exemple le nom de votre vue et l’extension “.inc” (ex : ma_gestion_des_articles.inc), ouvrez le et placez y la balise d’ouverture PHP (Deuxième étape : Exporter vos vues.

L’exportation d’une vue se fait directement depuis l’interface d’administration de views (admin/structure/views). Cliquez sur le lien “exportez” qui se trouve dans le petit menu d’édition à droite dans la catégorie “opérations” de chaque vue. A ce moment là, votre page se recharge vous mettant face à votre export. Copiez le code, collez le dans le fichier que nous avons crée à l’étape précédente puis sauvegardez le.

Voila, vous avez exporté une copie de sauvegarde de votre vue mais pour le moment Views ne sait pas encore qu’elle existe.

Troisième étape : Indiquer à Views où trouver les fichiers d’export de nos vues.

Dans un nouveau fichier sandbox.views_default.inc à la racine de notre module nous allons créer un petit bout de code qui va nous permettre de scanner automatiquement notre repertoire afin d’indiquer à Views où sont stockés nos fichiers d’export.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd">* Implements hook_views_default_views().</span>
</span><span class='line'><span class="sd">*/</span>
</span><span class='line'><span class="k">function</span> <span class="nf">sandbox_views_default_views</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="nv">$views</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$views</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nv">$views</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Remplacer le nom de mon module “sandbox” par le nom de votre module.</span>
</span><span class='line'>  <span class="nv">$files</span> <span class="o">=</span> <span class="nx">file_scan_directory</span><span class="p">(</span><span class="nx">drupal_get_path</span><span class="p">(</span><span class="s1">&#39;module&#39;</span><span class="p">,</span> <span class="s1">&#39;sandbox&#39;</span><span class="p">)</span> <span class="o">.</span> <span class="s1">&#39;/views&#39;</span><span class="p">,</span> <span class="s1">&#39;/\.inc$/&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="k">foreach</span> <span class="p">(</span><span class="nv">$files</span> <span class="k">as</span> <span class="nv">$filepath</span> <span class="o">=&gt;</span> <span class="nv">$file</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">include</span> <span class="nv">$filepath</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$view</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>    <span class="nv">$views</span><span class="p">[</span><span class="nv">$view</span><span class="o">-&gt;</span><span class="na">name</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$view</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="nv">$views</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span>

A partir de maintenant, Views est capable de venir lire dans ce répertoire et de charger les vues sur votre site. Vous pouvez ainsi stocker une copie de chacune de vos vues, ce qui vous sera pratique si vous voulez installer votre module sur plusieurs sites.

La mise à jour d’une vue ?

Une vue ça vit et, même si vous l’avez exportée dans un module, vous pouvez encore effectuer des modifications sur celle-ci depuis l’interface d’administration des views, elle passera alors dans un état “surchargée”. Notez que si vous la modifiez, elle ne sera plus identique à celle que possède votre module, n’oubliez donc pas de l’exporter à nouveau dans votre module. Néanmoins pour views, la vue à utiliser est toujours la copie qu’il a créée lorsque vous avez sauvegardé vos modifications. Pour revenir à la version qui se trouve dans votre module, vous devez cliquer sur le lien “revert view”.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Comment créer et appliquer des styles d’images avec Drupal 7 via le code

Cet article fait suite au précédent post : « Comment créer et appliquer des styles d’images avec Drupal 7 via l’UI » ou je vous détaillais comment, via l’interface d’administration, créer un style d’image. Aujourd’hui le sujet reste le même, mais la création sera faite par la programmation.

Si comme moi, vous êtes confrontés à maintenir à jour des sites Drupal, vous avez déjà dû vous poser tout un tas de questions sur la pérennisation des configurations et de ce fait, vous vous êtes résignés à faire vos modifications directement depuis l’interface d’administration. Du coup, pour chaque chose simple qu’il est possible de faire via le back-office de Drupal, il faut trouver comment le faire en code.

Ainsi, sur la même base que l’article précédent, voici comment créer et appliquer un style d’image par la programmation.

Créer un style d’image via le code

La solution la plus simple consiste à implémenter le hook_image_default_styles() fourni par le module image, qui permet de définir un ou plusieurs style(s) d’images à Drupal dans votre fichier .module.

function sandbox_image_default_styles() {
  // La variable $style est un tableau et chaque composant sera un nouveau style.
  $styles = array();
  // La clé du tableau sera le nom machine de votre style. Pour qu’il  n’y ait pas de soucis contentez-vous de caractères alphanumériques,  d’underscores et de tirets.
  $styles['image_style_example'] = array();
  // Pour chaque style pour pouvez ajouter plusieurs effets
  $styles['image_style_example']['effects'] = array(
  // Premier effet à appliquer à l’image
    array(
      'name' => 'image_rotate',
      'data' => array(
      'degrees' => 2,
      'random' => 0,
      'bgcolor' => '#CECECE',
      ),
     'weight' => 0,
    ),
    // Deuxième effet
    array(
      'name' => 'image_scale',
      'data' => array(
      'width' => 200,
      'height' => 200,
      'upscale' => 1,
    ),
    'weight' => 1,
    ),
  );
  return $styles;
}

On ne peut plus simple non ? Vous trouverez toutes les informations concernant les effets de base disponibles dans le fichier image.effects.inc du module image.

Voici d’autres fonctions utiles si vous souhaitez intervenir sur les différents styles d’images :

- image_styles : pour récupérer tous les styles d’images.
- image_style_load : pour charger et obtenir les informations d’un style.
- image_style_save : pour sauvegarder un style (après une mise à jour par exemple).
- image_style_delete : pour supprimer un style

Si toutefois vous n’avez pas trouvé votre bonheur dans ces fonctions, voici toutes les fonctions et méthodes implémentées par le module images

Appliquer un style d’image

Pour appliquez un style d’image à une image il suffit simplement d’utiliser la fonction de thème : theme_image_style($variables).
$variables est un tableau composé de différents éléments :
- style_name: le nom du style que vous voulez appliquer
- path: Le chemin de l’image relatif au système de fichier de Drupal. (ex : public://mon-image.jpg)
- alt: un text alternatif au cas où l’image ne pourrait pas être affichée.
- title: Le titre de votre image. Celui-ci sera affiché lorsque l’image sera survolée
- attributes: un tableau associatif bien connu des fonctions de thème permettant de passer des attributs à la baslise img, tel que des class css…

Notez que votre image doit se trouver sur votre site, car cela ne fonctionne pas avec une image externe.

// Récupération de l’adresse de l’image.

$path = "images/funny_cat.jpg"; // Qui à pour adresse sites/default/files/images/funny_cat.jpg
// Transformation de celle-ci.
$uri = (file_build_uri($path));
// Génération de notre image.
$image = theme('image_style', array( 'path' =>  $uri, 'style_name' => 'image_style_example'));

Et voila vous venez de créer et appliquer un style via la programmation !

Crédits Photo

Cet article Comment créer et appliquer des styles d’images avec Drupal 7 via le code est apparu en premier sur Julien Dubreuil.

Pages