You are here

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;
}