Was ist der Unterschied zwischen drupal_get_form und drupal_retrieve_form?

10

Was ist der Unterschied zwischen drupal_get_form()und drupal_retrieve_form()? Kann jemand den Unterschied erklären? Ich schaue auf die API, aber die Beschreibung scheint mir ähnlich zu sein.

Joe
quelle
Ich denke, ein wesentlicher Unterschied besteht darin, drupal_retrieve_form()dass Ihr Code auf das aktualisierte Dokument zugreifen kann, $form_statewenn es als Referenz übergeben wird. Geben Sie jedoch drupal_get_form()nur das $formund nicht den Status zurück.
Felix Eve

Antworten:

10

Der Unterschied besteht darin, dass drupal_get_form()das automatische Abrufen, Verarbeiten und Anzeigen eines gerenderten HTML-Formulars für Module behandelt wird, während drupal_retrieve_form()das strukturierte Array zurückgegeben wird, das ein Formular definiert.

Formular abrufen

drupal_get_form()prüft zunächst mit form_get_cache () , ob das Formular im Formularcache vorhanden ist ; Wenn es nicht vorhanden ist, ruft es drupal_retrieve_form () und drupal_prepare_form () auf .

Bearbeitung des Formulars

drupal_get_form()ruft drupal_process_form () auf , die Funktion, die drupal_validate_form () aufruft und die Übermittlungshandler mit form_execute_handlers () aufruft .

Formular rendern

Das Rendern erfolgt von drupal_process_form(), das form_builder () aufruft .

In den meisten Fällen drupal_get_form()ist die Funktion zu verwenden, wie im folgenden Code.

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

Das einzige Modul, das ich gefunden habe und das drupal_retrieve_form()direkt aufruft, ist das Mollom-Modul in mollom_moderate () , das es zum automatischen Senden eines Formulars verwendet. Der Code könnte drupal_form_submit () verwenden , aber (wie ein Kommentar sagt): "Programmatische Formularübermittlungen können die Schaltfläche / Aktion zum Senden des primären Formulars nicht automatisch verwenden, daher müssen wir uns ähneln 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
quelle