hook_form_alter in ge-alterde formulieren

De toepassing van hook_form_alter() in eigen of bestaande formulieren is een tamelijk recht-toe-recht-aan proces. Iets ingewikkelder wordt het wanneer velden moeten worden aangepast die zijn gegenereerd door hook_form_alter() in een andere module.

Laat ik als voorbeeld nemen mijn Skip-Maintenance-Mode-By-IP module. Deze module voegt enkele velden toe aan Drupal's maintenance mode settings pagina. Dit wordt eenvoudig bereikt door toepassing van hook_form_alter(), die de 3 formuliervelden toevoegt aan het maintenance mode settings formulier. Stel nu dat je de titel van één van deze 3 tekstvelden zou willen wijzigen, bijvoorbeeld van 'IP address 1' naar 'First IP address'. 

Normaal gesproken zou je het volgende doen:

<?php
function mijnmodule_form_alter(&$form, &$form_state, $form_id) {
  switch($form_id) {
  case 'system_site_maintenance_mode':
    $form['ip1']['#title'] = 'First IP address';
    break;
  };
}
?>

Wie het bovenstaande uitprobeert zal merken dat dit niet werkt. Velden door andere modules toegevoegd aan het formulier worden namelijk niet gegenereerd op het moment dat de $form array wordt opgebouwd, maar erna, tijdens de #after_build fase.

Hiertoe bevat de $form array het element #after_build, een array met de namen van de functies die worden aangeroepen nadat de $form array is opgebouwd. Om dus de titel van het tekstveld -zoals hierboven beschreven- te wijzigen, moet eerst onze after_build functie worden toegevoegd aan de #after_build array. In de after_build functie kunnen dan vervolgens de aanpassingen aan het formulier worden gemaakt:

<?php
function mijnmodule_form_alter(&$form, &$form_state, $form_id) {
  switch($form_id) {
  case 'system_site_maintenance_mode':
    $form['#after_build'] = 'example_after_build';
    break;
  };
}

function example_after_build($form, &$form_state) {
  $form['ip1']['#title'] = 'First IP address';
  return $form;
}
?>