Как получить доступ к значениям из предыдущих шагов в многостраничной веб-форме?


12

Я использую Webform 4. Он использует токены Drupal, а не собственные токены%, как это было в версии 3, и почти все, что я нашел, было о webform 3.

Скажем, я хочу сделать многостраничную форму подписки. На первой странице есть только поле электронной почты. На втором я хочу разметку, которая скажет что-то вроде:

Подробная конфигурация подписки для molot@example.com

Точно так же я хотел бы иметь возможность использовать их в качестве значений по умолчанию для будущих полей, например, запрашивать у пользователя адрес для выставления счета, а затем для адреса доставки.

Есть ли токены для этого? Что я сделал сейчас:

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

Это работает, но показывает только значения с одного шага ранее, поэтому требуются некоторые хитрые уловки со скрытыми полями для переноса значения электронной почты за несколько шагов. Я признаю - это было просто быстро и грязно. Есть ли какой - либо встроенный способ сделать это или правильно поддерживаемый модуль для этого? Или способ заставить этот код работать независимо от него $_POST['submitted'], чтобы он передавал значения на многих этапах и чтобы его токены (из доступных элементов веб-формы) отображались в списке токенов в окнах редактирования?


Не могли бы вы установить переменную сеанса при отправке страницы с нужным значением на ней?
Дарванен

@Darvanen возможно я мог бы, но значение уже где-то сохранено, верно? Поэтому я бы предпочел использовать то, что уже есть. И я не верю, что я первый, кто нуждается в этом. Возможно, я просто не смог найти решение, которое там есть?
Молот

Я не уверен насчет этого $ form_state ['storage'], но я искал 2 или 3 сообщения, они упомянули все данные, хранящиеся в $ form_state ['Storage'], поэтому я думаю, что вы можете получить доступ к данным, источник stackoverflow.com/questions/ 6408170 /… и drupal.org/node/717750
Бала

2
@ Бала это работает во всех формах крючка, все в порядке. Но как мне получить состояние формы в токенах? Я имею в виду, я ухожу с этой работы через две недели. Парень, который позаботится об этой форме, не кодер, он может это сделать, но это не его основной навык - поэтому мне нужны токены.
Молот

да, вы упомянули о будущих потребностях, я полностью забыл.
Бала

Ответы:


1

Это не отвечает на вопрос в вашем заголовке, но чтение вашего варианта использования похоже на сценарий, для которого был создан Profile2 . Связанная запись stackoverflow

Webform отлично подходит для опросов и тому подобного, но когда вы хотите «иметь возможность использовать их в качестве значений по умолчанию для будущих полей», они должны быть подключены к пользователю. Таким образом, вам потребуется дополнительный пользовательский код для извлечения исторической отправки веб-формы пользователя, чтобы получить эти значения в форме, изменяющей ваш платежный адрес. Профиль (2) написан именно для того, чтобы сделать это проще.

Кроме того, чем меньше пользовательского кодирования в последнюю минуту вы выполняете перед тем, как передать это кому-то другому, тем меньше кто-то будет проклинать вас в своем сердце, когда он пытается сделать обновления.


Все хорошо, но одна форма, которой не была эта форма - это профиль :( Я имею в виду, мы не хотели создавать профили для людей, просящих подписку. Когда вы это делаете, применяются разные законы, более строгие. Или я был сказал юридический отдел. Кроме того, теперь я нуждаюсь в этом для полностью несвязанных случаев использования, если вообще :)
Mołot

Хорошо, это интересно, что сказала ваша юридическая команда. В итоге, если вы хотите предварительно заполнить формы данными, связанными с пользователем, вам нужны данные, связанные с пользователем. Модуль Profile - это более простой способ сохранить эти возможности данных и довольно близко соответствовать функциям, которые вы запрашивали. Измените права доступа к сайту, чтобы никто не мог просматривать профили, и теперь он такой же, как вы хотите, но с более стандартным кодом. Тот факт, что модуль называется «Профиль», не означает, что он должен быть развернут как таковой.
DeveloperWeeks

0

Декларируйте переменные как глобальные и передайте из них from_state [values] []. Это сработало для меня в многоступенчатых формах с модальным всплывающим окном ctools.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.