Pasar argumentos a drupal_get_form ()

19

¿Cómo puedo pasar argumentos a 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?
}
Citricguy
fuente
44
Hay muchos ejemplos para esto. Ejecute un grep para drupal_get_form desde el directorio raíz de drupal.
Sivaji

Respuestas:

33

Simplemente agregue $varscomo segundo argumento.

drupal_get_form('new_form', $vars);

y...

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

Cita de drupal_get_form ()

... Cualquier argumento adicional se pasa a las funciones llamadas por drupal_get_form (), incluida la función de constructor de formulario único. Por ejemplo, el formulario node_edit requiere que se pase un objeto de nodo aquí cuando se llama. Estos están disponibles para implementaciones de hook_form_alter () y hook_form_FORM_ID_alter () como la matriz $ form_state ['build_info'] ['args'].

kalabro
fuente
3

Los argumentos adicionales a los que pasa drupal_get_form()están disponibles $form_state['build_info']['args'], pero no puede tener llamadas a funciones en su page arguments. Sugeriría el siguiente enfoque:

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

El resto de lo que necesita está en la referencia de Form API

skwashd
fuente
Esta función debe usarse en lugar de drupal_build_form () cuando no se necesita $ form_state (es decir, cuando se procesa inicialmente el formulario) y a menudo se usa como una devolución de llamada de menú. api.drupal.org/api/drupal/includes!form.inc/function/…
khaled_webdev
0

Tuve un problema similar y se resolvió con una combinación de la respuesta de @ kalabro y mi propia forma de tratarlo.

Así que básicamente tengo una página de inicio estática donde uso tokens. En el hook_tokensllamo al formulario de registro a través de $form = drupal_get_form('user_register_form', 'register-test');.

Y finalmente en hook_form_alter verifico si la cadena es "register-test". Esto se hace a través de $form_state['build_info']['args'][0]. Aquí la función:

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
fuente