Using hook_form_BASE_FORM_ID_alter()
hook_form_alter() is the go-to function for making changes to forms that are used across Drupal. We all use it. We all love it.
But since Drupal 7, you can also use a variant of this function: hook_form_BASE_FORM_ID_alter(). Here's a simple visual of how it works:
hook_form_alter() fires on all Drupal forms (the big circle). With hook_form_BASE_FORM_ID_alter(), you can restrict it to firing on a subset of forms (one of the smaller circles), which can save Drupal some processing. (to get even more specific, you could target a single form by using hook_form_FORM_ID_alter(), but I'll leave that discussion for another day).
You can find the Base Form ID by printing out the $form_state variable in a normal hook_form_alter, like so:
function mymodule_form_alter(&$form, &$form_state, $form_id) {
// You must enable the devel module in order to use this function.
dpm($form_state); // Prints $form_state to the page.
}
The "base_form_id" is tucked away in the "build_info" array.
If you want to implement hook_BASE_FORM_id_alter, here is a simple example:
function mymodule_form_node_form_alter(&$form, &$form_state, $form_id) {
// Find the content type of the node we are editing.
$content_type = $form['#node']->type;
if ($content_type == 'article') {
// Alter the 'article' form here.
}
}
As you can imagine, these tools aren't worth much if you don't know which Base Form ID's are out there. I dug around Drupal core a bit and these are the ones I was able to find.
Base Form IDs in Drupal 7:
node_form
--- for node edit formscomment_form
--- for comment forms
Base Form IDs in Drupal 8
(as of August 16, 2013)
node_form
--- for node edit formscomment_form
--- for comment formsmenu_form
--- for menu formsmenu_link_form
--- for menu link formsnode_type_form
--- for content type formscustom_block_form
--- for custom block formstaxonomy_term_form
--- for taxonomy term formscontact_category_form
--- for site-wide contact category formsdate_format_form
--- for date/time format formsimage_style_form
--- for image style formsfilter_format_form
--- for text format formsview_form
--- for views formscustom_block_type_form
--- for block type forms (new in Drupal 8)form_mode_form
--- for form mode forms (new in Drupal 8)view_mode_form
--- for view mode forms (new in Drupal 8)
Base Form IDs in major Contrib modules:
webform_client_form
--- for webforms (from the webform module)
As you can see, the API is implemented most thoroughly in Drupal 8. If you know about ones that I missed, just mention them in the comments below and I'll add them to the list.