Передача аргументів drupal_get_form ()


19

Як я можу передати аргументи drupal_get_form()в 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?
}

4
Прикладів для цього дуже багато. Запустіть греп для drupal_get_form з кореневого каталогу drupal.
Сіваджі

Відповіді:


33

Просто додайте $varsяк другий аргумент.

drupal_get_form('new_form', $vars);

і ...

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

Цитата від drupal_get_form ()

... Будь-які додаткові аргументи передаються до функцій, викликаних drupal_get_form (), включаючи унікальну функцію конструктора форми. Наприклад, форма node_edit вимагає, щоб сюди був переданий об'єкт, коли він викликається. Вони доступні для реалізацій Hook_form_alter () і Hoke_form_FORM_ID_alter () як масив $ form_state ['build_info'] ['args'].


3

Додаткові аргументи, які ви передаєте drupal_get_form(), доступні в $form_state['build_info']['args'], але ви не можете мати виклики функцій у своєму page arguments. Я б запропонував такий підхід:

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

Інше, що вам потрібно, - це посилання на API форми


Цю функцію слід використовувати замість drupal_build_form (), коли $ form_state не потрібна (тобто при первинному наданні форми) і часто використовується як зворотний виклик меню. api.drupal.org/api/drupal/includes!form.inc/function/…
khaled_webdev

0

У мене було подібне питання, і це було вирішено поєднанням відповіді @ kalabro та власним способом вирішення цього питання.

Тому я маю статичну цільову сторінку, де я використовую лексеми. У hook_tokensтелефоні я закликаю форму реєстрації через $form = drupal_get_form('user_register_form', 'register-test');.

І нарешті, у moll_form_alter я перевіряю, чи "Рядок - тест" зареєстрований. Це робиться через $form_state['build_info']['args'][0]. Тут функція:

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