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.
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.
Odpowiedzi:
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.
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 () .
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 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'];
drupal_retrieve_form()pozwalasz twojemu kodowi uzyskać dostęp do zaktualizowanego,$form_stateponieważ jest przekazywany przez referencję, jednakdrupal_get_form()po prostu zwróć$form, a nie stan.