В чем разница между drupal_get_form и drupal_retrieve_form?

10

В чем разница между drupal_get_form()и drupal_retrieve_form()? Может кто-нибудь объяснить разницу? Я смотрю на API, но описание похоже на меня.

Джо
источник
Я думаю, что одно ключевое отличие заключается в том, что drupal_retrieve_form()ваш код получает доступ к обновленным, так $form_stateкак он передается по ссылке, но drupal_get_form()просто возвращает состояние $form, а не состояние.
Феликс Ив

Ответы:

10

Разница заключается в том, что 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'];
киамлалуно
источник