Quelle est la difference entre drupal_get_form()
et drupal_retrieve_form()
? Quelqu'un peut-il expliquer la différence? Je regarde l'API, mais la description me semble similaire.
Quelle est la difference entre drupal_get_form()
et drupal_retrieve_form()
? Quelqu'un peut-il expliquer la différence? Je regarde l'API, mais la description me semble similaire.
Réponses:
La différence est que drupal_get_form()
gère la récupération, le traitement et l'affichage automatique d'un formulaire HTML rendu pour les modules, tout en drupal_retrieve_form()
renvoyant le tableau structuré qui définit un formulaire.
drupal_get_form()
vérifie d'abord si le formulaire est présent dans le cache de formulaire avec form_get_cache () ; s'il n'est pas présent, il appelle drupal_retrieve_form () et drupal_prepare_form () .
drupal_get_form()
appelle drupal_process_form () , qui est la fonction qui appelle drupal_validate_form () , et qui appelle les gestionnaires de soumission avec form_execute_handlers () .
Le rendu est effectué à partir de drupal_process_form()
, qui appelle form_builder () .
Dans la plupart des cas, drupal_get_form()
c'est la fonction à utiliser, comme dans le code suivant.
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;
}
Le seul module que j'ai trouvé qui appelle drupal_retrieve_form()
directement est le module Mollom dans mollom_moderate () , qui l'utilise pour soumettre automatiquement un formulaire. Le code pourrait utiliser drupal_form_submit () , mais (comme le dit un commentaire), "Les soumissions de formulaires programmatiques ne peuvent pas utiliser automatiquement le bouton / l'action de soumission de formulaire principal, nous devons donc ressembler 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()
votre code peut accéder à la mise$form_state
à jour telle qu'elle est passée par référence, maisdrupal_get_form()
renvoyez simplement le$form
, pas l'état.