C’est une petite fonctionnalité dont vous pourriez avoir besoin, voici une présentation du fonctionnement d’une telle fonctionnalité.
A première vue cela peut sembler très facile à implémenter mais au final ça ne l’est pas tant que ça.
Prenons l’exemple d’un formulaire qui permet de clore des votes sur des sessions, cette action étant importante nous allons ajouter une étape de confirmation avant de faire le traitement.
Je simplifie volontairement le formulaire que l’on créé, résumons le à un simple bouton d’action :
<?php
/**
* Form to close votes on sessions.
*/
function feature_conference_close_sessions_form(&$form_state) {
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Clore les votes'),
);
return $form;
}
?>
Ensuite dans le traitement de ce formulaire il faut faire une redirection vers le formulaire de confirmation. Aucun traitement ne doit être fait ici sachant que le formulaire n’a pas encore été confirmé par l’utilisateur.
<?php
/**
* Redirect to confirmation form.
*/
function feature_conference_close_sessions_form_submit($form, &$form_state) {
$form_state['redirect'] = 'sessions/close/confirm';
}
?>
Sachant que nous faisons une redirection vers une entrée de menu, il faut la déclarer via un hook_menu().
<?php
/**
* Implement hook_menu().
*/
function feature_conference_menu() {
return array(
'sessions/close/confirm' => array(
'page callback' => 'drupal_get_form',
'page arguments' => array('feature_conference_close_sessions_confirm_form'),
'access callback' => TRUE,
),
}
?>
Dans ce formulaire il vous faut utiliser la fonction confirm_form() (http://api.drupal.org/api/function/confirm_form/6) pour obtenir la page de confirmation.
<?php
/**
* Confirmation form before closing sessions.
*/
function feature_conference_close_sessions_confirm_form(&$form_state) {
$form = array();
$desc = "Les votes ne seront plus possibles.";
return confirm_form($form, "Êtes-vous sûr de vouloir clore les votes ?",
"<front>", $desc);
}
?>
Ensuite on retombe dans le fonctionnement classique des formulaires, il suffit de faire le traitement des données dans la fonction de submit du formulaire.
<?php
/**
* Close votes on sessions, send email to rejected contributions' authors
*/
function feature_conference_close_sessions_confirm_form_submit($form, &$form_state) {
// Set a variable to status closed
variable_set('feature_conference_status', 'closed');
drupal_set_message("Les votes sur les sessions sont maintenant clos.");
drupal_goto('<front>');
}
?>
Et nous voilà avec un formulaire de confirmation fonctionnel. Le cas d’usage est simple, si vous souhaitez faire une action plus avancée comme par exemple clore une session précise, il faut que vous passiez les données dans le formulaire de confirmation via un ou plusieurs arguments à l’url de traitement car le fait d’effectuer une redirection entraine la perte des données soumise par le formulaire principal.