Passando argomenti a drupal_get_form ()


19

Come posso passare argomenti a drupal_get_form()in 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
Ci sono molti esempi per questo. Esegui un grep per drupal_get_form dalla directory principale di drupal.
Sivaji,

Risposte:


33

Aggiungi solo $varscome secondo argomento.

drupal_get_form('new_form', $vars);

e...

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

Citazione da drupal_get_form ()

... Eventuali argomenti aggiuntivi vengono passati alle funzioni chiamate da drupal_get_form (), inclusa la funzione di costruzione del modulo univoca. Ad esempio, il modulo node_edit richiede che un oggetto nodo venga passato qui quando viene chiamato. Questi sono disponibili per le implementazioni di hook_form_alter () e hook_form_FORM_ID_alter () come array $ form_state ['build_info'] ['args'].


3

Gli argomenti aggiuntivi a cui passi drupal_get_form()sono disponibili $form_state['build_info']['args'], ma non puoi avere chiamate di funzione nel tuo page arguments. Suggerirei il seguente approccio:

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

Il resto di ciò che ti serve è nel riferimento API del modulo


Questa funzione dovrebbe essere usata al posto di drupal_build_form () quando $ form_state non è necessario (cioè quando si esegue il rendering iniziale del modulo) ed è spesso usato come callback del menu. api.drupal.org/api/drupal/includes!form.inc/function/…
khaled_webdev

0

Ho avuto un problema simile ed è stato risolto con un mix della risposta di @ kalabro e il mio modo di affrontarlo.

Quindi fondamentalmente ho una landingpage statica in cui uso i token. Nel hook_tokenschiamo il modulo di registrazione tramite $form = drupal_get_form('user_register_form', 'register-test');.

E infine in hook_form_alter controllo se la stringa è "register-test". Questo viene fatto tramite $form_state['build_info']['args'][0]. Ecco la funzione:

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['...
  }
...
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.