You are here

function field_label_field_formatter_third_party_settings_form in Field Label 8

Implements hook_field_formatter_third_party_settings_form().

Adds fields for modifying the class and label value for field that have a label.

File

./field_label.module, line 60
Provides custom settings to format field labels.

Code

function field_label_field_formatter_third_party_settings_form(FormatterInterface $plugin, FieldDefinitionInterface $field_definition, $view_mode, $form, FormStateInterface $form_state) {

  // Get the module config.
  $config = \Drupal::config('field_label.settings');

  // Get the current user.
  $user = \Drupal::currentUser();

  // Load the formatter settings.
  $setting_keys = [
    'label_class',
    'label_class_select',
    'label_value',
    'label_tag',
  ];

  // Ensure at least one feature enabled.
  $has_enabled = FALSE;

  // Ensure user has access to edit at least one setting.
  $has_access = FALSE;

  // Load up the settings array:
  foreach ($setting_keys as $key) {
    $settings[$key] = [
      'enabled' => $config
        ->get($key . '_enabled'),
      'value' => $plugin
        ->getThirdPartySetting('field_label', $key),
      'access' => $user
        ->hasPermission('edit_field_' . $key),
    ];
    $has_enabled = $has_enabled ?: $settings[$key]['enabled'];
    $has_access = $has_access ?: $settings[$key]['access'];
  }

  // Bail out if nothing is enabled, or user has no access.
  if (!$has_enabled || !$has_access) {
    return [];
  }

  // Detial wrapper element to keep things tidy.
  $elements['field_label'] = [
    '#type' => 'details',
    '#title' => t('Label settings'),
    // Default to open if we have any values to show.
    '#open' => $settings['label_class']['value'] || $settings['label_value']['value'] || $settings['label_tag']['value'],
  ];

  // For each available setting, build the full field if the user has access.
  // If not, build a hidden field to retain any previous values.
  // Label value field.
  if ($settings['label_value']['enabled']) {
    if ($settings['label_value']['access']) {
      $elements['field_label']['label_value'] = [
        '#type' => 'textfield',
        '#title' => t('Label value'),
        '#description' => t('Overwrite the default field label.'),
        '#default_value' => $settings['label_value']['value'],
      ];
    }
    else {
      $elements['field_label']['label_value'] = [
        '#type' => 'hidden',
        '#value' => $settings['label_value']['value'],
      ];
    }
  }

  // Label class list.
  if ($settings['label_class_select']['enabled']) {
    if ($settings['label_class_select']['access']) {

      // Ensure valid default value.
      $default = '';
      if ($valid_style = _field_label_is_valid_style($settings['label_class_select']['value'])) {
        $default = $valid_style['selector'];
      }
      $elements['field_label']['label_class_select'] = [
        '#type' => 'select',
        '#title' => t('Label class'),
        '#description' => t('Select a class to add to the label tag.'),
        '#empty_value' => '',
        '#options' => _field_label_generate_styles(),
        '#default_value' => $default,
      ];
    }
    else {
      $elements['field_label']['label_class_select'] = [
        '#type' => 'hidden',
        '#value' => $default,
      ];
    }
  }

  // Label class field.
  if ($settings['label_class']['enabled']) {
    if ($settings['label_class']['access']) {
      $elements['field_label']['label_class'] = [
        '#type' => 'textfield',
        '#title' => t('Extra label classes'),
        '#description' => t('Space-separated list of valid classnames (no dots). <b>Ex:</b> <code>class-one class__two</code>'),
        '#default_value' => $settings['label_class']['value'],
      ];
    }
    else {
      $elements['field_label']['label_class'] = [
        '#type' => 'hidden',
        '#value' => $settings['label_class']['value'],
      ];
    }
  }

  // Label tag field.
  if ($settings['label_tag']['enabled']) {
    if ($settings['label_tag']['access']) {
      $tag_options = [];
      $allowed_tags = $config
        ->get('allowed_tags');
      foreach ($allowed_tags as $tag) {
        $tag_options[$tag] = $tag;
      }
      $elements['field_label']['label_tag'] = [
        '#type' => 'select',
        '#title' => t('Label wrapper'),
        '#description' => t('Select a tag to wrap the label value. Choose "Default" to use the wrapper provided by the theme.'),
        '#empty_option' => '- Default -',
        '#empty_value' => '',
        '#options' => $tag_options,
        '#default_value' => $settings['label_tag']['value'],
      ];
    }
    else {
      $elements['field_label']['label_tag'] = [
        '#type' => 'hidden',
        '#value' => $settings['label_tag']['value'],
      ];
    }
  }
  return $elements['field_label'];
}