У чому різниця між drupal_get_form()
і drupal_retrieve_form()
? Чи може хтось пояснити різницю? Я дивлюся на API, але опис здається мені схожим.
У чому різниця між drupal_get_form()
і drupal_retrieve_form()
? Чи може хтось пояснити різницю? Я дивлюся на API, але опис здається мені схожим.
Відповіді:
Різниця полягає в тому, що drupal_get_form()
обробляє пошук, обробку та відображення відтвореної форми HTML для модулів автоматично, при цьому drupal_retrieve_form()
повертає структурований масив, який визначає форму.
drupal_get_form()
спочатку перевіряє, чи форма присутня в кеші форми з form_get_cache () ; якщо його немає, він викликає drupal_retrieve_form () та drupal_prepare_form () .
drupal_get_form()
викликає drupal_process_form () , яка є функцією, яка викликає drupal_validate_form () , і викликає обробників подання з form_execute_handlers () .
Візуалізація здійснюється з drupal_process_form()
, який викликає form_builder () .
У більшості випадків drupal_get_form()
це функція, яка використовується, наприклад, у наведеному нижче коді.
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;
}
Єдиний модуль, який я виявив, що викликає drupal_retrieve_form()
безпосередньо, - це модуль Mollom в mollom_moderate () , який використовує його для автоматичного надсилання форми. Код може використовувати drupal_form_submit () , але (як йдеться в коментарі), "Програми програмної форми не в змозі автоматично використовувати кнопку / дію для подання первинної форми, тому нам потрібно нагадувати 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()
дозволяє вашому коду отримати доступ до оновлених$form_state
під час передачі посилання, однакdrupal_get_form()
просто поверніть$form
, а не стан.