Form API

https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.h...

ex pratique

$form_state['redirect'] = array(
  'node/[node number]',
  array(
    'query' => array(
      'variable_name' => 'value',
    ),
    'fragment' => 'hash_fragment'
  ),    
);

crée l'url:   ..?node/[node number]&variable_name=value#hash_fragment


1. drupal_build_form (wrapped by drupal_get_form())

  • merge in form_state_defaults()
  • return if batch processing: drupal_rebuild_form($form_id, $_SESSION['batch_form_state'])
  • try cache: form_get_cache($form_state['input']['form_build_id'])
  • otherwise
    • drupal_retrieve_form()
      • array from hook_forms() callback or $form_id()
    • drupal_prepare_form()
      • generate #form_build_id and optional #token
      • form defaults incl. #tree, #method, #validate, #submit, #theme
      • hook_form_alter
      • hook_form_BASE_FORM_ID_alter
      • hook_form_FORM_ID_alter
  • with cached or new form: drupal_process_form()
    • with form_builder()
      • element_info(#type)
      • user #input
      • #process happens on the way down with recursion
      • set any values, inherit any #disabled, #access etc.
      • (recurse into children with form_builder())
      • #after_build happens on the way back up with recursion
    • form submission? drupal_validate_form()
      • #token
      • _form_validate()
        • #maxlength
        • #options
        • #required
        • validate:
          • $form_state['#validate_handlers']
          • or
          • $form['#validate']
        • #element_validate
      • no errors?
        • #submit
        • cache clear
        • batch process
        • drupal_redirect_form()
      • drupal_form_submit() - quit now
      • multistep: $form_state['rebuild']
        • drupal_rebuild_form()
    • form/form state caching

2. drupal_rebuild_form()

  • drupal_retrieve_form()
  • AJAX / partial form - reuse #build_id, fix #action
  • drupal_prepare_form()
  • cache earlier than drupal_process_form()
  • form_builder()
  • [unlike drupal_process_form(), no submission validation]

3. drupal_form_submit()

  • merge in form_state_defaults()
  • drupal_retrieve_form()
  • (always submit; suppress errors)
  • drupal_prepare_form()
  • drupal_process_form()

cliquer pour voir en taille réelle

logo drush