Melewati argumen ke drupal_get_form ()

19

Bagaimana saya bisa meneruskan argumen ke drupal_get_form()dalam Drupal 7?

function new_menu_callback() {
  $vars = some_example_function(); // returns: array(1 => 'one', 2 => 'two');
  $output = $vars[2];
  $output .= drupal_render(drupal_get_form('new_form'));
}

function new_form($form, &$form_state) {
  // How can I access $vars[1] from new_menu_callback() here?
}
Citricguy
sumber
4
Ada banyak contoh untuk ini. Jalankan grep untuk drupal_get_form dari direktori root drupal.
Sivaji

Jawaban:

33

Tambahkan saja $varssebagai argumen kedua.

drupal_get_form('new_form', $vars);

dan...

function new_form($form, &$form_state, $vars) {
// ...

Kutipan dari drupal_get_form ()

... Argumen tambahan apa pun diteruskan ke fungsi yang dipanggil oleh drupal_get_form (), termasuk fungsi konstruktor bentuk yang unik. Sebagai contoh, bentuk node_edit mensyaratkan bahwa objek simpul dilewatkan di sini ketika dipanggil. Ini tersedia untuk implementasi hook_form_alter () dan hook_form_FORM_ID_alter () sebagai array $ form_state ['build_info'] ['args'].

kalabro
sumber
3

Argumen tambahan yang Anda berikan drupal_get_form()tersedia $form_state['build_info']['args'], tetapi Anda tidak dapat memiliki panggilan fungsi di page arguments. Saya menyarankan pendekatan berikut:

function mymodule_menu() {
    $items = array();
    $items['mymodule/example'] = array(
      'page callback' => 'drupal_get_form',
      'page arguments' => array('mymodule_form'),
    );
    return $items;
}


function mymodule_form($form, &$form_state) {
  // this function now uses dev/user friendly named keys
  $vars = mymodule_example_function();
  $form = array();

  $form['heading'] = array(
    '#markup' => check_plain($vars['heading']),
  );

  // use other arguments here

  return $form;
}

Sisanya yang Anda butuhkan ada di referensi API Formulir

skwashd
sumber
Fungsi ini harus digunakan sebagai ganti drupal_build_form () ketika $ form_state tidak diperlukan (yaitu, ketika awalnya merender formulir) dan sering digunakan sebagai menu panggilan balik. api.drupal.org/api/drupal/includes!form.inc/function/…
khaled_webdev
0

Saya memiliki masalah serupa dan diselesaikan dengan campuran jawaban @ kalabro dan cara saya sendiri untuk mengatasinya.

Jadi pada dasarnya saya memiliki landingpage statis tempat saya menggunakan token. Dalam hook_tokensI call form register via $form = drupal_get_form('user_register_form', 'register-test');.

Dan akhirnya di hook_form_alter saya memeriksa apakah String "register-test". Ini dilakukan melalui $form_state['build_info']['args'][0]. Di sini fungsinya:

function hook_form_user_register_form_alter(&$form, &$form_state, $form_id) {
...
if ($form_state['build_info']['args'][0] == 'register-test') {
    // manipulate the form as usual
    $form['...
  }
...
}
kwoxer
sumber