Przekazywanie argumentów do drupal_get_form ()


19

Jak mogę przekazywać argumenty drupal_get_form()w 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
Jest na to wiele przykładów. Uruchom grep dla drupal_get_form z katalogu głównego drupal.
Sivaji

Odpowiedzi:


33

Po prostu dodaj $varsjako drugi argument.

drupal_get_form('new_form', $vars);

i...

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

Cytat z drupal_get_form ()

... Wszelkie dodatkowe argumenty są przekazywane do funkcji wywoływanych przez drupal_get_form (), w tym unikalną funkcję konstruktora formularzy. Na przykład formularz node_edit wymaga przekazania obiektu węzła, gdy zostanie wywołany. Są one dostępne dla implementacji hook_form_alter () i hook_form_FORM_ID_alter () jako tablica $ form_state ['build_info'] ['args'].


3

Dodatkowe argumenty, które przekazujesz, drupal_get_form()są dostępne $form_state['build_info']['args'], ale nie możesz mieć w sobie wywołań funkcji page arguments. Sugerowałbym następujące podejście:

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

Reszta jest potrzebna w dokumentacji interfejsu API formularza


Tej funkcji należy używać zamiast drupal_build_form (), gdy $ form_state nie jest potrzebne (tj. Podczas początkowego renderowania formularza) i jest często używane jako wywołanie zwrotne menu. api.drupal.org/api/drupal/includes!form.inc/function/…
khaled_webdev

0

Miałem podobny problem i został rozwiązany przez połączenie odpowiedzi @ kalabro i mojego własnego sposobu radzenia sobie z tym.

Więc w zasadzie mam statyczną stronę docelową, na której używam tokenów. W hook_tokensformularzu rejestracyjnym dzwonię za pośrednictwem $form = drupal_get_form('user_register_form', 'register-test');.

I na koniec w hook_form_alter sprawdzam, czy ciąg znaków to „register-test”. Odbywa się to za pośrednictwem $form_state['build_info']['args'][0]. Tutaj funkcja:

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['...
  }
...
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.