Qual è la differenza tra drupal_get_form e drupal_retrieve_form?


10

Qual è la differenza tra drupal_get_form()e drupal_retrieve_form()? Qualcuno può spiegare la differenza? Guardo l'API, ma la descrizione mi sembra simile.


Penso che una differenza chiave sia che drupal_retrieve_form()consente al tuo codice di accedere all'aggiornamento $form_statequando viene passato per riferimento, tuttavia drupal_get_form()restituisce solo lo stato $form, non lo stato.
Felix Eve,

Risposte:


10

La differenza è che drupal_get_form()gestisce il recupero, l'elaborazione e la visualizzazione automatica di un modulo HTML renderizzato per i moduli, mentre drupal_retrieve_form()restituisce l'array strutturato che definisce un modulo.

Recupero del modulo

drupal_get_form()controlla innanzitutto se il modulo è presente nella cache dei moduli con form_get_cache () ; se non è presente, chiama drupal_retrieve_form () e drupal_prepare_form () .

Elaborazione del modulo

drupal_get_form()chiama drupal_process_form () , che è la funzione che chiama drupal_validate_form () e che richiama i gestori di invio con form_execute_handlers () .

Rendering del modulo

Il rendering viene eseguito da drupal_process_form(), che chiama form_builder () .

Nella maggior parte dei casi, drupal_get_form()è la funzione da utilizzare, come nel codice seguente.

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

L'unico modulo che ho trovato che chiama drupal_retrieve_form()direttamente è il modulo Mollom in mollom_moderate () , che lo utilizza per inviare automaticamente un modulo. Il codice potrebbe usare drupal_form_submit () , ma (come dice un commento), "Gli invii di moduli programmatici non sono in grado di utilizzare automaticamente il pulsante / azione di invio dei moduli primari, quindi dobbiamo somigliare 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'];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.