Blogue

Souscrire à

API Form : Envoyer les données d'un formulaire à une url externe

Il y a quelques jours, je me suis intéressé à la manière d'envoyer les informations recueillies dans un formulaire codé sous Drupal à un site externe tel que Paypal. En cherchant ici ou là, j'ai pu trouver plusieurs solutions à mon problème mais toutes ne sont pas, d'après moi, à utiliser.

Première solution : Modifier l'attribut action du formulaire

Pour ceux qui s'y connaissent un peu en html, et ce devrait être le cas si vous êtes développeur Drupal et que cet article vous intéresse, ce qui détermine l'adresse ou seront envoyées les informations d'un formulaire est l'attribut action de la balise form tel que : <form action="mon_url">...</form> et ce quelque soit les champs de votre formulaire.

Drupal utilise ce mécanisme. Si on regarde dans le code source html d'un formulaire, le formulaire d'activation des modules par exemple, on obtient :
<form accept-charset="UTF-8" id="system-modules" method="post" action="/admin/modules/list/confirm">...</form>

Et si on regarde dans le code de Drupal qui génère ce formulaire, en l'occurence la fonction system_modules() présente dans le fichier modules/system/system.admin.inc de votre installation Drupal, on retrouve :

function system_modules($form, $form_state = array()) {
  ...
  $form['#action'] = url('admin/modules/list/confirm');
  return $form;
}

A noter au passage que dans le cas ou l'url ne serait pas précisée, c'est à la page du formulaire que seraient envoyées les données.

On aurait donc un formulaire tel que :

function mon_formulaire() {
  $form['mon_element'] = array(
     ...
  );
  $form['#action'] = 'http://example.com';
  return $form;
}

Seconde solution : Utiliser la fonction drupal_goto()

La fonction drupal_goto() est une fonction qui permet d'effectuer une redirection http. C'est à dire qu'une fois le script php exécuté, le navigateur ira à l'adresse indiquée.

La raison de son utilisation est de permettre la validation et le possible traitement des données du formulaire en interne AVANT d'aller à l'url indiquée.

En reprenant notre formulaire et le modifiant légèrement, on obtient :

//La fonction pour le formulaire
function mon_formulaire() {
  $form['mon_element'] = array(
     ...
  );
  return $form;
}
 
//La fonction pour la validation
function mon_formulaire_validate($form_id, &$form_state) {
  ...
  //validation des valeurs
  ...
}
 
//La fonction pour la soumission
function mon_formulaire_submit($form_id, &$form_state) {
  ...
  //soumission des valeurs
  ...
  $post_data = $form_state['values']; 
  drupal_goto($url, array('query'=> $post_data));  
}

Maintenant, quelle solution choisir ?

Personnellement, je choisirai la seconde solution.
Pourquoi ?

D'une part, parce que ca ne court-circuite pas le mécanisme de Drupal. On conserve la succession mon_form(), mon_form_validate(), mon_form_submit().

D'autre part, parce que ca donne l'occasion de valider les données et d'éventuellement enregistrer les données avant de l'envoyer au site externe.
Ca peut permettre de vérifier que les données ne sont pas altérées par exemple ou encore faire une correspondance entre les données pré-enregistrées lors de mon_form_submit() puis celles retournées par le site, comme Paypal lors d'une transaction par exemple.

Et voilà, maintenant vous savez comment envoyer des données depuis le formulaire d'un site Drupal à un site externe.

Catégories: 

Bienvenue à bord.

Et voilà, une fois de plus de retour avec encore un nouveau blog à mon palmarès. J'ose espérer que cette fois ci, ce dernier ne suivra pas la triste destinée de ses prédécesseurs.
Pourquoi alors ? Pourquoi s'acharner à faire un blog si ce dernier risque de tout simplement disparaître dans les méandres d'Internet et de la Blogosphère ? A ceci, je répondrais tout simplement : le partage.

Je suis présentement développeur, et en tant que développeur je me dois d'aller trifouiller dans les codes sources, trouver des astuces, programmer des "hacks", etc. pour arriver à obtenir ce que je veux, ou ce qu'un client veut.
Mais pourquoi tout ce temps passé et les résultats obtenus devraient ils rester quelque part sur un de mes nombreux disques durs ? Pourquoi ces trouvailles ne pourraient pas être partagées et utilisées par d'autres personnes ?
Le temps est une denrée rare qui file à toute vitesse alors pourquoi perdre son temps à refaire ce que d'autres ont déjà fait ? Et donc pourquoi ne pas permettre à d'autres d'utiliser ce que l'on a déjà fait ?

Voilà pourquoi, ce blog, cet espace, sera le canal par lequel je partagerai mes trouvailles, mes "hacks". J'ai largement utilisé ce que d'autres ont par le passé partagé, il est temps pour moi d'apporter ma pierre à l'édifice.

Au programme : majoritairement du Drupal, étant développeur Web spécialiste Drupal, avec quelques trucs sur JQuery, HTML5 et CSS. Peut être viendront quelques sujets comme le Logiciel Libre, les Réseaux Sociaux ou même des concurrents de Drupal comme WordPress, et peut être pleins d'autres choses encore sans forcément de liens avec le Web et l'Informatique. De tout ceci, l'avenir nous le dira.

Mais pour le moment, juste une chose à dire : Bienvenue à bord, en espérant que quel que soit votre profil: concepteur, développeur, programmeur ou simple visiteur, vous trouverez ce que vous êtes venus chercher.

Alea jacta est

Catégories: