Planète

Par admin

Soutenez Cellou et souhaitez lui un bon anniversaire - Urgent

Drupal France soutient Cellou Diallo et demande au préfet de l’Hérault de lui permettre de rester en France.

Il n'est pas habituel que nous vous proposions de soutenir une personne, et ceci restera probablement très exceptionnel, mais nous apprécions Cellou que vous avez pu rencontrer à divers événements Logiciels Libres, et qui s'est impliqué dans les RMLL, le DrupalCamp Montpellier 2014, des sprints, ...

Vous pouvez lui souhaiter un bon anniversaire, 26 mai, en signant la pétition qui donne plus de détails sur sa situation critique sur https://www.change.org/p/m-pr%C3%A9fet-pour-l-annulation-de-l-oqtf-%C3%A...

Merci.

En page d'accueil : 
Par admin

Soutenez Cellou et souhaitez lui un bon anniversaire - Urgent

Drupal France soutient Cellou Diallo et demande au préfet de l’Hérault de lui permettre de rester en France.

Il n'est pas habituel que nous vous proposions de soutenir une personne, et ceci restera probablement très exceptionnel, mais nous apprécions Cellou que vous avez pu rencontrer à divers événements Logiciels Libres, et qui s'est impliqué dans les RMLL, le DrupalCamp Montpellier 2014, des sprints, ...

Vous pouvez lui souhaiter un bon anniversaire, 26 mai, en signant la pétition qui donne plus de détails sur sa situation critique sur https://www.change.org/p/m-pr%C3%A9fet-pour-l-annulation-de-l-oqtf-%C3%A...

Merci.

En page d'accueil : 
Par flocondetoile
Adhérent

Drupal 8 : les profils d'installation, introduction

Les profils d'installation sont la base, comme leur nom l'indique, pour installer Drupal. Mais aussi pour effectuer une première configuration lors de son installation. Cela peut aussi bien être une configuration de base, qu'une configuration avancée pour disposer par exemple d'un site prêt à l'emploi. L'utilisation de ces profils peut permettre aussi bien d'industrialiser la création de sites Internet, ou encore la création de fonctionnalités génériques et éviter ainsi de longues séances, répétitives, de configuration. Faisons un aperçu général du principe de fonctionnement des profils d'installation de Drupal 8.

Par flocondetoile
Adhérent

Drupal 8 : les profils d'installation, introduction

Les profils d'installation sont la base, comme leur nom l'indique, pour installer Drupal. Mais aussi pour effectuer une première configuration lors de son installation. Cela peut aussi bien être une configuration de base, qu'une configuration avancée pour disposer par exemple d'un site prêt à l'emploi. L'utilisation de ces profils peut permettre aussi bien d'industrialiser la création de sites Internet, ou encore la création de fonctionnalités génériques et éviter ainsi de longues séances, répétitives, de configuration. Faisons un aperçu général du principe de fonctionnement des profils d'installation de Drupal 8.

Par flocondetoile
Adhérent

Le futur de Drupal 8

Lors de la keynote de la DrupalCon 2016 (Nouvelle Orléans), Dries Buytaert a fait un point sur l'état de Drupal. Cette keynote est particulièrement intéressante car elle a mis en perspective, et concrétisé, le fait que Drupal 8 dispose désormais d'un modèle et d'une architecture permettant une évolution fonctionnelle plus rapide que ses précédentes versions. Et elle a été l'occasion de formuler de nouvelles propositions, actant ce fait, que la sortie de Drupal 8 en version stable n'était pas l'aboutissement d'une refonte globale de son architecture, mais bien le commencement d'un nouvelle ère.

Revenons sur les moments forts de cette keynote.

Par flocondetoile
Adhérent

Le futur de Drupal 8

Lors de la keynote de la DrupalCon 2016 (Nouvelle Orléans), Dries Buytaert a fait un point sur l'état de Drupal. Cette keynote est particulièrement intéressante car elle a mis en perspective, et concrétisé, le fait que Drupal 8 dispose désormais d'un modèle et d'une architecture permettant une évolution fonctionnelle plus rapide que ses précédentes versions. Et elle a été l'occasion de formuler de nouvelles propositions, actant ce fait, que la sortie de Drupal 8 en version stable n'était pas l'aboutissement d'une refonte globale de son architecture, mais bien le commencement d'un nouvelle ère.

Revenons sur les moments forts de cette keynote.

Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 - Utiliser la Batch API dans un controller

La batch API dans Drupal permet de faire des traitements lourds et/ou long, sans risque d'avoir un temps d’exécution dépassé de la part de son serveur.

Ici, dans le cadre de mon site de pronostics, je voulais faire un traitement permettant de recalculer les points sur l'ensemble des matchs d'une compétitions.

J'ai donc une route définie qui appelle la méthode statique "updateBetsForLeague" de mon controller.

Fonction de qui prépare le batch à traiter :

  public static function updateBetsForLeague(League $league) {
    $games = $league->getGames(); //Je récupère l'ensemble des matchs à traiter
    //Définition du batch
    $batch = [
      'title' => t('Recount League Points'), // Titre de l'opération
      'operations' => [], // tableaux qui contiendra l'ensemble des traitements à effectuer
      'finished' => '\Drupal\mespronos\Controller\BetController::updateBetsForLeagueOver', // méthode qui sera appelé à la fin du traitement 
    ];
    //Définition des opérations 
    // Pour chaque match ($game) on appelle la méthode "updateBetsFromGame" et on lui passe en paramètre le match en question
    foreach ($games as $game) {
      $batch['operations'][] = ['\Drupal\mespronos\Controller\BetController::updateBetsFromGame',[$game]];
    }
    // on paramètre le batch
    batch_set($batch);
    //et on le lance (en lui passant une url de redirection pour la fin du traitement, ici la liste des compétitions
    return batch_process(\Drupal::url('entity.league.collection'));
  }

 

Voici la méthode statique appelée à la fin du batch

  public static function updateBetsForLeagueOver($success, $results, $operations) {
    if ($success) {
      $message = t('Ranking recalculated');
    }
    else {
      $message = t('Finished with an error.');
    }
    drupal_set_message($message);
    return new RedirectResponse(\Drupal::url('entity.league.collection'));
  }

