Comment accéder aux valeurs des étapes précédentes dans un formulaire Web de plusieurs pages?

12

J'utilise Webform 4. Il utilise les jetons de Drupal, pas ses propres jetons% comme dans la version 3, et à peu près tout ce que j'ai trouvé concernait le Webform 3.

Dites que je veux faire un formulaire d'abonnement de plusieurs pages. Sur la première page, il n'y a qu'un champ email. Sur le second, je veux un balisage qui dira quelque chose comme:

Configuration détaillée de l'abonnement pour [email protected]

De même, j'aimerais pouvoir les utiliser comme valeurs par défaut pour les futurs champs, comme demander à l'utilisateur l'adresse de facturation, puis l'adresse de livraison.

Y a-t-il des jetons pour cela? Ce que j'ai fait pour l'instant, c'est:

function mymodule_token_info() {
  $type = array(
    'name' => t('Webform submitted values'),
    'description' => t('Tokens related to $_POST[\'submitted\'].'),
  );
  $tokens = array();
  if(isset($_POST['submitted'])) {
    foreach($_POST['submitted'] as $key => $val) { //discard $val now
      $tokens[$key] = array(
        'name' => $key,
        'description' => "\$_POST['submitted']['$key']",
      );
    }
  }
  return array(
    'types' => array('webform_submitted' => $type),
    'tokens' => array('webform_submitted' => $tokens),
  );
}

function mymodule_tokens($type, $tokens, $data, $options) {
  if($type == 'webform_submitted') {
    $replacements = array();
    foreach ($tokens as $name => $original) {
      //Hide errors below. We don't care if it really exists yet. If empty, so be it.
      @$replacements[$original] = (string)$_POST['submitted'][$name];
    }
    return $replacements;
  }
}

Cela fonctionne, mais il n'affiche que les valeurs d'une étape précédente, il nécessite donc quelques astuces avec des champs masqués pour transporter la valeur de l'e-mail sur plusieurs étapes. J'avoue - c'était juste rapide et sale. Existe-t-il un moyen intégré de le faire ou un module de contribution correctement entretenu pour cela? Ou un moyen de faire fonctionner ce code indépendamment $_POST['submitted'], de lui faire porter des valeurs sur plusieurs étapes et de rendre ses jetons (à partir des éléments de formulaire Web disponibles) visibles sur la liste de jetons dans les fenêtres d'édition?

Mołot
la source
Pourriez-vous définir une variable de session lorsque vous soumettez la page avec la valeur souhaitée?
Darvanen
@Darvanen je pourrais peut-être, mais la valeur est déjà enregistrée quelque part, non? Je préférerais donc utiliser ce qui existe déjà. Et je crois à peine que je suis le premier à en avoir besoin. J'ai probablement échoué à trouver une solution qui existe?
Mołot
Je ne suis pas sûr de ce $ form_state ['stockage'] mais j'ai recherché 2 ou 3 posts ils ont mentionné toutes les données stockées dans $ form_state ['stockage'] donc je pense que vous pouvez accéder aux données, source stackoverflow.com/questions/ 6408170 /… et drupal.org/node/717750
Bala
2
@Bala cela fonctionne dans toutes les formes de modification de crochet. Mais comment puis-je obtenir l'état de forme en jetons? Je veux dire, je quitte ce travail dans deux semaines. Guy qui prendra soin de ce formulaire n'est pas un codeur, il peut le faire mais ce n'est pas sa compétence principale - c'est pourquoi j'ai besoin de jetons.
Mołot
oui, vous avez mentionné pour les besoins futurs, j'ai complètement oublié.
Bala

Réponses:

1

Cela ne répond pas à la question dans votre titre, mais en lisant votre cas d'utilisation, cela ressemble au scénario pour lequel Profile2 a été écrit. Article de stackoverflow associé

Le formulaire Web est idéal pour les enquêtes et autres, mais lorsque vous voulez "pouvoir les utiliser comme valeurs par défaut pour les futurs champs", ils doivent être connectés à l'utilisateur. Vous auriez donc besoin de plus de code personnalisé pour récupérer la soumission de formulaire Web historique de l'utilisateur afin d'extraire ces valeurs sous une forme différente de votre adresse de facturation. Le profil (2) est écrit précisément pour faciliter cela.

De plus, moins vous effectuez de codage personnalisé de dernière minute avant de le transmettre à quelqu'un d'autre, moins que quelqu'un d'autre vous maudit dans son cœur lorsqu'il essaie de faire des mises à jour.

DeveloperWeeks
la source
Tout va bien et bien, mais une chose que ce formulaire n'était pas est un profil :( Je veux dire, nous ne voulions pas créer de profils pour les personnes demandant des abonnements. Différentes lois s'appliquent lorsque vous le faites, des lois plus strictes. dit par le service juridique. Aussi, maintenant j'en ai besoin pour des cas d'utilisation totalement indépendants, voire pas du tout :)
Mołot
D'accord, c'est intéressant ce que votre équipe juridique a dit. En bout de ligne, si vous souhaitez préremplir des formulaires avec des données connectées à l'utilisateur, vous avez besoin de données connectées à l'utilisateur. Le module Profil était un moyen plus facile de maintenir cette capacité de données et une correspondance assez étroite pour les fonctions que vous demandiez. Modifiez les autorisations du site afin que personne ne puisse afficher les profils, et c'est maintenant la même chose que ce que vous voulez, mais avec un code plus standard. Ce n'est pas parce que le module est nommé Profil qu'il doit être déployé en tant que tel.
DeveloperWeeks
0

Décalez les variables comme globales et transmettez from_state [valeurs] [] en elles. Cela a fonctionné pour moi, sous des formes multi-étapes avec popup modal ctools.

ana
la source