Jak uzyskać dostęp do wartości z poprzednich kroków w wielostronicowym formularzu internetowym?

12

Używam Webform 4. Używa tokenów Drupala, a nie własnych% tokenów, tak jak to miało miejsce w wersji 3, i prawie wszystko, co znalazłem, dotyczyło Webform 3.

Powiedz, że chcę utworzyć wielostronicowy formularz subskrypcji. Na pierwszej stronie jest tylko pole e-mail. Po drugie, chcę znaczników, które powiedzą coś takiego:

Szczegółowa konfiguracja subskrypcji dla [email protected]

Podobnie chciałbym móc używać ich jako wartości domyślnych dla przyszłych pól, takich jak pytanie użytkownika o adres rozliczeniowy, a następnie o adres dostawy.

Czy są na to jakieś tokeny? Na razie zrobiłem:

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

Działa, ale pokazuje wartości tylko z jednego kroku wcześniej, więc wymaga kilku brudnych sztuczek z ukrytymi polami, aby przenosić wartość e-mail na wiele kroków. Przyznaję - było po prostu szybkie i brudne. Czy jest jakiś wbudowany sposób, aby to zrobić, lub odpowiednio utrzymany w tym celu moduł? Lub sposób, aby ten kod działał niezależnie $_POST['submitted'], aby przenosił wartości przez wiele kroków i aby jego tokeny (z dostępnych elementów formularza internetowego) były widoczne na liście tokenów w oknach edycji?

Mołot
źródło
Czy możesz ustawić zmienną sesji, gdy przesyłasz stronę z żądaną wartością?
Darvanen,
@Darvanen prawdopodobnie mógłbym, ale wartość jest już gdzieś zapisana, prawda? Wolałbym więc wykorzystać to, co już tam jest. I raczej nie wierzę, że jestem pierwszym, który tego potrzebuje. Prawdopodobnie nie udało mi się znaleźć rozwiązania, które tam jest?
Mołot
Nie jestem pewien co do tego $ form_state ['storage'], ale przeszukałem 2 lub 3 posty, w których wspomniano o wszystkich danych przechowywanych w $ form_state ['storage'], więc myślę, że możesz uzyskać dostęp do danych, źródło stackoverflow.com/questions/ 6408170 /… i drupal.org/node/717750
Bala
2
@Bala działa to we wszystkich formach zmiany haka w porządku. Ale jak uzyskać stan formularza w tokenach? Mam na myśli, że rezygnuję z tej pracy za dwa tygodnie. Facet, który zajmie się tą formą, nie jest programistą, może to zrobić, ale to nie jest jego podstawowa umiejętność - dlatego potrzebuję tokenów.
Mołot
tak, wspomniałeś o przyszłych potrzebach, całkowicie zapomniałem.
Bala,

Odpowiedzi:

1

To nie odpowiada na pytanie w twoim tytule, ale czytanie twojego przypadku użycia brzmi jak scenariusz, dla którego napisano Profile2 . Powiązany post stackoverflow

Formularz internetowy świetnie nadaje się do ankiet i tym podobnych, ale jeśli chcesz „móc używać ich jako wartości domyślnych dla przyszłych pól”, musisz połączyć się z użytkownikiem. Potrzebowałbyś więc więcej niestandardowego kodu, aby pobrać historyczne przesłanie formularza internetowego użytkownika, aby pobrać te wartości w formularzu zmiany adresu rozliczeniowego. Profil (2) został napisany właśnie w celu ułatwienia.

Ponadto, im mniej niestandardowe kodowanie robisz w ostatniej chwili, zanim przekażesz je komuś innemu, tym mniej ktoś inny przeklnie cię w swoim sercu, gdy będzie próbował dokonać aktualizacji.

Tygodnie programistyczne
źródło
Wszystko w porządku i miłe, ale jedną rzeczą, której nie było w tym formularzu, jest profil :( To znaczy, nie chcieliśmy tworzyć profili dla osób proszących o subskrypcje. W tym przypadku obowiązują inne przepisy, bardziej rygorystyczne. poinformował dział prawny. Teraz też potrzebuję go do zupełnie niepowiązanych przypadków użycia, jeśli w ogóle :)
Mołot
Okej, to ciekawe, co powiedział twój zespół prawny. Podsumowując, jeśli chcesz wstępnie wypełnić formularze danymi połączonymi z użytkownikiem, potrzebujesz danych połączonych z użytkownikiem. Moduł Profile był łatwiejszym sposobem na utrzymanie tej zdolności danych i dość bliskim dopasowaniem do żądanych funkcji. Zmień uprawnienia do witryny, aby nikt nie mógł wyświetlać profili, a teraz jest taki sam, jak chcesz, ale z bardziej standardowym kodem. To, że moduł ma nazwę Profil, nie oznacza, że ​​musi zostać wdrożony jako taki.
DeveloperWeeks,
0

Odkalibruj zmienne jako globalne i przekaż do nich from_state [wartości] []. To działało dla mnie, w wieloetapowych formach z modalnym okienkiem Ctools.

Ana
źródło