Rien de bien compliqué donc, un seul piège dans lequel je suis tombé, lorsque l'on définie une opération, il faut bien donner le namespace complet de la classe, en effet $batch['operations'][] = ['BetController::updateBetsFromGame',[$game]]; ne fonctionnera pas, mais ne retournera même pas d'erreur...

Par flocondetoile
Adhérent

Drupal 8 : Injecter un formulaire de contact dans un contenu en 5 étapes

Comment insérer un formulaire de contact dans un contenu de Drupal 8 ? Ou sur une page précise à un endroit précis ? Par défaut, les formulaires de contact créés disposent d'une page qui leur est dédiée.  Mais si nous souhaitons les utiliser par ailleurs. Après quelques recherches, j'ai presque cru qu'il faudrait écrire quelques lignes de code pour créer un Plugin spécifique. Mais non...

Par flocondetoile
Adhérent

Drupal 8 : Injecter un formulaire de contact dans un contenu en 5 étapes

Comment insérer un formulaire de contact dans un contenu de Drupal 8 ? Ou sur une page précise à un endroit précis ? Par défaut, les formulaires de contact créés disposent d'une page qui leur est dédiée.  Mais si nous souhaitons les utiliser par ailleurs. Après quelques recherches, j'ai presque cru qu'il faudrait écrire quelques lignes de code pour créer un Plugin spécifique. Mais non...

Par admin

DrupalCamp Nantes - 10, 11 et 12 juin 2016

Fichier attaché Taille
PDF iconCommuniqué de presse 545.08 Ko

Vous avez peut-être remarqué la bannière sur le site depuis un moment, formalisons cette annonce : c’est la seconde fois que cet évènement national se déroule à Nantes. Venez donc nous retrouver, échanger, apprendre et partager autour de Drupal. Cette édition 2016 se déroulera sur 3 jours, à l’Epitech Nantes, du vendredi 10 au dimanche 12 juin 2016.

3 jours rythmés par des conférences, des lightning talks et des ateliers
Au sein de l’Epitech de Nantes, les participants pourront assister à des conférences sur les journées de vendredi et samedi.
Pas d’hésitation, ni de choix, une seule conférence est donnée à la fois, ce qui permet à tous les participants de profiter des contenus riches de l’évènement. Sur ces deux jours plus d’une dizaine de sujets seront proposés, en plénière ou dans le cadre de discussions plus informelles en parallèle (lightning talks).
Le dimanche est réservé aux sprints et ateliers. Les contributeurs se regroupent, sur un sujet commun, permettant de faire avancer le CMS (développement pour Drupal 8 et Drupal 7, traduction en français, documentation, …).

Sprints, conférences et discussions sont accessibles à tous les niveaux techniques et fonctionnels, à tous les profils du développeur à l’utilisateur. Toutes ces rencontres se font dans la bonne humeur, des soirées étant aussi organisées les vendredi et samedi soirs.

Venez nombreux(ses) !

Horaires : de 9h à 18h30
Lieu : 5 Rue d'Alger, 44000 Nantes
Billet : entrée pour une journée 10€ (vendredi ou samedi). Entrée pour les 2 jours 15€ (repas du midi compris). Dimanche gratuit.
Contact presse :
Site : http://nantes2016.drupalcamp.fr/
Email : dcn2016@listes.drupalfr.org

En page d'accueil : 
Par admin

DrupalCamp Nantes - 10, 11 et 12 juin 2016

Fichier attaché Taille
PDF iconCommuniqué de presse 545.08 Ko

Vous avez peut-être remarqué la bannière sur le site depuis un moment, formalisons cette annonce : c’est la seconde fois que cet évènement national se déroule à Nantes. Venez donc nous retrouver, échanger, apprendre et partager autour de Drupal. Cette édition 2016 se déroulera sur 3 jours, à l’Epitech Nantes, du vendredi 10 au dimanche 12 juin 2016.

3 jours rythmés par des conférences, des lightning talks et des ateliers
Au sein de l’Epitech de Nantes, les participants pourront assister à des conférences sur les journées de vendredi et samedi.
Pas d’hésitation, ni de choix, une seule conférence est donnée à la fois, ce qui permet à tous les participants de profiter des contenus riches de l’évènement. Sur ces deux jours plus d’une dizaine de sujets seront proposés, en plénière ou dans le cadre de discussions plus informelles en parallèle (lightning talks).
Le dimanche est réservé aux sprints et ateliers. Les contributeurs se regroupent, sur un sujet commun, permettant de faire avancer le CMS (développement pour Drupal 8 et Drupal 7, traduction en français, documentation, …).

Sprints, conférences et discussions sont accessibles à tous les niveaux techniques et fonctionnels, à tous les profils du développeur à l’utilisateur. Toutes ces rencontres se font dans la bonne humeur, des soirées étant aussi organisées les vendredi et samedi soirs.

Venez nombreux(ses) !

Horaires : de 9h à 18h30
Lieu : 5 Rue d'Alger, 44000 Nantes
Billet : entrée pour une journée 10€ (vendredi ou samedi). Entrée pour les 2 jours 15€ (repas du midi compris). Dimanche gratuit.
Contact presse :
Site : http://nantes2016.drupalcamp.fr/
Email : dcn2016@listes.drupalfr.org

En page d'accueil : 
Par admin

DrupalCamp Nantes - 10, 11 et 12 juin 2016

Fichier attaché Taille
Icône PDFCommuniqué de presse 545.08 Ko

Vous avez peut-être remarqué la bannière sur le site depuis un moment, formalisons cette annonce : c’est la seconde fois que cet évènement national se déroule à Nantes. Venez donc nous retrouver, échanger, apprendre et partager autour de Drupal. Cette édition 2016 se déroulera sur 3 jours, à l’Epitech Nantes, du vendredi 10 au dimanche 12 juin 2016.

3 jours rythmés par des conférences, des lightning talks et des ateliers
Au sein de l’Epitech de Nantes, les participants pourront assister à des conférences sur les journées de vendredi et samedi.
Pas d’hésitation, ni de choix, une seule conférence est donnée à la fois, ce qui permet à tous les participants de profiter des contenus riches de l’évènement. Sur ces deux jours plus d’une dizaine de sujets seront proposés, en plénière ou dans le cadre de discussions plus informelles en parallèle (lightning talks).
Le dimanche est réservé aux sprints et ateliers. Les contributeurs se regroupent, sur un sujet commun, permettant de faire avancer le CMS (développement pour Drupal 8 et Drupal 7, traduction en français, documentation, …).

