Яка різниця між 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'];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.