Planète

Manipuler les menus de Drupal 8 (le retour)







Dans un précédent billet, nous avions pu voir que l'API Drupal 8 pour manipuler les menus avait assez peu changé. Mais c'était encore avec une version alpha, et les choses ont quelque peu évolué depuis...et notamment la sortie de la première version bêta de Drupal 8. Repassons en revue quelques techniques pour pouvoir intervenir sur un menu sous Drupal 8.

Thème 
Menu
Thème
Drupal 8

Par juliendubreuil
julien dubreuil
Depuis 2009 maintenant, je développe avec le CMS/CMF Drupal. J’étais à la recherche d’un framework capable de remplacer un projet et je n’ai jamais arrêté de m’en servir depuis ce moment.

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 LaboRouge

function drupal_map_assoc()

Fonction méconnue, drupal_map_assoc() permet de former un tableau associatif à partir d'un tableau linéaire.

&lt;?php<br />
$fruits = array('pommes', 'oranges');<br />
drupal_map_assoc($fruits);<br />
// $fruits est maintenant un tableau ('pommes' =&gt; 'pommes', 'oranges' =&gt; 'oranges')<br />
?&gt;

Trés pratique lorsque l'on veut assigner une clé | valeur de manière automatique. 


Drupal


Drupal API


Fonctions

Par vincent59
Vincent Liefooghe

Paramétrage fail2ban pour Drupal

Par défaut, Drupal permet de "bannir" des adresses IP manuellement, via la console d'administration.

Ceci est une première étape, mais peut vite devenir ingérable sur un site fréquenté. De plus, les requêtes http vont quand même arriver jusqu'au CMS, puisque c'est lui qui gère ces exclusions.

La solution dans ce cas est de coupler les logs Drupal avec fail2ban, qui s'occupe de scruter différents fichiers logs et de repérer, via des expressions régulières, des motifs qui permettront de bannir des adresses IP au niveau systèmes, via des règles iptables.

Pré-requis

Pour que fail2ban fonctionne avec Drupal, il faut activer le module syslog, et le paramétrer pour qu'il envoie ses logs dans un fichier séparé (voir à ce sujet http://www.vincentliefooghe.net/content/drupal-activer-les-traces-en-syslog).

Installation et paramétrage de fail2ban

Sur une distribution debian-like, simplement :

sudo apt-get install fail2ban

Les fichiers de configuration se trouvent dans /etc/fail2ban :

  • fail2ban.conf : fichier de configuration assez général, avec le fichier de logs de fail2ban, le niveau de logs et le socket unix
  • jail.conf : définition des "jails", c'est à dire les paramètres et les actions par défaut. Il est fortement recommandé d'en faire une copie dans un fichier jail.local pour éviter l'écrasement lors des mises à jour
  • filter.d : répertoire dans lequel se trouvent les définitions des filtres (regex)
  • action.d : répertoire dans lequel se trouvent les définitions des actions.

Dans le fichier jail.local, je vous recommande de renseigner la ligne

ignoreip = 127.0.0.1/8

et d'ajouter les adresses IP de vos PC clients ou serveurs, ce qui peut vous éviter un "auto-bannissement" en cas de manipulations douteuses sur le ssh, des accès à des scripts php, etc.

Paramétrage propre à Drupal

Pour bannier des adresses IP qui tenteraient des connexions, on ajoute un fichier de définition de règle dans le répertoire filter.d. Par exemple, drupal-user.conf, qui va contenir :

# filter to ban IP for Login attempt
[Definition]
failregex = \|user\|<HOST>\|.*\|Login attempt failed (.+)\.$
#failregex = \|user\|<HOST>\|.*spambot.Failed (.+)\.

ignoreregex =

Le filtre recherche les occurences de "Login attempt failed". La ligne est formatée avec *|user|adresse IP|*. Par exemple (cas réel) :

Sep 24 10:03:12 vps35701 drupal: http://www.vincentliefooghe.net|1411545792|user|89.66.70.109|http://www.vincentliefooghe.net/?q=user/login|http://www.vincentliefooghe.net/?q=user/login|0||Login attempt failed for Marcferozi.

Puis dans le fichier jail.local, on ajoute une nouvelle section :

#
# Drupal
#
[drupal-user]
enabled = true
port = http,https
protocol = tcp
filter = drupal-user
logpath = /var/log/drupal.log
maxretry = 3
# 1 hour
findtime = 3600
# 20 hours
bantime = 72000

On déclare donc à fail2ban qu'il doit utiliser le filtre drupal-user, sur le fichier de logs /var/log/drupal.log. Dans celui-ci, il cherche pendant une heure maximum 3 tentatives de connexions.

Si fail2ban détecte une "attaque", il le signale dans ses logs :

2014-09-23 00:41:56,025 fail2ban.actions: WARNING [drupal-user] Ban 89.66.70.109

On peut également voir les adresses IP bannies via iptables -L :

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
fail2ban-drupal-user  tcp  --  anywhere             anywhere             multiport dports http,https
fail2ban-ssh-ddos  tcp  --  anywhere             anywhere             multiport dports ssh
fail2ban-ssh  tcp  --  anywhere             anywhere             multiport dports ssh
ACCEPT     all  --  was59-4-88-175-36-21.fbx.proxad.net  anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain fail2ban-drupal-user (1 references)
target     prot opt source               destination         
DROP       all  --  qqa.1113460302.com   anywhere            
DROP       all  --  seo7.heilink.com     anywhere            
RETURN     all  --  anywhere             anywhere  