Sprints, conférences et discussions sont accessibles à tous les niveaux techniques et fonctionnels, à tous les profils du développeur à l’utilisateur. Toutes ces rencontres se font dans la bonne humeur, des soirées étant aussi organisées les vendredi et samedi soirs.

Venez nombreux(ses) !

Horaires : de 9h à 18h30
Lieu : 5 Rue d'Alger, 44000 Nantes
Billet : entrée pour une journée 10€ (vendredi ou samedi). Entrée pour les 2 jours 15€ (repas du midi compris). Dimanche gratuit.
Contact presse :
Site : http://nantes2016.drupalcamp.fr/
Email : dcn2016@listes.drupalfr.org

En page d'accueil : 
Par Kgaut
Adhérent
Kevin Gautreau

Drupal 8 & Composer - Appliquer un patch dans le fichier composer.json

Si vous utilisez composer pour gérer votre instance de Drupal 8, vous avez parfois besoin d'appliquer un patch (de votre conception ou depuis drupal.org) que ce soit pour un module tiers ou pour le core.

Si on est "à l'ancienne" on a le core et les module sous gestionnaire de version (git par exemple), cela reste simple, vous appliquez le patch et commitez le tout.

En utilisant composer, nous avons uniquement le "cutom" qui est versionné, avec les fichiers composer.json et composer.lock qui contiennent la liste des modules utilisés et leurs version spécifique. Donc pas possible d'appliquer un patch comme plus haut.

Par contre on peut à l'aide d'un dépendance spécifier les patchs que l'on veut utiliser directement dans le fichier composer.json, regardez si ça ce trouve le module est déjà installé; il s'agit de cweagans/composer-patches.

s'il n'est pas présent : 

composer require cweagans/composer-patches

ensuite pour appliquer un patch, on doit ajouter les éléments suivants dans la partie "extra" du fichier composer.json :

"patches": {
  "package": {
    "description libre": "Url du patch"
  }
}

exemple pour un patch pour mimemail :

"patches": {
  "drupal/mimemail": {
    "Fix mimemail error on admin form": "https://www.drupal.org/files/issues/mime-mail-error-message-on-admin-form-with-webprorfiler-2719981-3.patch"
  }
}

si vous avez plusieurs patchs pour un même module, séparez-les par une virgule :

"patches": {
  "drupal/mimemail": {
    "Fix mimemail error on admin form": "https://www.drupal.org/files/issues/mime-mail-error-message-on-admin-form-with-webprorfiler-2719981-3.patch",
    "patch 2": "https://www.drupal.org/files/issues/mime-mail-error-message-on-admin-form-with-webprorfiler-2719981-3qdqsdqsd.patch"
  },
  "drupal/monautremodule": {
    "ma description du patch": "https://www.drupal.org/files/issues/mimhfhmin-form-with-webprorfiler-2719981-3.patch",
  }
}

si vous avez plusieurs modules à patcher, même principe :

"patches": {
  "drupal/mimemail": {
    "Fix mimemail error on admin form": "https://www.drupal.org/files/issues/mime-mail-error-message-on-admin-form-with-webprorfiler-2719981-3.patch",
    "patch 2": "https://www.drupal.org/files/issues/mime-mail-error-message-on-admin-form-with-webprorfiler-2719981-3qdqsdqsd.patch"
  }
}

enfin update et install pour que le(s) modules patchés soient supprimés, re-téléchargés et enfin patchés.

composer update
composer install

 

Par Artusamak
Julien Dubois

Drupal 8 : Webservices REST

Drupal 8 : Webservices REST
lun, 02/05/2016 - 09:46
Artusamak

Cet article est extrait de notre formation drupal 8 "de Drupal 7 à Drupal 8" à destination des développeurs. N'hésitez pas à nous contacter pour en savoir plus !

Les services web sont un principe permettant à des applications de communiquer entre elles à distance, via Internet, et ceci indépendamment des plates-formes et des langages sur lesquelles elles reposent.

Il n'y a donc pas de différence fondamentale entre l'interaction d'un navigateur avec une ressource et celle d'un service web avec une ressource. Ce qui diffère se situe au niveau du format de la représentation des données renvoyé dans la réponse : HTML pour les navigateurs, XML ou JSON pour les services web.

Un point rapide sur HAL

HAL, ou encore Hypertext Application Language, est un format fournissant une manière simple et consistante de fournir des liens entres diverses ressources d’une API.

HAL permet de rendre les APIs plus facilement explorables et d’une certaine manière d’intégrer directement la documentation de l’API dans cette dernière. Elle peut fournir la manière d'interroger une ressource liée à la ressource actuellement interrogée au sein même de la réponse. Exemples : les liens vers les pages précédente et suivante dans le cadre d’une ressource qui liste des contenus ou encore le lien vers l’édition du profil de l’utilisateur lorsque l’on récupère son profil pour consultation.

REST et Drupal 8

Dans le cœur de Drupal 8, les interactions avec les entités de contenu sont supportées via une interface REST. Par défaut, les méthodes HTTP supportées sont GET, POST, PATCH et DELETE.

Le module REST est dépendant du module Serialisation qui fourni les représentations JSON et XML des entités. D’autres représentations  sérialisées sont disponibles en activant le module HAL par exemple.

Le module REST de Drupal 8 ne possède aucune interface graphique. Les modifications et ajustements de configuration doivent s’effectuer directement en surchargeant les fichiers de configuration YAML de Drupal.

Récupération d’informations

L’opération la plus simple est la récupération des informations d’une entité.

Par défaut, l’ensemble des opérations sont disponibles sur les entités de contenu de type nœud, il est néanmoins possible de personnaliser ce comportement (par exemple, changer le format de sortie en json ou xml, ou encore rajouter une méthode d’authentification telle que oauth par exemple).

Pour ce faire, il faut tout d’abord exporter la configuration du module REST. La configuration de base devrait ressembler à ceci. (Configuration > Configuration synchronization  > Export > Single item)

