function view_mode_selector_field_widget_form in View Mode Selector 7
Implements hook_field_widget_form().
File
- ./
view_mode_selector.module, line 145 - Main file of View Mode Selector module.
Code
function view_mode_selector_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
$entity_type = $instance['entity_type'];
$entity_bundle = $instance['bundle'];
$element['value'] = $element + array(
'#type' => 'select',
'#options' => array(),
'#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL,
'#attached' => array(
'css' => array(
drupal_get_path('module', 'view_mode_selector') . '/css/view-mode-selector.css',
),
),
);
// Get all view modes of the entity type.
$view_modes = view_mode_selector_view_modes($entity_type);
// Gather enabled view modes.
foreach ($view_modes as $view_mode => $view_mode_settings) {
if (isset($instance['settings']['view_modes'][$view_mode]) && $instance['settings']['view_modes'][$view_mode]['enable']) {
$label = $view_modes[$view_mode]['label'];
$element['value']['#options'][$view_mode] = $label;
}
}
// Show all view modes in widget when no view modes are enabled.
if (!count($element['value']['#options'])) {
foreach ($view_modes as $view_mode => $view_mode_settings) {
$label = $view_modes[$view_mode]['label'];
$element['value']['#options'][$view_mode] = $label;
}
}
// Cut out all view modes with Display Suite layouts with regions.
if (module_exists('ds')) {
$ds_view_modes = array();
foreach ($element['value']['#options'] as $view_mode => $view_mode_label) {
$layout = ds_get_layout($entity_type, $entity_bundle, $view_mode);
if (!$layout || !isset($layout['settings']['regions'])) {
continue;
}
$ds_view_modes[$view_mode] = array(
'label' => $element['value']['#options'][$view_mode],
'layout' => $layout,
);
unset($element['value']['#options'][$view_mode]);
}
// Sort Display Suite view modes by number of regions.
uasort($ds_view_modes, '_view_mode_selector_sort_by_region_count');
// Append the sorted view modes to the field options.
foreach ($ds_view_modes as $view_mode => $ds_view_mode) {
$element['value']['#options'][$view_mode] = $ds_view_mode['label'];
}
}
// Icon support for radio widget.
if ($instance['widget']['type'] == 'view_mode_selector_radios') {
$element['value']['#type'] = 'radios';
// Override label with preview or icon if available.
foreach ($element['value']['#options'] as $view_mode => $view_mode_label) {
$output = array();
if (!empty($instance['settings']['view_modes'][$view_mode]['icon'])) {
$icon = file_load($instance['settings']['view_modes'][$view_mode]['icon']);
if (!$icon) {
continue;
}
$output[] = theme('image', array(
'path' => file_create_url($icon->uri),
'attributes' => array(
'title' => $view_modes[$view_mode]['label'],
),
));
}
elseif (module_exists('ds') && isset($ds_view_modes[$view_mode])) {
$layout = $ds_view_modes[$view_mode]['layout'];
// Create a new empty entity for the preview.
$entity_properties = array(
'type' => $entity_bundle,
'id' => FALSE,
);
$entity = entity_create($entity_type, $entity_properties);
$entity_view = entity_view($entity_type, array(
$entity,
), $view_mode);
// Render one field containing a placeholder <div> in every region.
$count = 0;
foreach ($layout['settings']['regions'] as $region_settings) {
foreach ($region_settings as $field) {
$count++;
$entity_view[$entity_type][0][$field] = array(
'#type' => 'html_tag',
'#tag' => 'div',
'#value' => $instance['settings']['number_placeholders'] ? $count : '',
'#attributes' => array(
'class' => 'placeholder',
),
'#field_name' => $field,
);
continue;
}
}
// Disable contextual links.
$entity_view[$entity_type][0]['#contextual_links'] = FALSE;
// Render the preview.
$output[] = drupal_render($entity_view);
}
else {
$element['value'][$view_mode]['#attributes']['class'][] = 'no-preview';
}
// Render the title.
if (isset($instance['settings']['view_modes'][$view_mode]['hide_title']) && !$instance['settings']['view_modes'][$view_mode]['hide_title']) {
$output[] = '<small>' . $view_modes[$view_mode]['label'] . '</small>';
}
// Use the generated markup as our label value.
$element['value']['#options'][$view_mode] = implode($output, '');
}
}
return $element;
}