On peut également ajouter d'autres règles, si l'on a mis en place des modules de type honeypot ou botcha, pour bannier les spammeurs.

 

Catégorie: 


Tag: 

Par hellosct1

Le livre Drupal avancé au Meetup Drupal de Paris

Le CMS Drupal est très utilisé dans le milieu professionnel et il était important de répondre aux attentes des utilisateurs Français de ce CMS.

A cette occasion, je vais présenter mon nouveau livre "drupal avancé" que j'ai co-signé avec Vanessa 'Kowalski' David, au prochain Meetup Drupal à Paris, le 24 septembre dans les locaux de la fondation Mozilla

L'ouvrage s'intitule : «Drupal avancé : un CMS pour développeurs» et publié aux éditions Eyrolles. Il sera disponible très prochainement dans toutes les bonnes librairies et distributeurs et revendeurs webs. De plus, l'ouvrage a été préfacé par Frédéric G. MARAND qui est Core maintainer Drupal XML-RPC et les illustrations par Vincent Pontier (aka El Roubio), le créateur de la mascotte PHP.

drupal-avance.png

Le but de ce livre (en français) est de répondre à une certaine attente des utilisateurs, développeurs... qui souhaitent en faire plus avec le CMS Drupal pour progresser, à travers différentes astuces et des nombreuses bonnes pratiques qu'il est important de connaître et de ne pas oublier.

Bien entendu, l'événement de présentation est gratuit, ouvert à tous mais sur inscription :

http://www.meetup.com/drupal-france-francophonie/events/204874312/

Par juliendubreuil
julien dubreuil
Depuis 2009 maintenant, je développe avec le CMS/CMF Drupal. J’étais à la recherche d’un framework capable de remplacer un projet et je n’ai jamais arrêté de m’en servir depuis ce moment.

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 Artusamak
Julien Dubois

Drupal 8, une première beta et après ?

Drupal 8, une première beta et après ?

L'arrivée de la bêta 1 de Drupal 8 est imminente.

En effet, le dernier ticket marqué "bloquant" d'après les statistiques vient d'être corrigé le 19 septembre.

Alors, que va-t-il se passer ensuite ?

Sortie d'une Bêta

Avant la bêta, une dernière alpha va sortir, et si aucun "beta blocker" n'apparaît pendant 2 semaines alors une version bêta sera mise en ligne. À partir de là, l'effort communautaire se portera sur les bugs critiques (une centaine à l'heure actuelle) dans le but de sortir une première "Release Candidate".

Voila ce qu'il faut retenir de cette phase :

  • Seul les bugs critiques d'API seront corrigés. Les mainteneurs peuvent aider à les identifier en essayant de porter (encore) leurs modules ou thèmes pour Drupal 8.
  • Il ne faudra pas compter sur un chemin de montée de version sans bug entre les bêtas, en tout cas pas dans les premières versions bêta.
  • Les textes d'interfaces à traduire peuvent encore changer, la traduction complète n'est donc pas pour tout de suite

Sortie d'une "Release Candidate"

Une fois qu'il n'y aura plus de bugs ou tâches critiques, la première "Release Candidate" de Drupal 8 sera envisagée en fonction des bugs majeurs restants.

À partir de là, l'API, les interfaces et les textes ne devraient plus changer. Il sera temps de finir la traduction et de porter ses modules.

Enfin si pendant quelques semaines il n'y a aucun problème critique découvert, Drupal 8 sortira !

Alors, il sortira quand Drupal 8 ?

Et bien on ne sait toujours pas :)

On peut néanmoins se tourner vers l'histoire et regarder un petit peu ce qu'il s'est passé avant.

  • Drupal 5.0 est sorti le 15 janvier 2007
  • Drupal 6.0 est sorti le 23 février 2008 (soit 394 jours après Drupal 5, dont 151 jours en bêta et RC)
  • Drupal 7.0 est sorti le 5 janvier 2011 (soit 1057 jours après Drupal 6, donc 355 jours en alpha, bêta et RC)
  • Drupal 8 en est à 450 jours d'alpha.

Alors je me lance dans un délire personnel et en extrapolant les durées de bêta et de RC, en voyant que la communauté aime bien sortir une nouvelle version en début d'année et en maraboutant un peu, je propose une sortie de Drupal 8 autour du 29 janvier 2015. Les paris sont ouvert !

Plus sérieusement, comme nous l'avons déjà dit au drupalcamp soleil 2014 en mai dernier, si vous êtes un développeur il est déjà l'heure de se mettre à Drupal 8.

De notre côté, ce présent site est en Drupal 8 et pour le moment on vous avoue que la mise à jour nous fait suer. Nous travaillons sur notre offre de formation Drupal 8, et nous avons commencé à rassembler et partager les changements notables concernant les "fonctions courantes". Concernant ce dernier point, amis développeurs / themeurs n'hésitez pas à participer !

Et une fois Drupal 8 sorti

