The Drupal Form API is powerful, but very extensive and complicated. In another post we discussed how to add a custom element from scratch. Watch out for the errors and mistakes highlighted in this advanced-level post.

Element and Field Defaults

To fully understand the API, you need to understand how elements are built. When you define a form field, custom or not, you have to give it a #type .

When the form is being built, Drupal will look at the #type and decide what to do with it. If it's a custom element you've defined, Drupal will look at the hook_element_info() that defined that custom element, and grab all the information from that array. That is, keys and values in that array will be merged into your field. This allows you to set defaults for that element #type . Let's look at an example. For simplification, let's define a basic custom element type:

1 2 3 4 5 6 7 8 <?php function example_element_info () { $elements [ 'custom_element' ] = array ( // Element declaration here ... ); return $elements ; }

Note that this element won't do much. But now, let's use it in a form:

1 2 3 4 5 6 7 8 <?php function example_some_form () { $form [ 'my_field' ] = array ( '#type' => 'custom_element' , ); return $form ; }

If we want each usage of the element to, by default, have certain properties, we can just add it to the hook_element_info() function. So doing this:

1 2 3 4 5 6 7 8 9 <?php function example_element_info () { $elements [ 'custom_element' ] = array ( // Rest of element declaration here ... '#some_property' => 'some_property' , ); return $elements ; }

Will mean that all uses of your element in forms would be as if you had declared the form like so:

1 2 3 4 5 6 7 8 9 <?php function example_some_form () { $form [ 'my_field' ] = array ( '#type' => 'custom_element' , '#some_property' => 'some_property' , ); return $form ; }