Passando argumentos para drupal_get_form ()

19

Como posso passar argumentos drupal_get_form()no 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
fonte
4
Existem muitos exemplos para isso. Execute um grep para drupal_get_form no diretório raiz do drupal.
Sivaji

Respostas:

33

Apenas adicione $varscomo segundo argumento.

drupal_get_form('new_form', $vars);

e...

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

Citação de drupal_get_form ()

... Quaisquer argumentos adicionais são transmitidos para as funções chamadas por drupal_get_form (), incluindo a função exclusiva do construtor de formulários. Por exemplo, o formulário node_edit requer que um objeto de nó seja passado aqui quando é chamado. Eles estão disponíveis para implementações de hook_form_alter () e hook_form_FORM_ID_alter () como a matriz $ form_state ['build_info'] ['args'].

kalabro
fonte
3

Os argumentos adicionais pelos quais você passa drupal_get_form()estão disponíveis $form_state['build_info']['args'], mas você não pode ter chamadas de função no seu page arguments. Eu sugeriria a seguinte abordagem:

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

O restante do que você precisa está na referência da API do formulário

skwashd
fonte
Esta função deve ser usada em vez de drupal_build_form () quando $ form_state não for necessário (ou seja, ao renderizar o formulário inicialmente) e é frequentemente usado como retorno de chamada no menu. api.drupal.org/api/drupal/includes!form.inc/function/…
khaled_webdev
0

Eu tive um problema semelhante e foi resolvido com uma mistura de respostas do @ kalabro e minha própria maneira de lidar com isso.

Então, basicamente, eu tenho uma landing page estática onde uso tokens. No hook_tokenseu chamo o formulário de registro via $form = drupal_get_form('user_register_form', 'register-test');.

E, finalmente, no hook_form_alter, verifico se a String é "register-test". Isso é feito via $form_state['build_info']['args'][0]. Aqui a função:

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
fonte