Un autre point important à aborder concerne les changements dans le cycle de mise à jour de Drupal 8. Tout cela est encore en pleine discussion mais voilà ce que l'on peut en dire :

  • Drupal 6 sera encore supporté pendant 3 mois une fois Drupal 8 sorti. Le temps de permettre une migration vers Drupal 8.
  • Une nouveauté, des versions mineures seront disponibles tous les 6 mois environ, et elles permettront le rajout de fonctionnalités. Jusqu'à maintenant les versions mineures ne servaient qu'à corriger les bugs et les failles de sécurité, mais il sera donc possible d'avoir des évolutions du core (ne cassant pas la compatibilité descendante).
  • Seules les dernières versions mineures de chaque version majeure seront supportée.
  • L'apparition d'un support long terme sur la dernière version mineur de chaque version majeur de Drupal.
  • La correction des bugs d'une version majeure sera assurée jusqu'à la prochaine version majeure plus 3 mois.
  • La correction des failles de sécurité jusqu'à 2 version majeures plus 3 mois (donc jusqu'à Drupal 10 pour la version 8).
  • La création d'une version majeure ne se fera que quand quelque chose de suffisamment conséquent pour la justifier sera accompli.

Comme on peut le voir certaines choses sont assez floues mais les idées principales sont d'apporter du rythme et de la prédictibilité dans la sortie des nouvelles versions tout en permettant l'innovation dans les fonctionnalités.

Mon point de vue

Il me semble que ces cycles plus rapprochés sont une bonne chose dans le fond. Dans la pratique il est possible que cela amène un peu plus de travail du côté de la maintenance, car il est possible qu'on ne puisse plus faire les mises à jour aussi simplement qu'avant. Le rajout de fonctionnalités, même modulaires, entraîne un encadrement de nos clients qui n'était pas forcément nécessaire lors des correctifs de sécurité ou de bugs.

Et pourtant, comment ne pas aussi voir l'avantage sur le long terme, on espère que ces mises à jour incrémentales qui s'inscrivent dans un développement agile, rendront le changement de version majeure plus doux et permettront d'impliquer encore plus de monde dans le développement de Drupal.

 

Plus d'informations dans le post d'annonce :

https://groups.drupal.org/node/443118

 

Crédit image : Last Call media

Par admin

Appel à conférencier Drupagora 2014

Pour l'édition 2014, Drupagora remet le couvert pour sa quatrième édition au MAS, Paris 13e. Il se déroulera le 14 novembre prochain autour du CMS Drupal.

L'événement invite les différents acteurs, utilisateurs, contributeurs... à se retrouver pour parler des thématiques proposées :
- Plateformes digitales globales : distributions et usines à sites
- E-commerce avec Drupal pour les sites à > 5M€ de CA
- Applications métier avec Drupal (intranets, RSE, bases documentaires, outils métiers)
- Drupal face à la concurrence des principaux éditeurs (Oracle, Adobe, Sitecore, Ektron, Demandware, Hybris...)

De plus, le fil rouge du programme sera : Drupal dans l'entreprise : projets complexes et intégrés au SI, plateformes digitales globales, sites e-commerce et applications métier.

Si un des thèmes proposés, vous intéressent, alors n'hésitez pas à le proposer dans l'appel à conférencier qui est en cours actuellement.

Par ailleurs, vous pouvez dès à présents consulter le site de l'événement et vous inscrire

site officiel : Drupagora 2014
Inscription à Drupagora 2014

Par AlanT
Alan Tondelier

Présentation du multi-site avec Drupal : Meetup Drupal Rouen #3

Le 17 septembre se tiendra le 3ème Drupal meetup de Rouen. Ce sera l'occasion pour moi de parler de la réalisation de "multi-sites" avec Drupal.

Au programme 

  • Multisite Drupal "classique"
    - Présentation
    - Structure d'un multisite
    - Fonctionnalités partagées / Fonctionnalités spécifiques. Astuces.
     
  • Domain Access
    - Présentation / Usages
    - Mise en place d'un domain access
    - Exemples
     
  • Conclusion : Forces et inconvénients de ces deux approches.

La présentation sera retransmise en live sur youtube, et visionnable ci dessous

 

Par hellosct1

Tests modernes à DrupalCamp Montréal

Le DrupalCamp Montréal est un événement autour du CMS Drupal, et se déroulera le 12 et 13 septembre 2014 à Montréal (Canada).

Pour l'édition 2014, j'ai été retenu sur le thème suivant :

Effectuer des tests modernes pour Drupal

De nos jours, il est important de penser aux tests avant de mettre un site en ligne, surtout si les modules ont été développés en interne.

Avec l'arrivée prochaine de Drupal 8, l'exécution des tests, que nous connaissons actuellement, se voit chambouler. Cette session abordera les différents types de tests possibles et vous montrera que dès maintenant vous pouvez mettre en place des tests modernes en s'appuyant sur des projets externes (PHPUnit, Selenium...).

Je vous attends à ma présentation à 10h30 dans la salle "Auditorium 1".

De plus, le programme propose 4 salles en parallèle avec de nombreux sujets techniques autour du CMS, que vous pouvez consulter : Programme drupalCamp Montréal 2014

Alors n'attendez pas pour vous inscrire, car l'événement se déroule dans les prochains jours : Inscription à DrupalCamp Montréal

Par AlanT
Alan Tondelier

Simplifiez et accélérez vos installations Drupal avec Drush make

