В чем разница между 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
, а не состояние.