Bagaimana cara mengakses nilai dari langkah sebelumnya di Webform multi-halaman?

12

Saya menggunakan Webform 4. Ini menggunakan token Drupal, bukan token itu sendiri seperti dulu di versi 3, dan hampir semua yang saya temukan tentang webform 3.

Katakanlah saya ingin membuat formulir berlangganan multi-halaman. Di halaman pertama hanya ada bidang email. Yang kedua, saya ingin markup yang akan mengatakan sesuatu seperti:

Konfigurasi berlangganan terperinci untuk [email protected]

Demikian pula, saya ingin dapat menggunakannya sebagai nilai default untuk bidang yang akan datang, seperti meminta pengguna untuk alamat penagihan, dan kemudian untuk alamat pengiriman.

Apakah ada token untuk itu? Apa yang saya lakukan untuk saat ini adalah:

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

Ini berfungsi, tetapi hanya menunjukkan nilai dari satu langkah sebelumnya, jadi memerlukan beberapa trik kotor dengan bidang tersembunyi untuk membawa nilai email di beberapa langkah. Saya akui - itu cepat dan kotor. Apakah ada built-in cara untuk melakukannya, atau benar dipelihara kontribusi modul untuk ini? Atau cara untuk membuat kode ini bekerja secara independen $_POST['submitted'], untuk membuatnya membawa nilai di banyak langkah dan membuatnya token (dari elemen Webform yang tersedia) terlihat pada daftar token di jendela edit?

Mołot
sumber
Bisakah Anda mengatur variabel sesi ketika Anda mengirimkan halaman dengan nilai yang diinginkan?
Darvanen
@ Darvanen mungkin saya bisa, tetapi nilainya sudah disimpan di suatu tempat, kan? Jadi saya lebih suka menggunakan apa yang sudah ada. Dan saya hampir tidak percaya saya yang pertama membutuhkan ini. Mungkin saya gagal menemukan solusi yang ada di luar sana?
Mołot
Saya tidak yakin tentang ini $ form_state ['storage'] tapi saya mencari 2 atau 3 posting mereka menyebutkan semua data yang disimpan dalam $ form_state ['storage'] jadi saya pikir Anda dapat mengakses data, sumber stackoverflow.com/questions/ 6408170 / ... dan drupal.org/node/717750
Bala
2
@Bala ini bekerja di semua bentuk kait semua baik-baik saja. Tapi bagaimana saya mendapatkan status formulir di token? Maksudku, aku berhenti dari pekerjaan ini dalam dua minggu. Orang yang akan merawat formulir ini bukan seorang pembuat kode, dia bisa melakukannya tetapi itu bukan keahlian utamanya - itu sebabnya saya perlu token.
Mołot
ya Anda sebutkan untuk kebutuhan masa depan saya lupa sepenuhnya.
Bala

Jawaban:

1

Ini tidak menjawab pertanyaan dalam judul Anda, tetapi membaca use case Anda sepertinya skenario yang dibuat untuk Profile2 . Posting stackoverflow terkait

Bentuk web sangat bagus untuk survei dan semacamnya, tetapi ketika Anda ingin "dapat menggunakannya sebagai nilai default untuk bidang di masa mendatang" mereka harus terhubung ke pengguna. Jadi, Anda akan memerlukan lebih banyak kode khusus untuk mengambil pengiriman historis webform pengguna untuk menarik nilai-nilai ini dalam bentuk perubahan untuk alamat penagihan Anda. Profil (2) ditulis tepat untuk mempermudah ini.

Juga, semakin sedikit pengkodean kustom menit terakhir yang Anda lakukan sebelum menyerahkan ini kepada orang lain, semakin sedikit yang orang lain akan mengutuk Anda di dalam hati mereka ketika mereka mencoba untuk membuat pembaruan.

Minggu Pengembang
sumber
Semua baik dan bagus, tetapi satu hal yang formulir ini bukan adalah profil :( Maksudku, kami tidak ingin membuat profil untuk orang yang meminta langganan. Hukum yang berbeda berlaku saat Anda melakukannya, yang lebih ketat. Atau begitulah saya diceritakan oleh departemen hukum. Juga, sekarang saya membutuhkannya untuk kasus penggunaan yang sama sekali tidak terkait, jika sama sekali :)
Mołot
Oke, itu menarik apa yang dikatakan tim hukum Anda. Intinya, jika Anda ingin mengisi formulir dengan data yang terhubung ke pengguna, Anda perlu data yang terhubung ke pengguna. Modul Profile adalah cara yang lebih mudah untuk mempertahankan kemampuan data itu, dan sangat cocok untuk fungsi yang Anda minta. Ubah izin situs sehingga tidak ada yang bisa melihat profil, dan sekarang sama dengan yang Anda inginkan tetapi dengan kode yang lebih standar. Hanya karena modul tersebut bernama Profile, bukan berarti modul itu harus digunakan.
DeveloperWeeks
0

Dekati variabel sebagai global dan masukkan from_state [values] [] ke dalamnya. Ini bekerja untuk saya, dalam bentuk multi-tahap dengan ctools modal popup.

ana
sumber