Drush est un outil en ligne de commande permettant d'administrer simplement Drupal. Disponible sur toutes les plateformes (unix/osx/windows), il est un indispensable du développement de vos sites.

La commande make de Drush permet de préparer rapidement une installation de Drupal avec ses modules contribués, ses librairies pré-téléchargées et plus encore. Incontournable quand on travaille sur un grand nombre de projets où l'on utilise à 80% les mêmes modules.

Une installation Drupal prête à l'emploi

C'est quoi Drush make ?

La commande drush make permet de récupérer les sources de projets Drupal (core, module, themes...) à partir des dépots officiels. Afin de décrire quels éléments récupérer, la commande make doit être accompagnée d'un fichier .make. Description et exemple d'un fichier .make :

mydrupal.make

; Base Drupal
core = 7.x

; Internal API for Drush make
api = 2

; Drupal Version
projects[drupal][version] = "7.26"

; Modules
; If no version precised, fetch the last stable one
; see projets[views] for an example

projects[admin_menu][subdir] = "contrib"
projects[adminimal_admin_menu][subdir] = "contrib"
projects[backup_migrate][subdir] = "contrib"
projects[ctools][subdir] = "contrib"
projects[ckeditor][subdir] = "contrib"
projects[ckeditor_link][subdir] = "contrib"
projects[context][subdir] = "contrib"
projects[devel][subdir] = "contrib"
projects[google_analytics][subdir] = "contrib"
projects[jquery_update][subdir] = "contrib"
projects[libraries][subdir] = "contrib"
projects[metatag][subdir] = "contrib"
projects[pathauto][subdir] = "contrib"
projects[pathologic][subdir] = "contrib"
projects[token][subdir] = "contrib"
projects[transliteration][subdir] = "contrib"
projects[variable][subdir] = "contrib"

; Declare the use of version 3.6 of views
projects[views][subdir] = "contrib"
projects[views][version] = "3.6"
projects[webform][subdir] = "contrib"

; Themes
projects[adminimal_theme][type] = "theme"
projects[mothership][type] = "theme"

; Libraries
; Please fill the following out. Type may be one of get, git, bzr or svn,
; and url is the url of the download.

libraries[lessphp][download][type] = "file"
libraries[lessphp][download][url] = "http://leafo.net/lessphp/src/lessphp-0.4.0.tar.gz"
libraries[lessphp][directory_name] = "lessphp"
libraries[lessphp][type] = "library"

libraries[ckeditor][download][type] = "file"
libraries[ckeditor][download][url] = "http://ckeditor.com/online-builder/releases/minified/4.3.3/moono/4.3.3/ckeditor_4.3.3.zip"
libraries[ckeditor][directory_name] = "ckeditor"
libraries[ckeditor][destination] = "modules/contrib/ckeditor"

Comme vous pouvez le voir la structure est très simple. Le fichier commence par déclarer la version de Drupal à utiliser, liste les projets eque vous souhaitez automatiquement télécharger ainsi que les thèmes. Les fichiers .make peuvent également récupérer directement les librairies dont vous avez besoin. 

Une fois ce fichier créé et enregistré, il vous suffit d'invoquer Drush avec cette syntaxe :

drush make mydrupal.make mywebsite -y

Drush créera votre installation de Drupal dans le dossier mydrupal, le switch -y répondra par l'affirmative à tous les prompts de la console.

Drush make console
Sortie de drush make sur un environnement windows

Le téléchargement des fichiers terminé, vous vous retrouvez avec votre dossier Drupal prêt à l'utilisation, vous n'avez plus qu'à executer install.php.

Pour une liste exhaustive des fonctionnalités de drush make, vous pouvez lire la documentation officielle (en anglais) ici

Drush make VS profil d'installation

Il est légitime de se poser la question : "Pourquoi ne pas passer par un profil d'installation Drupal ?"

Les fichiers make possèdent un certain avantage face aux profils d'installation :

  1. Vous récupérez automatiquement la dernière version stable du module,
    Tout en gardant la possibilité de préciser la version d'un module en particulier en rajoutant la ligne "projects[nomprojet][version] = "7.2", où 7.2 est la version de votre module.
  2. Il est plus facile de maintenir un fichier make qu'un ensemble de dossiers de modules, de plus vous pouvez facilement mettre en place des fichiers make pour chaque typologie de projets : site_corporate.make, site_multilingue.make, site_vitrine.make ...
  3. L'utilisation de drush make permet d'automatiser facilement le déploiment de Drupal dans des scripts bash (unix) ou batch (windows). J'y reviendrai.

Le principal point noir de Drush make est sa relative lenteur pour récupérer les fichiers des serveurs Drupal, là où un profil d'installation possède déjà tous les fichiers à installer.

Générer facilement ses fichiers .make

La méthode manuelle & semi-manuelle

Pour générer vos fichiers .make, vous pouvez simplement ouvrir votre IDE favori et taper à la main le fichier. À préférer lorsque vous savez exactement ce que vous voulez.

Une autre façon de faire est d'utiliser le site http://drushmake.me qui vous assistera dans la création de vos fichiers .make. Pratique !

Génération du .make à partir d'un site Drupal existant

