Quelle est la différence entre drupal_get_form et drupal_retrieve_form?

10

Quelle est la difference entre drupal_get_form()et drupal_retrieve_form()? Quelqu'un peut-il expliquer la différence? Je regarde l'API, mais la description me semble similaire.

Joe
la source
Je pense qu'une différence clé est que drupal_retrieve_form()votre code peut accéder à la mise $form_stateà jour telle qu'elle est passée par référence, mais drupal_get_form()renvoyez simplement le $form, pas l'état.
Felix Eve

Réponses:

10

La différence est que drupal_get_form()gère la récupération, le traitement et l'affichage automatique d'un formulaire HTML rendu pour les modules, tout en drupal_retrieve_form()renvoyant le tableau structuré qui définit un formulaire.

Récupération du formulaire

drupal_get_form()vérifie d'abord si le formulaire est présent dans le cache de formulaire avec form_get_cache () ; s'il n'est pas présent, il appelle drupal_retrieve_form () et drupal_prepare_form () .

Traitement du formulaire

drupal_get_form()appelle drupal_process_form () , qui est la fonction qui appelle drupal_validate_form () , et qui appelle les gestionnaires de soumission avec form_execute_handlers () .

Rendu du formulaire

Le rendu est effectué à partir de drupal_process_form(), qui appelle form_builder () .

Dans la plupart des cas, drupal_get_form()c'est la fonction à utiliser, comme dans le code suivant.

function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );

  // …

  return $items;
}

Le seul module que j'ai trouvé qui appelle drupal_retrieve_form()directement est le module Mollom dans mollom_moderate () , qui l'utilise pour soumettre automatiquement un formulaire. Le code pourrait utiliser drupal_form_submit () , mais (comme le dit un commentaire), "Les soumissions de formulaires programmatiques ne peuvent pas utiliser automatiquement le bouton / l'action de soumission de formulaire principal, nous devons donc ressembler drupal_form_submit()."

  $form_id = $form_info['delete form'];
  $form_state = form_state_defaults();
  // We assume that all delete confirmation forms take the fully loaded
  // entity as (only) argument.
  $messages[] = "Attempt to load $form_info[entity] entity via entity_load().";
  $entities = entity_load($data->entity, array($data->id));
  $form_state['build_info']['args'][] = $entities[$data->id];
  $form = drupal_retrieve_form($form_id, $form_state);

  $form_state['values'] = array();
  $form_state['values']['mollom']['feedback'] = '';
  // Take over the primary submit button of confirm_form().
  $form_state['values']['op'] = $form['actions']['submit']['#value'];

  $form_state['input'] = $form_state['values'];
  $form_state['programmed'] = TRUE;
  // Programmed forms are always submitted.
  $form_state['submitted'] = TRUE;

  // Reset form validation.
  $form_state['must_validate'] = TRUE;
  form_clear_error();

  drupal_prepare_form($form_id, $form, $form_state);
  drupal_process_form($form_id, $form, $form_state);

  $result = $form_state['executed'];
kiamlaluno
la source