Qual é a diferença entre drupal_get_form e drupal_retrieve_form?

10

Qual é a diferença entre drupal_get_form()e drupal_retrieve_form()? Alguém pode explicar a diferença? Eu olho para a API, mas a descrição parece semelhante a mim.

Joe
fonte
Acho que uma das principais diferenças é que drupal_retrieve_form()permite que seu código acesse a atualização $form_stateconforme é passada por referência; no entanto, drupal_get_form()basta retornar o $form, não o estado.
Felix Eve

Respostas:

10

A diferença é que drupal_get_form()lida com a recuperação, o processamento e a exibição automática de um formulário HTML renderizado para módulos, enquanto drupal_retrieve_form()retorna a matriz estruturada que define um formulário.

Recuperando o formulário

drupal_get_form()primeiro verifica se o formulário está presente no cache do formulário com form_get_cache () ; se não estiver presente, chama drupal_retrieve_form () e drupal_prepare_form () .

Processando o formulário

drupal_get_form()chama drupal_process_form () , que é a função que chama drupal_validate_form () e chama os manipuladores de envio com form_execute_handlers () .

Renderizando o formulário

A renderização é feita a partir de drupal_process_form(), que chama form_builder () .

Na maioria dos casos, drupal_get_form()é a função a ser usada, como no código a seguir.

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

O único módulo que encontrei que está chamando drupal_retrieve_form()diretamente é o módulo Mollom em mollom_moderate () , que o utiliza para enviar automaticamente um formulário. O código pode usar drupal_form_submit () , mas (como diz um comentário), "Os envios de formulário programáticos não podem usar automaticamente o botão / ação de envio de formulário primário, por isso precisamos parecer 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
fonte