¿Cuál es la diferencia entre drupal_get_form y drupal_retrieve_form?

10

¿Cuál es la diferencia entre drupal_get_form()y drupal_retrieve_form()? ¿Alguien puede explicar la diferencia? Miro la API, pero la descripción me parece similar.

Joe
fuente
Creo que una diferencia clave es que drupal_retrieve_form()permite que su código acceda a la actualización a $form_statemedida que se pasa por referencia, sin embargo, drupal_get_form()solo devuelve el estado $form, no el estado.
Felix Eve

Respuestas:

10

La diferencia es que drupal_get_form()maneja la recuperación, el procesamiento y la visualización automática de un formulario HTML representado para los módulos, mientras que drupal_retrieve_form()devuelve la matriz estructurada que define un formulario.

Recuperando el formulario

drupal_get_form()primero comprueba si el formulario está presente en el caché del formulario con form_get_cache () ; si no está presente, llama a drupal_retrieve_form () y drupal_prepare_form () .

Procesando el formulario

drupal_get_form()llama a drupal_process_form () , que es la función que llama a drupal_validate_form () , y que invoca los manejadores de envío con form_execute_handlers () .

Renderizando el formulario

La representación se realiza desde drupal_process_form(), que llama a form_builder () .

En la mayoría de los casos, drupal_get_form()es la función a utilizar, como en el siguiente código.

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;
}

El único módulo que encontré que está llamando drupal_retrieve_form()directamente es el módulo Mollom en mollom_moderate () , que lo usa para enviar automáticamente un formulario. El código podría usar drupal_form_submit () , pero (como dice un comentario), "los envíos de formularios programáticos no pueden usar automáticamente el botón / acción de envío del formulario principal, por lo que debemos asemejarnos 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'];
kiamlaluno
fuente