Wie greife ich in mehrseitigen Webformularen auf Werte aus früheren Schritten zu?

12

Ich verwende Webform 4. Es werden Drupal-Token verwendet, keine eigenen% -Token wie in Version 3, und so ziemlich alles, was ich gefunden habe, befasste sich mit Webform 3.

Angenommen, ich möchte ein mehrseitiges Anmeldeformular erstellen. Auf der ersten Seite gibt es nur ein E-Mail-Feld. In der zweiten möchte ich ein Markup, das ungefähr so ​​aussieht:

Detaillierte Abonnementkonfiguration für [email protected]

Ebenso möchte ich sie als Standardwerte für zukünftige Felder verwenden können, z. B. Benutzer nach der Rechnungsadresse und dann nach der Lieferadresse fragen.

Gibt es dafür Token? Was ich jetzt gemacht habe ist:

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;
  }
}

Es funktioniert, zeigt jedoch nur Werte aus einem Schritt zuvor an. Daher sind einige schmutzige Tricks mit ausgeblendeten Feldern erforderlich, um den E-Mail-Wert über mehrere Schritte zu übertragen. Ich gebe zu - es war nur schnell und dreckig. Gibt es eine eingebaute Möglichkeit, dies zu tun, oder ein ordnungsgemäß gewartetes Modul , das dazu beigetragen hat? Oder eine Möglichkeit, diesen Code unabhängig $_POST['submitted']zu machen, Werte in mehreren Schritten zu übertragen und seine Token (aus verfügbaren Webform-Elementen) in der Token-Liste in Bearbeitungsfenstern sichtbar zu machen?

Mołot
quelle
Könnten Sie eine Sitzungsvariable festlegen, wenn Sie die Seite mit dem gewünschten Wert senden?
Darvanen
@Darvanen könnte ich evtl., aber der Wert ist doch schon irgendwo gespeichert, oder? Also würde ich lieber das benutzen, was schon da ist. Und ich glaube kaum, dass ich der erste bin, der das braucht. Wahrscheinlich habe ich gerade keine Lösung gefunden, die da draußen ist?
Mołot
Ich bin mir bei diesem $ form_state ['storage'] nicht sicher, aber ich habe 2 oder 3 Posts durchsucht, in denen alle in $ form_state ['storage'] gespeicherten Daten erwähnt wurden, damit Sie auf die Daten zugreifen können (Quelle stackoverflow.com/questions/). 6408170 /… und drupal.org/node/717750
Bala
2
@Bala das klappt in allen hook alter formen in ordnung. Aber wie würde ich Form State in Token bekommen? Ich kündige diesen Job in zwei Wochen. Der Typ, der sich um diese Form kümmert, ist kein Programmierer, er kann das, aber das ist nicht seine Hauptfähigkeit - deshalb brauche ich Token.
Mołot
Ja, du hast für zukünftige Bedürfnisse erwähnt, die ich komplett vergessen habe.
Bala

Antworten:

1

Dies beantwortet nicht die Frage in Ihrem Titel, aber wenn Sie Ihren Anwendungsfall lesen, klingt es wie das Szenario, für das Profile2 geschrieben wurde. Verwandte Stackoverflow-Post

Webform eignet sich hervorragend für Umfragen und ähnliches. Wenn Sie sie jedoch als Standardwerte für zukünftige Felder verwenden möchten, müssen Sie mit dem Benutzer verbunden sein. Sie benötigen dann mehr benutzerdefinierten Code, um die historische Webformularübermittlung des Benutzers abzurufen und diese Werte in einer Formularänderung für Ihre Rechnungsadresse abzurufen. Profil (2) ist genau geschrieben, um dies zu vereinfachen.

Je weniger benutzerdefinierte Codierungen Sie in letzter Minute vornehmen, bevor Sie diese an eine andere Person weitergeben, desto weniger wird Sie eine andere Person in ihrem Herzen verfluchen, wenn sie versucht, Aktualisierungen vorzunehmen.

DeveloperWeeks
quelle
Alles in Ordnung und nett, aber eines war dieses Formular nicht :( Ich meine, wir wollten keine Profile für Leute erstellen, die nach Abonnements fragen. Es gelten andere Gesetze, wenn Sie dies tun, strengere. Zumindest war es so Dies wird von der Rechtsabteilung mitgeteilt und ich benötige es jetzt auch für völlig unabhängige Anwendungsfälle, wenn überhaupt :)
Mołot
Okay, das ist interessant, was Ihre Rechtsabteilung gesagt hat. Fazit: Wenn Sie Formulare mit Daten ausfüllen möchten, die mit dem Benutzer verbunden sind, benötigen Sie Daten, die mit dem Benutzer verbunden sind. Das Profil-Modul war eine einfachere Möglichkeit, diese Datenfähigkeit aufrechtzuerhalten, und eine ziemlich genaue Übereinstimmung mit den von Ihnen angeforderten Funktionen. Ändern Sie die Websiteberechtigungen so, dass niemand Profile anzeigen kann, und es ist jetzt dasselbe wie das, was Sie möchten, jedoch mit Standardcode. Nur weil das Modul Profil heißt, muss es nicht als solches bereitgestellt werden.
DeveloperWeeks
0

Dekalieren Sie die Variablen als global und übergeben Sie from_state [values] [] an sie. Dies funktionierte für mich in mehrstufigen Formularen mit ctools modal popup.

ana
quelle