function field_extractor_field_formatter_settings_form in Field Extractor 7
Implements hook_field_formatter_settings_form().
File
- ./
field_extractor.module, line 41 - Provides a formatter that displays a field from the referenced entities.
Code
function field_extractor_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
$settings = field_extractor_settings($field, $instance);
$display = $instance['display'][$view_mode];
$extractor_settings = $display['settings'];
// If the form was rebuilt via AJAX, use the values from the form state.
if (!empty($form_state['values']['fields'][$field['field_name']]['settings_edit_form'])) {
$defaults = array(
'field_name' => '',
'formatter' => '',
'settings' => array(),
);
$extractor_settings = $form_state['values']['fields'][$field['field_name']]['settings_edit_form']['settings'] + $defaults;
}
// Build a list of available fields for all bundles available to the field.
$fields = array();
foreach (field_info_instances($settings['entity_type']) as $bundle => $instances) {
if (in_array($bundle, $settings['bundles'])) {
foreach ($instances as $field_name => $field_instance) {
$fields[$field_name] = $field_name;
}
}
}
// If no field has been selected yet, or the current one is no longer
// available, default to the first one.
if (empty($extractor_settings['field_name']) || !isset($fields[$extractor_settings['field_name']])) {
$field_names = array_keys($fields);
$extractor_settings['field_name'] = reset($field_names);
}
// Determine if the formatter settings are being embedded inside Views.
// That is not supported.
if ($instance['entity_type'] == 'ctools' && $instance['bundle'] == 'ctools') {
return array(
'#markup' => t("This formatter can't be used inside Views. Use the provided Views field instead."),
);
}
$id = 'field-extractor-' . $instance['entity_type'] . '-' . $field['field_name'];
$element = array();
$element['#prefix'] = '<div id="' . $id . '">';
$element['#suffix'] = '</div>';
$element['field_name'] = array(
'#type' => 'select',
'#title' => t('Field'),
'#options' => $fields,
'#default_value' => $extractor_settings['field_name'],
'#ajax' => array(
'wrapper' => $id,
'callback' => 'field_extractor_ajax',
),
// Data for the #ajax callback.
'#reference_field' => $field['field_name'],
);
$selected_field = field_info_field($extractor_settings['field_name']);
$formatters = _field_extractor_formatters($selected_field['type']);
// No recursion.
unset($formatters['field_extractor']);
// If no formatter has been selected yet, or doesn't fit the current field,
// default to the first one.
if (empty($extractor_settings['formatter']) || !isset($formatters[$extractor_settings['formatter']])) {
$formatter_names = array_keys($formatters);
$extractor_settings['formatter'] = reset($formatter_names);
}
$element['formatter'] = array(
'#type' => 'select',
'#title' => t('Formatter'),
'#options' => $formatters,
'#default_value' => $extractor_settings['formatter'],
'#ajax' => array(
'wrapper' => $id,
'callback' => 'field_extractor_ajax',
),
// Data for the #ajax callback.
'#reference_field' => $field['field_name'],
);
$formatter = field_info_formatter_types($extractor_settings['formatter']);
$formatter_settings = $extractor_settings['settings'] + field_info_formatter_settings($extractor_settings['formatter']);
// Provide an instance array for hook_field_formatter_settings_form().
ctools_include('fields');
$instance = ctools_fields_fake_field_instance($extractor_settings['field_name'], '_dummy', $formatter, $formatter_settings);
// Store the settings in a '_dummy' view mode.
$instance['display']['_dummy'] = array(
'type' => $extractor_settings['formatter'],
'settings' => $formatter_settings,
);
// Get the settings form.
$settings_form = array(
'#value' => array(),
);
$function = $formatter['module'] . '_field_formatter_settings_form';
if (function_exists($function)) {
$settings_form = $function($selected_field, $instance, '_dummy', $element, $form_state);
}
$element['settings'] = array(
'#type' => 'fieldset',
'#title' => t('Formatter settings'),
) + $settings_form;
return $element;
}