<span class="token comment" spellcheck="true"># rest.settings.yml</span>
<span class="token comment" spellcheck="true"># Example configuration for enabling REST resources.</span>
<span class="token key atrule">resources</span><span class="token punctuation">:</span>
  <span class="token comment" spellcheck="true"># Enable the node resource.</span>
  <span class="token key atrule">'entity:node'</span><span class="token punctuation">:</span>
    <span class="token key atrule">GET</span><span class="token punctuation">:</span>
      <span class="token key atrule">supported_formats</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> hal_json
      <span class="token key atrule">supported_auth</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> basic_auth
  <span class="token comment" spellcheck="true"># Enable the taxonomy term resource.</span>
  <span class="token key atrule">'entity:taxonomy_term'</span><span class="token punctuation">:</span>
    <span class="token key atrule">GET</span><span class="token punctuation">:</span>
      <span class="token key atrule">supported_formats</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> hal_json
      <span class="token key atrule">supported_auth</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> basic_auth

Des modifications peuvent alors être apportées en modifiant ce fichier YAML puis en important à nouveau cette configuration dans Drupal.

Exemple : pour autoriser le format de données XML, la configuration de la ressource node sur la méthode GET deviendrait :

  <span class="token comment" spellcheck="true"># rest.settings.yml</span>
  <span class="token comment" spellcheck="true"># Enable the node resource.</span>
  <span class="token key atrule">'entity:node'</span><span class="token punctuation">:</span>
    <span class="token key atrule">GET</span><span class="token punctuation">:</span>
      <span class="token key atrule">supported_formats</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> hal_json
        <span class="token punctuation">-</span> xml

À noter qu’un module de la communauté existe afin de fournir une interface graphique pour réaliser ceci : RestUI

Exemple de mise en oeuvre :

Après avoir créé un contenu, activez le module RESTFul Web Services ainsi que HAL

N’oubliez pas de configurer les permissions.

A présent, à l’aide d’un navigateur non connecté sur votre instance Drupal, rendez-vous agrave; l’adresse “ http://d8.dev/node/1?_format=hal_json”.

Voici un exemple ce que vous obtiendrez.

(Le contenu est volontairement tronqué dans cet exemple)

Création de contenu

Afin de pouvoir créer du contenu à l’aide des modules de webservices de Drupal 8, il est impératif d’activer le module core HAL.

Comme il s’agit ici de création de contenu, cette opération va probablement devoir être sécurisée (seul un utilisateur possédant les droits de création de contenu doit être accepté). C’est pourquoi nous allons activer le module HTTP Basic Authentication qui fourni la méthode authentification “Basic” la plus simple.

Afin de créer un contenu, il convient de créer une requêtes sur l’adresse http://<site_drupal>/entity/<entity_type>.

Pour s’identifier, le client HTTP doit envoyer la requête en spécifiant l'en-tête HTTP « Authorization » et avec la valeur de connexion. Celle-ci est composée de la méthode utilisée (Basic) suivie de la représentation en Base64 du nom de l'utilisateur et du mot de passe séparés par le caractère « : » (deux-points).

Protection supplémentaire, il faut également fournir un en-tête HTTP « X-CSRF-Token ». Ce dernier est récupérable à l’adresse rest/session/token de votre site.

Il faut néanmoins rester vigilant car de nombreux contenus Drupal sont composés d’entités liées entres-elles. Par exemple, si l’on souhaite créer un commentaire, il faut pouvoir le lier à un utilisateur. Pour ce faire, il est nécessaire de renseigner ce lien grâce à l’entrée “ _links ” du JSON.

Afin de recréer ce lien, il est plus simple de tout d’abord effectuer un appel GET sur cette ressource et d’en étudier ses entrées “ _links ”.

Les entrées du tableau “ _links ” sont créées et normalisées par le module >HAL (voir premier paragraphe du chapitre).

Pour résumer

Requête

http://example.com/entity/node

Headers

Nom de l’en-tête

Valeur de l’en-tête

X-CSRF-Token

(récupéré via rest/session/token)

Authorization

Basic (Hash base 64 username/password)

Content-Type

application/hal+json

Corps
{
"_links": {
   "type": {
     "href": "http://example.com/rest/type/node/article"
   }
},
"title": {
   "value": "Test Article 2"
},
"type": {
   "target_id": "article"
}
}

Mise à jour de contenu

Il est également possible de mettre à jour des contenus grâce au verbe HTTP PATCH .

Afin de pouvoir créer du contenu à l’aide des modules de webservices de Drupal 8, il est impératif d’activer le module core HAL ainsi que HTTP Basic Authentication.

Afin de mettre à jour un contenu, il convient de créer une requête sur l’adresse http://<site_drupal>/node/<nid>.

À l’instar de la création de contenu, il est également nécessaire de passer les en-têtes HTTP « Authorization » et « X-CSRF-Token ».

Pour résumer

Requête

http://example.com/node/<nid>

Headers

Nom de l’en-tête

Valeur de l’en-tête

X-CSRF-Token

(récupéré via rest/session/token)

Authorization

Basic (Hash base 64 username/password)

Content-Type

application/hal+json

Corps
{
"_links": {
   "type": {
     "href": "http://example.com/rest/type/node/article"
   }
},
"nid": {
   "": {
     "value": "8"
   }
},
"type": {
   "target_id": "article"
},
"promote": {
   "value": "1"
},
"body": {
   "": {
     "value": "foo bar baz", "lang": "en"
  }
}
}

 

Suppression de contenu

A l'aide du verbe HTTP DELETE, il est bien sur possible de supprimer des entités. Le fonctionnement presque identique au méthodes précédentes.

Requête

https://example.com/node/<nid>

Headers

Nom de l’en-tête

Valeur de l’en-tête

X-CSRF-Token

(récupéré via rest/session/token)

Authorization

Basic (Hash base 64 username/password)

Tags
Par Artusamak
Julien Dubois

Drupal 8 : Webservices REST

Drupal 8 : Webservices REST
Artusamak
lun 02/05/2016 - 09:46

Cet article est extrait de notre formation drupal 8 "de Drupal 7 à Drupal 8" à destination des développeurs. N'hésitez pas à nous contacter pour en savoir plus !

Les services web sont un principe permettant à des applications de communiquer entre elles à distance, via Internet, et ceci indépendamment des plates-formes et des langages sur lesquelles elles reposent.

