Correct way to extended Field Settings I'm doing something that works fine but I get the feeling there is a better way.

I have managed to extend the field settings in the field's manage page to add two new checkboxes. The checkboxes in this case, allow the input form field to be rendered with a Bootstap Add-ON for things like £ signs via my themes template.php

Adding the checkboxes using hook_field_widget_form_alter seems ok (although checking for args is a bit rubbish).

It's the 'wangle' I have to do in hook_widget_validate to get the settings to be incorporated in to the other field settings and saved to the database that is a bit nasty.

There must be a nicer way to do it than that so the question is ..

What is the standard (or better than this) way to extend a field's settings without creating a new widget ?

For reference, here is my code, firstly the added checkboxes  :

&lt;?php
/**
 * Implements hook_field_widget_form_alter().
 */
function mymodule_field_widget_form_alter(&amp;$element, &amp;$form_state, $context) {
  if (arg(5) == 'fields' || arg(4) == 'fields') {
    if (isset($element['value'])) {
      $name = $context['field']['field_name'];
      // PREPEND.
      $val = 0;
      if (isset($form_state['field'][$name][LANGUAGE_NONE]['instance']['settings']['pre_on'])) {
        $val = $form_state['field'][$name][LANGUAGE_NONE]['instance']['settings']['pre_on'];
      }
      $element['#element_validate'][] = 'village_widget_validate';
      $element['pre_on']              = array(
        '#title'         =&gt; t('Render Prefix as Prepend'),
        '#type'          =&gt; 'checkbox',
        '#default_value' =&gt; $val,
      );
      // APPEND.
      $val = 0;
      if (isset($form_state['field'][$name][LANGUAGE_NONE]['instance']['settings']['app_on'])) {
        $val = $form_state['field'][$name][LANGUAGE_NONE]['instance']['settings']['app_on'];
      }
      $element['#element_validate'][] = 'village_widget_validate';
      $element['app_on']              = array(
        '#title'         =&gt; t('Render Suffix as Append'),
        '#type'          =&gt; 'checkbox',
        '#default_value' =&gt; $val,
      );
    }
  }
}
?&gt;


The silly 'wangle' in the form validation to get the custom added fields to save as proper field instance settings that can be reteived.

&lt;?
/**
 * Form validation handler for village_field_widget_form_alter().
 */
function mymodule_widget_validate($element, &amp;$form_state) {
  if (isset($element['pre_on']['#value'])) {
    $form_state['values']['instance']['settings']['pre_on'] = $element['pre_on']['#value'];
  }
  if (isset($element['app_on']['#value'])) {
    $form_state['values']['instance']['settings']['app_on'] = $element['app_on']['#value'];
  }
}
?&gt;


And for completeness here is the counterpart in my template.php that checks for the settings and adds some markup.

&lt;?php
/**
 * Implements hook_form_element().
 */
function mytheme_form_element(&amp;$variables) {
  // Default suffix.
  $suffix = isset($element['#field_suffix']) ? ' &lt;span class="field-suffix"&gt;' . $element['#field_suffix'] . '&lt;/span&gt;' : '';
  // Check for field settings.
  if(isset($element['#field_name'])){
      if (isset($element['#bundle'])) {
      $field_instance = field_info_instance($element['#entity_type'], $element['#field_name'], $element['#bundle']);
      if(isset($field_instance['settings']['app_on'])){
        // Our Bootstrapped suffix.
        $addoncls .= 'input-prepend '; 
        $suffix = isset($element['#field_suffix']) ? ' &lt;span class="field-suffix add-on"&gt;' . $element['#field_suffix'] . '&lt;/span&gt;' : '';
      }
    }
  }
  // Complied element.
  $output .= '&lt;div class="'.$addoncls.'"&gt;' . $prefix . $element['#children'] . $suffix . "&lt;/div&gt;";
  return $output;
}
?&gt;


The only bit of interest is the recalling via.

$field_instance = field_info_instance($element['#entity_type'], $element['#field_name'], $element['#bundle']);
$field_instance['settings']['app_on'];
You can add extra field instance settings as part of you custom module using hook_form_FORM_ID_alter, e.g.

/**
 * Implements hook_form_FORM_ID_alter().
 */
function FOO_form_field_ui_field_edit_form_alter(&amp;$form, $form_state, $form_id) {
  $field = $form['#field'];

  // @todo: Consider adding extra condition.

  // Inject setting form element to an instance settings form.
  $form['instance']['settings']['pre_on'] = array(
    '#type' =&gt; 'checkbox',
    '#title' =&gt; t('Render Prefix as Prepend'),
    '#description' =&gt; t('Some description'),
    '#default_value' =&gt; isset($form['#instance']['settings']['pre_on']) ? $form['#instance']['settings']['pre_on'] : NULL,
  );
}


If you don't want to create new module for a single checkbox, consider adding this hook into your template.php file as part of your theme.