Bagaimana cara mencetak hasil setelah mengirimkan formulir Drupal?

9

Saya memiliki pengaturan Modul Drupal sederhana yang memiliki satu kotak teks.

Saya dapat mengembalikan apa yang diketik dalam kotak teks menggunakan drupal_set_message():

function firstmodule_form1_submit($form, &$form_state) {
    drupal_set_message(t("The user is $username"));
}

Namun echo $username;tidak akan bekerja untuk saya, tidak ada yang dicetak. Bagaimana saya bisa mengembalikan hasil tanpa menggunakan drupal_set_message()?

h00j
sumber

Jawaban:

7

Cara normal untuk menangani ini adalah dengan menerapkan alur kerja multi-langkah. Lihat drupal_rebuild_form()untuk informasi lebih lanjut, tetapi pada dasarnya Anda atur $form_state['rebuild'] = TRUE;di ajukan handler Anda, dan pada fungsi form asli tambahkan tanda centang untuk melihat apakah form sudah dikirimkan. Jika sudah, Anda memiliki akses ke nilai yang dikirimkan dan dapat memanipulasi formulir sesuai keinginan Anda.

Contoh yang sangat mendasar:

function MYMODULE_some_form($form, &$form_state) {
  // If the form has been submitted, output something related to the submission
  if (!empty($form_state['values']['some_field'])) {
    $form['submission'] = array(
      '#markup' => function_to_get_markup_from_value($form_state['values']['some_field'])
    );
  }
  else {
    // Otherwise build the normal form
    $form['some_field'] = array(
      '#type' => 'textfield',
      // ...
    );
  }

  return $form;
}

function MYMODULE_some_form_submit($form, &$form_state) {
  $form_state['rebuild'] = TRUE;
}
Clive
sumber
2

Penangan pengiriman formulir hanya bisa mencetak pesan menggunakan drupal_set_message(), atau menulis pesan dengan log watchdog().

Alternatifnya adalah menyimpan data yang diperlukan dalam sesi, dan mengarahkan pengguna (menggunakan $form_state['redirect'] = 'page path';) ke halaman di mana konten sesi ditampilkan.

function firstmodule_menu() {
  $items['the path for your page'] = array(
    'page callback' => 'firstmodule_show_submitted_data';
    // ...
  );

  return $items;
}

function firstmodule_form1_submit($form, &$form_state) {
  $_SESSION['firstmodule_username'] = $username;
  // ...

  $form_state['redirect'] = 'the path for your page';
}

function firstmodule_show_submitted_data() {
  // Populate $result with the string to show.

  return $result;
}

Sebagai catatan, argumen pertama t()harus berupa string literal, bukan string yang diperoleh dari dua string, seperti dalam kasus Anda. Anda harus menggunakan placeholder, seperti dalam kode berikut.

drupal_set_message(t("The user is %username", array('%username' => $username)));

Di Drupal 7, alih-alih mengembalikan string, Anda bisa mengembalikan array render .

kiamlaluno
sumber
1

Semua data yang dikirimkan disimpan $form_state, jika Anda ingin melihat apa yang terjadi, instal modul devel dan setelah itu Anda selalu dapat melakukan ini:

Di dalam firstmodule_form1_submitfungsi Anda untuk mencetak semua $form_statejenis array - dpm($form_state)- dan Anda akan melihat output, di mana Anda dapat menemukan nama pengguna kotak teks Anda atau yang lainnya, akan menjadi sesuatu yang mirip dengan ini$form_state['values']['username']

Dan kemudian Anda bisa mencetaknya drupal_set_message(t($form_state['values']['username']);

Petro Popelyshko
sumber
Terima kasih, saya memiliki bagian itu namun drupal_set_message mengembalikannya sebagai jenis pesan "Bantuan". Saya ingin mengembalikan banyak konten di halaman itu sendiri.
h00j
0

Yang perlu Anda lakukan adalah memiliki menu panggilan balik, pada dasarnya itu akan menjadi halaman yang Anda atur dan tampilkan informasinya.

Info lebih lanjut tersedia di sini: http://api.drupal.org/api/drupal/includes!menu.inc/group/menu/7 dan Anda perlu membaca lebih lanjut tentang hook_menu ()

Semoga itu bisa membantu, beri tahu saya jika Anda membutuhkan contoh.

Chiko
sumber