Il n'y a donc pas de différence fondamentale entre l'interaction d'un navigateur avec une ressource et celle d'un service web avec une ressource. Ce qui diffère se situe au niveau du format de la représentation des données renvoyé dans la réponse : HTML pour les navigateurs, XML ou JSON pour les services web.

Un point rapide sur HAL

HAL, ou encore Hypertext Application Language, est un format fournissant une manière simple et consistante de fournir des liens entres diverses ressources d’une API.

HAL permet de rendre les APIs plus facilement explorables et d’une certaine manière d’intégrer directement la documentation de l’API dans cette dernière. Elle peut fournir la manière d'interroger une ressource liée à la ressource actuellement interrogée au sein même de la réponse. Exemples : les liens vers les pages précédente et suivante dans le cadre d’une ressource qui liste des contenus ou encore le lien vers l’édition du profil de l’utilisateur lorsque l’on récupère son profil pour consultation.

REST et Drupal 8

Dans le cœur de Drupal 8, les interactions avec les entités de contenu sont supportées via une interface REST. Par défaut, les méthodes HTTP supportées sont GET, POST, PATCH et DELETE.

Le module REST est dépendant du module Serialisation qui fourni les représentations JSON et XML des entités. D’autres représentations  sérialisées sont disponibles en activant le module HAL par exemple.

Le module REST de Drupal 8 ne possède aucune interface graphique. Les modifications et ajustements de configuration doivent s’effectuer directement en surchargeant les fichiers de configuration YAML de Drupal.

Récupération d’informations

L’opération la plus simple est la récupération des informations d’une entité.

Par défaut, l’ensemble des opérations sont disponibles sur les entités de contenu de type nœud, il est néanmoins possible de personnaliser ce comportement (par exemple, changer le format de sortie en json ou xml, ou encore rajouter une méthode d’authentification telle que oauth par exemple).

Pour ce faire, il faut tout d’abord exporter la configuration du module REST. La configuration de base devrait ressembler à ceci. (Configuration > Configuration synchronization  > Export > Single item)

<span class="token comment" spellcheck="true"># rest.settings.yml</span>
<span class="token comment" spellcheck="true"># Example configuration for enabling REST resources.</span>
<span class="token key atrule">resources</span><span class="token punctuation">:</span>
  <span class="token comment" spellcheck="true"># Enable the node resource.</span>
  <span class="token key atrule">'entity:node'</span><span class="token punctuation">:</span>
    <span class="token key atrule">GET</span><span class="token punctuation">:</span>
      <span class="token key atrule">supported_formats</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> hal_json
      <span class="token key atrule">supported_auth</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> basic_auth
  <span class="token comment" spellcheck="true"># Enable the taxonomy term resource.</span>
  <span class="token key atrule">'entity:taxonomy_term'</span><span class="token punctuation">:</span>
    <span class="token key atrule">GET</span><span class="token punctuation">:</span>
      <span class="token key atrule">supported_formats</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> hal_json
      <span class="token key atrule">supported_auth</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> basic_auth

Des modifications peuvent alors être apportées en modifiant ce fichier YAML puis en important à nouveau cette configuration dans Drupal.

Exemple : pour autoriser le format de données XML, la configuration de la ressource node sur la méthode GET deviendrait :

  <span class="token comment" spellcheck="true"># rest.settings.yml</span>
  <span class="token comment" spellcheck="true"># Enable the node resource.</span>
  <span class="token key atrule">'entity:node'</span><span class="token punctuation">:</span>
    <span class="token key atrule">GET</span><span class="token punctuation">:</span>
      <span class="token key atrule">supported_formats</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> hal_json
        <span class="token punctuation">-</span> xml

À noter qu’un module de la communauté existe afin de fournir une interface graphique pour réaliser ceci : RestUI

Exemple de mise en oeuvre :

Après avoir créé un contenu, activez le module RESTFul Web Services ainsi que HAL

N’oubliez pas de configurer les permissions.

A présent, à l’aide d’un navigateur non connecté sur votre instance Drupal, rendez-vous à l’adresse “ http://d8.dev/node/1?_format=hal_json”.

Voici un exemple ce que vous obtiendrez.

(Le contenu est volontairement tronqué dans cet exemple)

Création de contenu

Afin de pouvoir créer du contenu à l’aide des modules de webservices de Drupal 8, il est impératif d’activer le module core HAL.

Comme il s’agit ici de création de contenu, cette opération va probablement devoir être sécurisée (seul un utilisateur possédant les droits de création de contenu doit être accepté). C’est pourquoi nous allons activer le module HTTP Basic Authentication qui fourni la méthode authentification “Basic” la plus simple.

Afin de créer un contenu, il convient de créer une requêtes sur l’adresse http://<site_drupal>/entity/<entity_type>.

Pour s’identifier, le client HTTP doit envoyer la requête en spécifiant l'en-tête HTTP « Authorization » et avec la valeur de connexion. Celle-ci est composée de la méthode utilisée (Basic) suivie de la représentation en Base64 du nom de l'utilisateur et du mot de passe séparés par le caractère « : » (deux-points).

Protection supplémentaire, il faut également fournir un en-tête HTTP « X-CSRF-Token ». Ce dernier est récupérable à l’adresse rest/session/token de votre site.

Il faut néanmoins rester vigilant car de nombreux contenus Drupal sont composés d’entités liées entres-elles. Par exemple, si l’on souhaite créer un commentaire, il faut pouvoir le lier à un utilisateur. Pour ce faire, il est nécessaire de renseigner ce lien grâce à l’entrée “ _links ” du JSON.

Afin de recréer ce lien, il est plus simple de tout d’abord effectuer un appel GET sur cette ressource et d’en étudier ses entrées “ _links ”.

Les entrées du tableau “ _links ” sont créées et normalisées par le module >HAL (voir premier paragraphe du chapitre).

Pour résumer

Requête

http://example.com/entity/node

Headers

Nom de l’en-tête

Valeur de l’en-tête

X-CSRF-Token

(récupéré via rest/session/token)

Authorization

Basic (Hash base 64 username/password)

Content-Type

application/hal+json

Corps
{
"_links": {
   "type": {
     "href": "http://example.com/rest/type/node/article"
   }
},
"title": {
   "value": "Test Article 2"
},
"type": {
   "target_id": "article"
}
}

Mise à jour de contenu

Il est également possible de mettre à jour des contenus grâce au verbe HTTP PATCH .

