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.