Vous avez un site Drupal "référence" et vous souhaiteriez en sortir un fichier .make ? C'est possible !
Avec drush, placez vous dans le répertoire Drupal du site considéré puis :

drush generate-makefile /chemin/du/fichier-make.make

Et votre fichier .make sera automatiquement généré. Selon votre projet, des informations manquantes peuvent survenir, notamment si vous avez développé des modules custom. Éditez votre fichier .make en conséquence de façon à avoir une base propre de déploiement. 

Remarque : En utilisant generate-makefile, la version de chaque module sera précisé dans le fichier .make, de façon à avoir un Drupal à jour je vous conseille de supprimer les lignes précisant la version de vos modules.

Ainsi, avec Drush make, vous accélérerez considérablement votre mise en place de projets Drupal, en local ou sur vos serveurs.

 

Par AlanT
Alan Tondelier

Générer et personnaliser ses PDF avec Drupal et dompdf

Pour générer des fichiers PDF des pages Drupal, il existe le module "Print", qui contient le sous module "print_pdf". Ce module permet de convertir très simplement en PDF toute page possédant une URL interne. Print propose même un système de templates permettant de peaufiner l'affichage des PDF pour chaque type de nodes.

Cependant, il arrive d'avoir besoin de générer des PDF dont l'affichage diffère complètement de la page drupal associée et où des données non présentes sur la page doivent être récupérées. Cet article explique comment parvenir a ses fins en détournant un petit peu le module print. Cet article s'appuie sur la version 2.x du module.

Quelle librairie PDF choisir ?

Présentation

Lorsque vous installez le module print et que vous activez la génération de pdf (module print_pdf) il vous est demandé de déposer une librairie PDF dans votre Drupal. Il existe à ce jour 4 librairies PDF supportées par print pour générer vos PDF :

  1. dompdf
  2. TCPDF
  3. mPDF (avec la version 2.x de print)
  4. wkhtmltopdf

Chaque librairie possède ses avantages/inconvénients et leur choix va dépendre énormément de votre projet. Une étude comparative de ces 4 libraries est disponible sur fuseinteractive.ca . 

Personnellement, j'ai trouvé TCPDF trop "mauvais" dans la gestion des CSS. La mise en place de whtmltopdf délicate car on n'a pas toujours l'accès root du serveur qui héberge le site, même si c'est la solution la plus puissante (et la seule vraiment valable pour vos très gros pdf).

Concernant dompdf et mPDF, pour généraliser, dompdf a un meilleur support CSS que mPDF mais est moins performant que ce dernier.

J'ai eu l'occasion de pousser dompdf assez loin pour générer des pdf plutôt complexes : http://egrid.epg-project.eu/fr/egrid : 10 langues avec différents jeux de caractères, la possibilité d'ajouter un glossaire dans 4 langue de son choix, une numérotation des pages et un footer personnalisé.

Génération de PDF complexe avec Drupal
Extrat d'un PDF dynamique complexe avec Drupal avec footer personnalisé et numérotation de pages 

Pour la suite de cet article, j'utiliserai la bibliothèque dompdf pour générer mes fichiers.

Dompdf

Installer la librairie dompdf

Pour installer simplement la librairie dompdf, il vous faut :

  1. Récupérer la dernière version de dompdf : https://github.com/dompdf/dompdf/tags,
  2. Récupérer php-font-lib 0.2.2 : https://github.com/PhenX/php-font-lib/tree/0.2.2,
  3. Si vous ne l'avez pas, le module libraries,
  4. Dézipper dompdf dans sites/all/libraries/dompdf,
  5. Dézipper php-font-lib dans sites/all/libraries/dompdf/lib/php-font-lib,
  6. v2.0 du module : veillez à activer également le module "dompdf library handler".

Dompdf est installé, vous pouvez peaufiner vos réglages dans <admin>/config/user-interface/print .

Générer et personnaliser des PDF "sur-mesure" avec Dompdf

Ajouter des templates à n'importe quelle page possédant un lien interne

Le module print permet la personnalisation de templates selon le modèle hiérarchique suivant ( 1 sera prioritaire sur 2 qui sera prioritaire sur 3, etc...) : 

  1. print--[format]--node--[type]--[nid].tpl.php,
  2. print--[format]--node--[type].tpl.php,
  3. print--[format].tpl.php,
  4. print--node--[type].tpl.php,
  5. print.tpl.php dans votre thème,
  6. print.tpl.php dans le module print (par défaut).

[format] est le format de sortie du module print (html, pdf ou mail), [type] est le nom interne du type de contenu, [nid] est l'ID du node.

Cependant, cette structure ne permet pas d'appliquer un template à n'importe quelle page de notre site. Par exemple, comment faire pour ajouter un template PDF personnalisé pour une page générée par views ? Sans pour autant écraser le template général ?

Pour remédier à cela, vous pouvez utiliser hook_preprocess_print() :

template.php de votre theme

/**
 * Implements hook_preprocess_print().
 */