Afin de pouvoir créer du contenu à l’aide des modules de webservices de Drupal 8, il est impératif d’activer le module core HAL ainsi que HTTP Basic Authentication.

Afin de mettre à jour un contenu, il convient de créer une requête sur l’adresse http://<site_drupal>/node/<nid>.

À l’instar de la création de contenu, il est également nécessaire de passer les en-têtes HTTP « Authorization » et « X-CSRF-Token ».

Pour résumer

Requête

http://example.com/node/<nid>

Headers

Nom de l’en-tête

Valeur de l’en-tête

X-CSRF-Token

(récupéré via rest/session/token)

Authorization

Basic (Hash base 64 username/password)

Content-Type

application/hal+json

Corps
{
"_links": {
   "type": {
     "href": "http://example.com/rest/type/node/article"
   }
},
"nid": {
   "": {
     "value": "8"
   }
},
"type": {
   "target_id": "article"
},
"promote": {
   "value": "1"
},
"body": {
   "": {
     "value": "foo bar baz", "lang": "en"
  }
}
}

 

Suppression de contenu

A l'aide du verbe HTTP DELETE, il est bien sur possible de supprimer des entités. Le fonctionnement presque identique au méthodes précédentes.

Requête

https://example.com/node/<nid>

Headers

Nom de l’en-tête

Valeur de l’en-tête

X-CSRF-Token

(récupéré via rest/session/token)

Authorization

Basic (Hash base 64 username/password)

Par Artusamak
Julien Dubois

Drupal 8 : Webservices REST

Drupal 8 : Webservices REST
Artusamak
lun 02/05/2016 - 09:46

Cet article est extrait de notre formation drupal 8 "de Drupal 7 à Drupal 8" à destination des développeurs. N'hésitez pas à nous contacter pour en savoir plus !

Les services web sont un principe permettant à des applications de communiquer entre elles à distance, via Internet, et ceci indépendamment des plates-formes et des langages sur lesquelles elles reposent.

Il n'y a donc pas de différence fondamentale entre l'interaction d'un navigateur avec une ressource et celle d'un service web avec une ressource. Ce qui diffère se situe au niveau du format de la représentation des données renvoyé dans la réponse : HTML pour les navigateurs, XML ou JSON pour les services web.

Un point rapide sur HAL

HAL, ou encore Hypertext Application Language, est un format fournissant une manière simple et consistante de fournir des liens entres diverses ressources d’une API.

HAL permet de rendre les APIs plus facilement explorables et d’une certaine manière d’intégrer directement la documentation de l’API dans cette dernière. Elle peut fournir la manière d'interroger une ressource liée à la ressource actuellement interrogée au sein même de la réponse. Exemples : les liens vers les pages précédente et suivante dans le cadre d’une ressource qui liste des contenus ou encore le lien vers l’édition du profil de l’utilisateur lorsque l’on récupère son profil pour consultation.

REST et Drupal 8

Dans le cœur de Drupal 8, les interactions avec les entités de contenu sont supportées via une interface REST. Par défaut, les méthodes HTTP supportées sont GET, POST, PATCH et DELETE.

Le module REST est dépendant du module Serialisation qui fourni les représentations JSON et XML des entités. D’autres représentations  sérialisées sont disponibles en activant le module HAL par exemple.

Le module REST de Drupal 8 ne possède aucune interface graphique. Les modifications et ajustements de configuration doivent s’effectuer directement en surchargeant les fichiers de configuration YAML de Drupal.

Récupération d’informations

L’opération la plus simple est la récupération des informations d’une entité.

Par défaut, l’ensemble des opérations sont disponibles sur les entités de contenu de type nœud, il est néanmoins possible de personnaliser ce comportement (par exemple, changer le format de sortie en json ou xml, ou encore rajouter une méthode d’authentification telle que oauth par exemple).

Pour ce faire, il faut tout d’abord exporter la configuration du module REST. La configuration de base devrait ressembler à ceci. (Configuration > Configuration synchronization  > Export > Single item)

<span class="token comment" spellcheck="true"># rest.settings.yml</span>
<span class="token comment" spellcheck="true"># Example configuration for enabling REST resources.</span>
<span class="token key atrule">resources</span><span class="token punctuation">:</span>
  <span class="token comment" spellcheck="true"># Enable the node resource.</span>
  <span class="token key atrule">'entity:node'</span><span class="token punctuation">:</span>
    <span class="token key atrule">GET</span><span class="token punctuation">:</span>
      <span class="token key atrule">supported_formats</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> hal_json
      <span class="token key atrule">supported_auth</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> basic_auth
  <span class="token comment" spellcheck="true"># Enable the taxonomy term resource.</span>
  <span class="token key atrule">'entity:taxonomy_term'</span><span class="token punctuation">:</span>
    <span class="token key atrule">GET</span><span class="token punctuation">:</span>
      <span class="token key atrule">supported_formats</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> hal_json
      <span class="token key atrule">supported_auth</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> basic_auth

Des modifications peuvent alors être apportées en modifiant ce fichier YAML puis en important à nouveau cette configuration dans Drupal.

Exemple : pour autoriser le format de données XML, la configuration de la ressource node sur la méthode GET deviendrait :

  <span class="token comment" spellcheck="true"># rest.settings.yml</span>
  <span class="token comment" spellcheck="true"># Enable the node resource.</span>
  <span class="token key atrule">'entity:node'</span><span class="token punctuation">:</span>
    <span class="token key atrule">GET</span><span class="token punctuation">:</span>
      <span class="token key atrule">supported_formats</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> hal_json
        <span class="token punctuation">-</span> xml

À noter qu’un module de la communauté existe afin de fournir une interface graphique pour réaliser ceci : RestUI

Exemple de mise en oeuvre :

Après avoir créé un contenu, activez le module RESTFul Web Services ainsi que HAL

N’oubliez pas de configurer les permissions.

A présent, à l’aide d’un navigateur non connecté sur votre instance Drupal, rendez-vous à l’adresse “ http://d8.dev/node/1?_format=hal_json”.

Voici un exemple ce que vous obtiendrez.

(Le contenu est volontairement tronqué dans cet exemple)

Création de contenu

Afin de pouvoir créer du contenu à l’aide des modules de webservices de Drupal 8, il est impératif d’activer le module core HAL.

