Jaka jest różnica między drupal_get_form i drupal_retrieve_form?

10

Jaka jest różnica między drupal_get_form()i drupal_retrieve_form()? Czy ktoś może wyjaśnić różnicę? Patrzę na interfejs API, ale opis wydaje się podobny do mnie.

Joe
źródło
Myślę, że jedną kluczową różnicą jest to, że drupal_retrieve_form()pozwalasz twojemu kodowi uzyskać dostęp do zaktualizowanego, $form_stateponieważ jest przekazywany przez referencję, jednak drupal_get_form()po prostu zwróć $form, a nie stan.
Felix Eve

Odpowiedzi:

10

Różnica polega na tym, że automatycznie drupal_get_form()obsługuje pobieranie, przetwarzanie i wyświetlanie renderowanego formularza HTML dla modułów, a drupal_retrieve_form()zwraca tablicę strukturalną, która definiuje formularz.

Pobieranie formularza

drupal_get_form()najpierw sprawdza, czy formularz jest obecny w pamięci podręcznej formularza za pomocą form_get_cache () ; jeśli nie jest obecny, wywołuje drupal_retrieve_form () i drupal_prepare_form () .

Przetwarzanie formularza

drupal_get_form()wywołuje drupal_process_form () , która jest funkcją wywołującą drupal_validate_form () i która wywołuje procedury obsługi przesyłania za pomocą form_execute_handlers () .

Renderowanie formularza

Renderowanie odbywa się z drupal_process_form(), który wywołuje form_builder () .

W większości przypadków drupal_get_form()należy użyć funkcji, na przykład w poniższym kodzie.

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

Jedynym modułem, który znalazłem, który wywołuje drupal_retrieve_form()bezpośrednio, jest moduł Mollom w mollom_moderate () , który używa go do automatycznego przesyłania formularza. Kod może używać drupal_form_submit () , ale (jak mówi komentarz): „Programowe przesyłanie formularzy nie jest w stanie automatycznie używać przycisku / akcji przesyłania formularza podstawowego, więc musimy przypominać 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
źródło