Я использую 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']
, чтобы он передавал значения на многих этапах и чтобы его токены (из доступных элементов веб-формы) отображались в списке токенов в окнах редактирования?
Ответы:
Это не отвечает на вопрос в вашем заголовке, но чтение вашего варианта использования похоже на сценарий, для которого был создан Profile2 . Связанная запись stackoverflow
Webform отлично подходит для опросов и тому подобного, но когда вы хотите «иметь возможность использовать их в качестве значений по умолчанию для будущих полей», они должны быть подключены к пользователю. Таким образом, вам потребуется дополнительный пользовательский код для извлечения исторической отправки веб-формы пользователя, чтобы получить эти значения в форме, изменяющей ваш платежный адрес. Профиль (2) написан именно для того, чтобы сделать это проще.
Кроме того, чем меньше пользовательского кодирования в последнюю минуту вы выполняете перед тем, как передать это кому-то другому, тем меньше кто-то будет проклинать вас в своем сердце, когда он пытается сделать обновления.
источник
Декларируйте переменные как глобальные и передайте из них from_state [values] []. Это сработало для меня в многоступенчатых формах с модальным всплывающим окном ctools.
источник