Як отримати доступ до значень з попередніх кроків у багатосторінковій веб-формі?


12

Я використовую Webform 4. Він використовує маркери Drupal, але це не власні% жетони, як раніше у версії 3, і майже все, що я знайшов, стосувалося веб-форми 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
@Bala це працює у всіх формах зміни гачка все в порядку. Але як я можу отримати форму форми в лексемах? Я маю на увазі, що я кинув цю роботу через два тижні. Хлопець, який піклується про цю форму, не є кодером, він може це робити, але це не його головна навичка - саме тому мені потрібні жетони.
Молот

так, ви згадали на майбутні потреби, я повністю забув.
Бала

Відповіді:


1

Це не відповідає на запитання у вашій назві, але, читаючи ваш випадок використання, це звучить як сценарій, для якого був написаний Profile2 . Пов’язаний пост stackoverflow

Веб-форма чудово підходить для опитувань і подібних, але коли ви хочете "мати можливість використовувати їх як значення за замовчуванням для майбутніх полів", їх потрібно підключити до користувача. Тоді вам знадобиться більше спеціального коду, щоб отримати історичне подання веб-форми користувача, щоб отримати ці значення у формі, що змінюється для вашої адреси рахунків. Профіль (2) написаний саме для спрощення цього.

Крім того, чим менше кодування в останню хвилину ви робите перед тим, як передавати це комусь іншому, тим менше, що хтось ще проклинає вас у серці, коли вони намагаються робити оновлення.


Все добре і приємно, але одна форма цієї форми не була - це профіль :( Я маю на увазі, ми не хотіли створювати профілі для людей, які просять підписки. Різні закони діють, коли ви робите, більш суворі. Або так, я був розповів юридичний департамент. Також зараз мені це потрібно для абсолютно незв’язаних випадків використання, якщо взагалі :)
Mołot

Гаразд, цікаво, що сказала ваша юридична команда. Знизу, якщо ви хочете доповнити форми з даними, підключеними до користувача, вам потрібні дані, підключені до користувача. Модуль профілю був простішим способом підтримати цю здатність даних і досить тісно відповідав функціям, які ви запитували. Змініть дозволи веб-сайту, щоб ніхто не міг переглядати профілі, і тепер він такий самий, як вам потрібно, але з більш стандартним кодом. Тільки тому, що модуль названий Profile не означає, що його потрібно розгорнути як такий.
DeveloperWeeks

0

Означте змінні як глобальні та перейдіть до них від_state [значень] []. Це працювало для мене у багатоступеневих формах з модальним спливаючим вікном ctools.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.