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 :
<?php
/**
* Implements hook_field_widget_form_alter().
*/
function mymodule_field_widget_form_alter(&$element, &$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' => t('Render Prefix as Prepend'),
'#type' => 'checkbox',
'#default_value' => $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' => t('Render Suffix as Append'),
'#type' => 'checkbox',
'#default_value' => $val,
);
}
}
}
?>
The silly 'wangle' in the form validation to get the custom added fields to save as proper field instance settings that can be reteived.
<?
/**
* Form validation handler for village_field_widget_form_alter().
*/
function mymodule_widget_validate($element, &$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'];
}
}
?>
And for completeness here is the counterpart in my template.php that checks for the settings and adds some markup.
<?php
/**
* Implements hook_form_element().
*/
function mytheme_form_element(&$variables) {
// Default suffix.
$suffix = isset($element['#field_suffix']) ? ' <span class="field-suffix">' . $element['#field_suffix'] . '</span>' : '';
// 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']) ? ' <span class="field-suffix add-on">' . $element['#field_suffix'] . '</span>' : '';
}
}
}
// Complied element.
$output .= '<div class="'.$addoncls.'">' . $prefix . $element['#children'] . $suffix . "</div>";
return $output;
}
?>
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'];