Comme il s’agit ici de création de contenu, cette opération va probablement devoir être sécurisée (seul un utilisateur possédant les droits de création de contenu doit être accepté). C’est pourquoi nous allons activer le module HTTP Basic Authentication qui fourni la méthode authentification “Basic” la plus simple.

Afin de créer un contenu, il convient de créer une requêtes sur l’adresse http://<site_drupal>/entity/<entity_type>.

Pour s’identifier, le client HTTP doit envoyer la requête en spécifiant l'en-tête HTTP « Authorization » et avec la valeur de connexion. Celle-ci est composée de la méthode utilisée (Basic) suivie de la représentation en Base64 du nom de l'utilisateur et du mot de passe séparés par le caractère « : » (deux-points).

Protection supplémentaire, il faut également fournir un en-tête HTTP « X-CSRF-Token ». Ce dernier est récupérable à l’adresse rest/session/token de votre site.

Il faut néanmoins rester vigilant car de nombreux contenus Drupal sont composés d’entités liées entres-elles. Par exemple, si l’on souhaite créer un commentaire, il faut pouvoir le lier à un utilisateur. Pour ce faire, il est nécessaire de renseigner ce lien grâce à l’entrée “ _links ” du JSON.

Afin de recréer ce lien, il est plus simple de tout d’abord effectuer un appel GET sur cette ressource et d’en étudier ses entrées “ _links ”.

Les entrées du tableau “ _links ” sont créées et normalisées par le module >HAL (voir premier paragraphe du chapitre).

Pour résumer

Requête

http://example.com/entity/node

Headers

Nom de l’en-tête

Valeur de l’en-tête

X-CSRF-Token

(récupéré via rest/session/token)

Authorization

Basic (Hash base 64 username/password)

Content-Type

application/hal+json

Corps
{
"_links": {
   "type": {
     "href": "http://example.com/rest/type/node/article"
   }
},
"title": {
   "value": "Test Article 2"
},
"type": {
   "target_id": "article"
}
}

Mise à jour de contenu

Il est également possible de mettre à jour des contenus grâce au verbe HTTP PATCH .

Afin de pouvoir créer du contenu à l’aide des modules de webservices de Drupal 8, il est impératif d’activer le module core HAL ainsi que HTTP Basic Authentication.

Afin de mettre à jour un contenu, il convient de créer une requête sur l’adresse http://<site_drupal>/node/<nid>.

À l’instar de la création de contenu, il est également nécessaire de passer les en-têtes HTTP « Authorization » et « X-CSRF-Token ».

Pour résumer

Requête

http://example.com/node/<nid>

Headers

Nom de l’en-tête

Valeur de l’en-tête

X-CSRF-Token

(récupéré via rest/session/token)

Authorization

Basic (Hash base 64 username/password)

Content-Type

application/hal+json

Corps
{
"_links": {
   "type": {
     "href": "http://example.com/rest/type/node/article"
   }
},
"nid": {
   "": {
     "value": "8"
   }
},
"type": {
   "target_id": "article"
},
"promote": {
   "value": "1"
},
"body": {
   "": {
     "value": "foo bar baz", "lang": "en"
  }
}
}

 

Suppression de contenu

A l'aide du verbe HTTP DELETE, il est bien sur possible de supprimer des entités. Le fonctionnement presque identique au méthodes précédentes.

Requête

https://example.com/node/<nid>

Headers

Nom de l’en-tête

Valeur de l’en-tête

X-CSRF-Token

(récupéré via rest/session/token)

Authorization

Basic (Hash base 64 username/password)

Par flocondetoile
Adhérent

To Twig or not to Twig ? That is Drupal 8

Avec le remplacement du vénérable PHPTemplate par Twig comme moteur de template pour Drupal 8, la conception des pages et de leurs agencements a pris une nouvelle dimension.

Autant sur Drupal 7 des solutions comme Panels ou Display suite étaient privilégiées, car travailler en profondeur dans des templates mixant deux languages (PHP et HTML), dont le premier est particulièrement verbeux, pouvait très vite devenir illisible et inmaintenable, autant l'arrivée de Twig avec Drupal 8 peut changer radicalement cette perspective. Quels sont les avantages de chacune des solutions à notre disposition ? Que faut-il privilégier ? Essayons de dégager quelques éléments de réflexion.

Par flocondetoile
Adhérent

To Twig or not to Twig ? That is Drupal 8

Avec le remplacement du vénérable PHPTemplate par Twig comme moteur de template pour Drupal 8, la conception des pages et de leurs agencements a pris une nouvelle dimension.

Autant sur Drupal 7 des solutions comme Panels ou Display suite étaient privilégiées, car travailler en profondeur dans des templates mixant deux languages (PHP et HTML), dont le premier est particulièrement verbeux, pouvait très vite devenir illisible et inmaintenable, autant l'arrivée de Twig avec Drupal 8 peut changer radicalement cette perspective. Quels sont les avantages de chacune des solutions à notre disposition ? Que faut-il privilégier ? Essayons de dégager quelques éléments de réflexion.

Par Artusamak
Julien Dubois

Drupal 8 : Concevoir votre application pour Drupal 8

Drupal 8 : Concevoir votre application pour Drupal 8
jeu, 28/04/2016 - 09:43
Artusamak

Cet article est extrait de notre formation drupal 8 "de Drupal 7 à Drupal 8" à destination des développeurs. N'hésitez pas à nous contacter pour en savoir plus !

Combien parmi vous se revendiquent “développeur Drupal” plutôt que “développeur PHP” ? Cela est probablement dû au fait que Drupal fonctionne grâce à un certain nombre de couches d’abstractions qui lui sont propres et que si demain vous étiez privé(e) de Drupal vous vous sentiriez démuni(e) sans Form API, Entity API, Views ou Batch API.

En pointant cela du doigt on se rend compte de la richesse d’un outil mais on peut aussi se demander si cela n’est pas une erreur. En utilisant un composant drupalo-drupalien, vous ne pourrez pas vous en resservir en changeant de technologie et c’est bien dommage. C’est une des raisons pour lesquelles Drupal 8 s’est ouvert sur le monde extérieur. Pouvoir bénéficier de composants connus et réutilisables. On parle ici de Twig, de HTTPKernel et HTTPFoundation, de l’autoloader PSR, de Guzzle, etc. D’ailleurs tout n’est pas à jeter dans Drupal, si Views devenait un composant proprement découplé il pourrait être réutilisé dans d’autres applications. Les développeurs de Commerce 2.x sont dans cet état d’esprit de design par composants indépendants et réutilisables et il est probable que cela soit une tendance de fond sur les années à venir.