function demo_preprocess_print(&$vars){

  // add support for template files
  // print--[format]--path-[drupal-path].tpl.php
  // and
  // print--path-[drupal-path].tpl.php
  // with recursive path suggestions

  $cpath = current_path();
  $crumbs = explode('/',$cpath);

  // if first crumb is "print" remove it

  if($crumbs[0] == "print" ){ array_shift($crumbs); }

  $vars['theme_hook_suggestions'][] =  "print__path_${crumbs[0]}";
  $vars['theme_hook_suggestions'][] =  "print__${vars['format']}__path_${crumbs[0]}";

  // if there is more than one crumb
  if(count($crumbs) > 1){

    // remove crumb already used 
    array_shift($crumbs);

    foreach ($crumbs as $key => $crumb) {

      // get number of current theme suggestions
      $size = count($vars['theme_hook_suggestions']);

      // add crumb to theme suggestions
      $vars['theme_hook_suggestions'][] = $vars['theme_hook_suggestions'][$size-2]."_${crumbs[$key]}";
      $vars['theme_hook_suggestions'][] = $vars['theme_hook_suggestions'][$size-1]."_${crumbs[$key]}";

    }

  }

}

Ainsi, grâce a cette fonction, je peux facilement mettre en place un template pour personnaliser la sortie de mon pdf.

Si le chemin de ma vue est "mavue", le template PDF sera : print--pdf--path-mavue.tpl.php ou print--path-mavue.tpl.php (pour personnaliser à la fois le PDF et l'affichage pour impression).

Plus intéressant la fonction gère également les chemins à plusieurs arguments :
Par exemple si mon chemin est mavue/arg2, le template PDF pourra être (du plus selectif au moins selectif) :

  1. print--pdf--path-mavue-arg2.tpl.php,
  2. print--path-mavue-arg2.tpl.php,
  3. print--pdf--path-mavue.tpl.php,
  4. print--path-mavue.tpl.php

Ajouter un footer personnalisé à vos PDF et les numéros de pages...

Pour ajouter des informations en pied de page de vos PDF, vous devez tout d'abord activer l'utilisation de PHP dans dompdf. 
Rendez vous dans libraries/dompdf/dompdf_config.custom.inc.php et décommentez la ligne 12

define("DOMPDF_ENABLE_PHP", true);

Maintenant dans le template qui vous intéresse, rajoutez le code suivant après l'ouverture de la balise <body>

    <script type="text/php">
      if (isset($pdf)) {
        $font = Font_Metrics::get_font("verdana");;
        $size = 10;
        $color = array(0,0,0);
        $text_height = Font_Metrics::get_font_height($font, $size);

        $w = $pdf->get_width();
        $h = $pdf->get_height();

        $footer = $pdf->open_object();

        // Draw a line along the bottom
        $y = $h - 25;
        $pdf->line(15, $y, $w - 15, $y, $color, 1);

        $y += $text_height / 2;
        $pdf->page_text(15, $y, 'Texte de mon footer', $font, $size, $color);

        $pdf->close_object();
        $pdf->add_object($footer, "all");

        // Center the text
        $width = Font_Metrics::get_text_width("Page 1 of 2", $font, $size);
        $pagenumtxt = t("Page !n of !total", array("!n" => "{PAGE_NUM}", "!total" => "{PAGE_COUNT}"));
        $pdf->page_text($w - 15 - $width, $y, $pagenumtxt, $font, $size, $color);
      }
    </script>

Le code ci-dessous rajoutera une ligne, le texte "Texte de mon footer" et la numérotation des pages à droite. A vous d'adapter ce code pour coller à vos besoins. Pour plus d'options de mises en page, vous pouvez vous pencher sur l'API de dompdf .

J'espère que cet article vous fera gagner du temps lors de la mise en place de PDF avancés, il y aurait encore beaucoup de choses à dire sur le sujet, aussi si vous avez des remarques n'hésitez pas à les donner en commentaires !

Par AlanT
Alan Tondelier

Personnalisez jusqu&#039;à la moelle le template de vos field-collections

Troll matryoshka

Le module field_collections permet de créer des "champs de champs", particulièrement pratique pour accélérer la création de contenus et permettre de simplifier la gestion en back-office. Si vous avez déjà travaillé avec field-collection, vous avez pu vous heurter à un problème lors de la modification de la sortie HTML, ou bien essayé de "themer" différement un des items de votre field-collection. 
Cet article propose un template regroupant l'ensemble de la sortie html d'un field-collection, permettant ainsi d'en simplifier la personnalisation.

Note : Cet article est une réponse "simpliste" à un problème de la communauté Drupal datant du 14 Mai 2011 : https://drupal.org/node/1157794, actuellement la solution proposée n'a pas encore été implémentée. Elle le sera dans la version 2.x de field-collection qui rendra cet article obsolète.

Field Collection, anatomie d'un theming compliqué


Sortie par défaut de field-collection avec formatteur "Field collection items"

Lorsque vous mettez en place un field-collection, drupal va rendre l'html de sortie en passant par ces étapes :

  1. Ajout de l'html pour les variables (modifier/supprimer/ajouter) directement dans une fonction de theming interne au module field_collection,
  2. Passage au fichier de template field.tpl.php pour mettre en place l'html d'enveloppe du champ,
  3. Passage au fichier de template field-collection-item.tpl pour rendre l'html de chaque item de field-collection.

Donc, si je veux personnaliser entièrement la sortie html de mes field-collection , parce-que j'ai envie de faire une intégration html aux petits oignons, la mission va s'avérer assez délicate.

Une solution "maison"

Ce n'est pas la plus élégante des solutions !

Avant tout, la solution proposée n'a pas vocation de remplacer une vraie modification du coeur du module field-collection, bien au contraire, ce que je propose est à mi chemin entre un "hack" et une utilisation conventionnelle des fonctions de theming de Drupal.
Aussi vous pouvez regarder du côté du topic officiel sur drupal.org pour un patch du module permettant (normalement) d'arriver au même résultat.

Cette solution a cependant l'avantage de faire le travail demandé, à savoir personnaliser au maximum la sortie de vos field-collection mais également d'être applicable sans aucune modification de module ou d'installations complémentaires ; en travaillant sur le template.php de votre thème et en modifiant deux fichiers .tpl.php.

Et dès que la version 2.x de field_collection sera sortie, le problème ne se posera plus.

En attendant...

Nous allons travailler dans template.php, remplacez "votre_theme" par le nom système de votre thème "front" :

template.php - hook_preprocess_node()

/**
 * Override or insert variables into the node template.
 */
function votre_theme_preprocess_node(&$variables) {
  if ($variables['view_mode'] == 'full' && node_is_page($variables['node'])) {
    $variables['classes_array'][] = 'node-full';
  }

  // Field Collection Alter - This is required in order to pass the description of the field collection and the "add new item" to $variables.

  if (!empty($variables['content'])) {
    foreach ($variables['content'] as $key => $field) {

      if (isset($field['#field_type']) && $field['#field_type'] === 'field_collection' && $field['#formatter'] === 'field_collection_view') {

        // move description and links from #suffix into separate variables for field_collection_view;
          if ($field['#formatter'] === 'field_collection_view') {

            // remove #prefix - if not, get printed
            $variables['content'][$key]['#prefix'] = '';

            //capture links and description - this is hackish (but works) !
            preg_match("/<div .*>(.*)<\/div>./i", $field['#suffix'], $desc);
            preg_match("/(<ul.*<\/ul>)/i", $field['#suffix'], $links);

            // field_collection global description
            if (isset($desc[1])) {
             $variables['content'][$key]['fc_description'] = $desc[1];
            }

            // field_collection links (add new item to the collection)
            if (isset($links[1])) {
              $variables['content'][$key]['fc_links'] = $links[1];
            }

            //remove #suffix - if not, get printed
            $variables['content'][$key]['#suffix'] = '';

          }

      }

    }

  }
 
}

template.php - hook_preprocess_field

/**
 * Override or insert variables into the field template.
 */
function votre_theme_preprocess_field(&$vars) {

  if (isset($vars['element']['#field_type']) && $vars['element']['#field_type'] === 'field_collection' && $vars['element']['#formatter'] === 'field_collection_view') {

    // move each item into a renderable array and pass html for edit and delete links into simple variables

    foreach ($vars['items'] as $key => &$item) {
      // item
      $item['item'] = array_shift($item['entity']);

      // edit
      if (isset($item['links']['#links']['edit'])) {
        $edit = $item['links']['#links']['edit'];
        $edit = l($edit['title'], $edit['href'], array('query' => $edit['query'],'attributes'=>array('class'=>'field-collection-edit-item')));
        $item['item']['#edit_link'] = $edit;
      }

      // delete
      if (isset($item['links']['#links']['delete'])) {
        $delete = $item['links']['#links']['delete'];
        $delete = l($delete['title'], $delete['href'], array('query' => $delete['query'],'attributes'=>array('class'=>'field-collection-delete-item')));
        $item['item']['#delete_link'] = $delete;
      }

      // pass a nice, renderable array to template file
      $item = $item['item'];

    }

    // add field-collection description
    if (isset($vars['element']['fc_description'])) {
      $vars['fc_description'] = $vars['element']['fc_description'];
    }
    
    // add field-collection links
    if (isset($vars['element']['fc_links'])) {
      $vars['fc_links'] = $vars['element']['fc_links'];
    }

  }
}

Ainsi, nous avons modifié les données transmises au fichiers templates. Les fichiers templates utilisés pour rendre les field-collection n'ont pas changé, il s'agit toujours de field.tpl.php pour l'enveloppe et field-collection-item.tpl.php pour chaque item de la collection. Or avec ce qui a été fait dans template.php, field-collection-item.tpl.php doit renvoyer la plus simple des structure (ie ne pas ajouter d'html).

