Passer des arguments à drupal_get_form ()

19

Comment puis-je transmettre des arguments drupal_get_form()dans 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
la source
4
Il existe de nombreux exemples pour cela. Exécutez un grep pour drupal_get_form à partir du répertoire racine de drupal.
Sivaji

Réponses:

33

Ajoutez simplement $varscomme deuxième argument.

drupal_get_form('new_form', $vars);

et...

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

Citation de drupal_get_form ()

... Tous les arguments supplémentaires sont transmis aux fonctions appelées par drupal_get_form (), y compris la fonction de constructeur de formulaire unique. Par exemple, le formulaire node_edit requiert qu'un objet node soit passé ici lors de son appel. Ceux-ci sont disponibles pour les implémentations de hook_form_alter () et hook_form_FORM_ID_alter () en tant que tableau $ form_state ['build_info'] ['args'].

kalabro
la source
3

Les arguments supplémentaires auxquels vous passez drupal_get_form()sont disponibles dans $form_state['build_info']['args'], mais vous ne pouvez pas avoir d'appels de fonction dans votre page arguments. Je suggérerais l'approche suivante:

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

Le reste de ce dont vous avez besoin se trouve dans la référence de l'API Form

skwashd
la source
Cette fonction doit être utilisée à la place de drupal_build_form () lorsque $ form_state n'est pas nécessaire (c'est-à-dire lors du rendu initial du formulaire) et est souvent utilisée comme rappel de menu. api.drupal.org/api/drupal/includes!form.inc/function/…
khaled_webdev
0

J'ai eu un problème similaire et il a été résolu avec un mélange de la réponse de @ kalabro et de ma propre façon de le gérer.

Donc, fondamentalement, j'ai une page de destination statique où j'utilise des jetons. Dans le hook_tokensj'appelle le formulaire d'inscription via $form = drupal_get_form('user_register_form', 'register-test');.

Et enfin dans le hook_form_alter je vérifie si la chaîne est "register-test". Cela se fait via $form_state['build_info']['args'][0]. Voici la fonction:

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
la source