¿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.
¿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.
Respuestas:
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.
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 () .
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 () .
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'];
drupal_retrieve_form()
permite que su código acceda a la actualización a$form_state
medida que se pasa por referencia, sin embargo,drupal_get_form()
solo devuelve el estado$form
, no el estado.