field-collection-item.tpl.php - à placer dans votre thème

<?php
  print render($content);
?>

Maintenant la partie qui nous intéresse le plus, le template de rendu de votre field-collection : field.tpl.php. Si vous avez suivi le code, vous avez du voir que nous avons rendu disponible le contenu normalement affiché dans field-collection-item directement au niveau de field.tpl.php.

Votre template field.tpl.php est utilisé pour rendre l'html de tout les champs de votre site, vous cibler uniquement les field-collection, nommez le field--field-collection.tpl.php, vous pouvez également mettre différents templates par field-collection et par affichage selon la syntaxe :

  1. field--[nom_systeme_du_field].tpl.php
  2. field--[nom_systeme_du_field]--[nom_systeme_affichage].tpl.php

field--field-collection.tpl.php - à placer dans votre thème

<!-- field-collection wrapper -->
<div class="field-collection">

<?php if (!empty($fc_description)): // description of the field-collection ?>

  <div class="field-collection-description">

    <?php print $fc_description; ?>

  </div>

<?php endif; ?>

<?php foreach ($items as $delta => $item): // loop on each item of the collection ?>

  <div class="field-collection-item">
    <?php
      print render($item);
      // or play with some fields
      // print render($fc_item['my_field']);
    ?>

    <?php if (isset($item['#edit_link']) || isset($item['#delete_link'])): // check that links are available (can be enabled/disabled in display settings) ?>

      <div class="field-collection-item-links">
        <?php print isset($item['#edit_link'])?$item['#edit_link']:NULL; ?>
        <?php print isset($item['#delete_link'])?$item['#delete_link']:NULL; ?>
      </div>

    <?php endif; ?>

  </div>