L’idée derrière cela est qu’il faut garder à l’esprit qu’à chaque fois que nous concevons un nouveau projet web avec une valeur ajoutée métier, nous devons réfléchir à son architecture. Trop souvent cela se résume à choisir les modules contribués sur lesquels nous reposer, combien de view modes à créer par type de contenu ou s’il faudra utiliser Panels VS des templates VS Display Suite (troll en approche).

Une application web est composée d’objets et il y a des liens entre ces objets. Si vous utilisiez un framework il faudrait pondre un diagramme de classes et un schéma de base de données, designer vos interfaces pour rendre votre code élégant. Drupal 7 a apporté les trop peu utilisés types d’entités, profitez de Drupal 8 pour vous poser la question du bon stockage de vos données (bundle de nœud VS nouveau type d’entité VS simple table).

IC378684.png

Trop souvent le code est fragmenté et manque de recul. Pour savoir si votre application est de qualité, il suffit de vous demander cela : “suis-je capable de faire du refactoring ou de modifier des pans capitaux de l’application tout en restant serein(e) ?”. Dans la plupart des cas la réponse sera non. La faible couverture de tests (unitaires ou fonctionnels) en est l’une des principales explications. Pour cette raison, plus vous suivrez un modèle clairement défini en amont et partagé par l’équipe plus vous serez en maîtrise de votre application et, qui sait, si votre processus de production est très avancé vous réussirez à produire des tests !

Concevoir une application c’est se demander quel est le bon outil pour un usage donné. Lorsque vous designer l’infrastructure nécessaire pour faire tourner votre application vous piochez parmi des outils tels que Varnish, Nginx, Memcache, Redis, Solr.. faites la même chose sur la partie PHP. Il sera parfois plus simple d’utiliser une autre technologie voire un autre langage ou s’appuyer sur une librairie externe plutôt qu’un module Drupal pour adresser certaines problématiques. L’important est de pouvoir faire communiquer tout ce petit monde ensemble et la bonne nouvelle c’est que les webservices se sont démocratisés (encore faut-il bien les designer), facilitant par la même occasion l’échange de données. Et si vous en venez à écrire vos propres solutions, pensez à les partager, c’est la clé de l’Open Source.

Par Artusamak
Julien Dubois

Drupal 8 : Concevoir votre application pour Drupal 8

Drupal 8 : Concevoir votre application pour Drupal 8
Artusamak
jeu 28/04/2016 - 09:43

Cet article est extrait de notre formation drupal 8 "de Drupal 7 à Drupal 8" à destination des développeurs. N'hésitez pas à nous contacter pour en savoir plus !

Combien parmi vous se revendiquent “développeur Drupal” plutôt que “développeur PHP” ? Cela est probablement dû au fait que Drupal fonctionne grâce à un certain nombre de couches d’abstractions qui lui sont propres et que si demain vous étiez privé(e) de Drupal vous vous sentiriez démuni(e) sans Form API, Entity API, Views ou Batch API.

En pointant cela du doigt on se rend compte de la richesse d’un outil mais on peut aussi se demander si cela n’est pas une erreur. En utilisant un composant drupalo-drupalien, vous ne pourrez pas vous en resservir en changeant de technologie et c’est bien dommage. C’est une des raisons pour lesquelles Drupal 8 s’est ouvert sur le monde extérieur. Pouvoir bénéficier de composants connus et réutilisables. On parle ici de Twig, de HTTPKernel et HTTPFoundation, de l’autoloader PSR, de Guzzle, etc. D’ailleurs tout n’est pas à jeter dans Drupal, si Views devenait un composant proprement découplé il pourrait être réutilisé dans d’autres applications. Les développeurs de Commerce 2.x sont dans cet état d’esprit de design par composants indépendants et réutilisables et il est probable que cela soit une tendance de fond sur les années à venir.

L’idée derrière cela est qu’il faut garder à l’esprit qu’à chaque fois que nous concevons un nouveau projet web avec une valeur ajoutée métier, nous devons réfléchir à son architecture. Trop souvent cela se résume à choisir les modules contribués sur lesquels nous reposer, combien de view modes à créer par type de contenu ou s’il faudra utiliser Panels VS des templates VS Display Suite (troll en approche).

Une application web est composée d’objets et il y a des liens entre ces objets. Si vous utilisiez un framework il faudrait pondre un diagramme de classes et un schéma de base de données, designer vos interfaces pour rendre votre code élégant. Drupal 7 a apporté les trop peu utilisés types d’entités, profitez de Drupal 8 pour vous poser la question du bon stockage de vos données (bundle de nœud VS nouveau type d’entité VS simple table).

IC378684.png

Trop souvent le code est fragmenté et manque de recul. Pour savoir si votre application est de qualité, il suffit de vous demander cela : “suis-je capable de faire du refactoring ou de modifier des pans capitaux de l’application tout en restant serein(e) ?”. Dans la plupart des cas la réponse sera non. La faible couverture de tests (unitaires ou fonctionnels) en est l’une des principales explications. Pour cette raison, plus vous suivrez un modèle clairement défini en amont et partagé par l’équipe plus vous serez en maîtrise de votre application et, qui sait, si votre processus de production est très avancé vous réussirez à produire des tests !

Concevoir une application c’est se demander quel est le bon outil pour un usage donné. Lorsque vous designer l’infrastructure nécessaire pour faire tourner votre application vous piochez parmi des outils tels que Varnish, Nginx, Memcache, Redis, Solr.. faites la même chose sur la partie PHP. Il sera parfois plus simple d’utiliser une autre technologie voire un autre langage ou s’appuyer sur une librairie externe plutôt qu’un module Drupal pour adresser certaines problématiques. L’important est de pouvoir faire communiquer tout ce petit monde ensemble et la bonne nouvelle c’est que les webservices se sont démocratisés (encore faut-il bien les designer), facilitant par la même occasion l’échange de données. Et si vous en venez à écrire vos propres solutions, pensez à les partager, c’est la clé de l’Open Source.

Pages