<?php endforeach; ?>

  <?php print !empty($fc_links)?$fc_links:NULL; // link for adding a new item to the collection ?>

</div>
<!-- end field-collection wrapper -->

Videz vos caches, et normalement votre nouveau template prend le relai dans l'affichage de vos field-collections. À noter que ce template est utilisé uniquement lors de l'affichage "field collection items".


Veillez à mettre le format de sortie sur "field collection items", sinon le template par défaut sera utilisé.

J'espère que cet article vous sera utile, et n'hésitez pas à faire des retours si vous l'implémentez dans vos projets Drupal :)

Par AlanT
Alan Tondelier

Afficher n&#039;importe quel block dans le corps de vos articles Drupal

Par design, les blocks Drupal doivent être placés dans des régions, en-tête, contenu, footer, sidebar, ce mécanisme permet facilement de structurer et de réorganiser rapidement les sections de nos sites.

Cependant il arrive d'avoir besoin d'afficher rapidement un block à l'intérieur même du texte d'un article, ceci peut survenir par exemple lorsque l'on souhaite écrire un premier paragraphe, insérer un block issu d'une vue Drupal puis continuer la rédaction. Je vous présente une méthode simple pour arriver à ce résultat.

Une syntaxe pour les appeler

Afin de placer nos blocks dans le contenu texte des nodes, il faut trouver une solution simple et sécurisée. Le bourrin pourra appeler directement les blocks par du code PHP, mais ce comportement pourra induire de bonnes failles de sécurité.

La solution proposée ici est d'utiliser une chaîne avec une syntaxe prédéfinie qui sera traitée en aval :

{--!block!{module-qui-genere-le-block}{nom-systeme-du-block} # Ici un commentaire ! #--}

Ainsi, en plaçant cette chaîne à l'intérieur de vos textes on évite tout code php et la présence d'un commentaire permet d'indiquer à vos éditeurs ce que fait cette chaîne de caractère "étrange" (et leur évite ainsi d'y toucher...).

Un hook pour les générer

Il va falloir maintenant récupérer cette chaîne de caractère et travailler avec hook_preprocess_node afin de récupérer le block qui nous intéresse. À partir d'ici deux solutions :

  1. On traite notre chaîne dans le template.php du thème de rendu front,
  2. On met en place un module qui va traiter cette chaîne.

Évidemment, la seconde méthode est la meilleure : réutilisabilité du code, possibilité de construire une page d'administration du module (par exemple pour définir quels fields peuvent contenir des blocks et pas seulement le field body), gestion des droits, meilleure intégration dans l'éditeur wysiwyg, etc...

Cependant, mon but ici est avant tout de vous donner une piste qui fonctionne, aussi je vous laisse libre de décider ou traiter cette chaîne.

Dans les deux cas, tout se passe avec hook_preprocess_node :

hook_preprocess_node - ou hook est le nom de votre thème OU de votre module

function hook_preprocess_node(&$variables, $hook) {

  if(isset($variables['content']['body'])){

  $regexGlobal = '/{--(?P<capture>.*)--}/';
  $regexMod = '/!(?P<module>[a-z]+)!/';
  $regexParams = '/{(?P<params>(\w|-)+)}/';
  
  // Get the body value, this can be extended to other fields
  $body = $variables['content']['body'][0]['#markup'];

    if (preg_match($regexGlobal, $body, $matches)) { // if special strings are found

      $capture = $matches['capture'];
      preg_match($regexMod, $capture, $module);

      switch ($module = $module['module']) {
        case 'block':
          // Block code, i used a switch here for extention purpose. For instance we could also fetch a full view, with filters and sorting, with this method...
          preg_match_all($regexParams, $capture, $params); // get block params
          $params = $params['params'];

          // fetch block
          $block = block_load($params[0], $params[1]);
          // the following call ensure that rights, contextual links, and so are functionnal
          $block = _block_get_renderable_array(_block_render_blocks(array($block)));
          $block = drupal_render($block);

          // replace special string with block HTML
          $variables['content']['body'][0]['#markup'] = preg_replace($regexGlobal, $block, $body);

          break;

        case 'my_other_module':
          // do stuff
          break;

        default:
        
          break;
      }

    }

  }

}

Ainsi vous avez une méthode simple et facile à mettre en place pour afficher vos blocks directement dans vos contenus. Bien entendu ceci est un point de départ, à vous d'étendre ce code pour vos besoins.

Et dans un exemple les lier

Ce mécanisme est utilisé sur la page suivante : meetsys.com - les clients.

Vue de l'administration :


Affichage d'un block dans le corps du texte avec cette méthode

 

Pages