You are here

function ds_theme_suggestions_field_alter in Display Suite 8.4

Same name and namespace in other branches
  1. 8.2 ds.module \ds_theme_suggestions_field_alter()
  2. 8.3 ds.module \ds_theme_suggestions_field_alter()

Implements hook_theme_suggestions_HOOK_alter().

The suggestion alters for field templates.

File

./ds.module, line 788
Display Suite core functions.

Code

function ds_theme_suggestions_field_alter(&$suggestions, $variables) {
  $entity_type = $variables['element']['#entity_type'];
  $bundle = $variables['element']['#bundle'];
  $view_mode = isset($variables['element']['#ds_view_mode']) ? $variables['element']['#ds_view_mode'] : $variables['element']['#view_mode'];

  /* @var $entity_display EntityDisplayInterface */
  $entity_display = Ds::getDisplay($entity_type, $bundle, $view_mode);

  // Check if this field is being rendered as a layout builder FieldBlock and
  // that layout builder field templates are enabled
  // @see Drupal\layout_builder\Plugin\Block\FieldBlock::build();
  $is_layout_builder = !empty($variables['element']['#third_party_settings']['layout_builder']['view_mode']) && \Drupal::config('ds.settings')
    ->get('ft-layout-builder');
  if ($entity_display && ($entity_display
    ->getThirdPartySetting('ds', 'layout') || $is_layout_builder)) {

    // Get the field name and field instance info - if available.
    $field_name = $variables['element']['#field_name'];
    $field_theme_function = \Drupal::config('ds.settings')
      ->get('ft-default');
    if ($is_layout_builder && !empty($variables['element']['#third_party_settings']['ds']['ft'])) {
      $field_settings[$entity_type][$bundle][$view_mode][$field_name]['ft'] = $variables['element']['#third_party_settings']['ds']['ft'];
    }
    else {
      static $field_settings = [];
      if (!isset($field_settings[$entity_type][$bundle][$view_mode])) {
        $f = [];

        // Get third party settings for Core fields.
        foreach ($entity_display
          ->getComponents() as $key => $info) {
          if (!empty($info['third_party_settings']['ds']['ft'])) {
            $f[$key]['ft'] = $info['third_party_settings']['ds']['ft'];
          }
        }

        // Get third party settings for Display Suite fields.
        $ds_fields_third_party_settings = $entity_display
          ->getThirdPartySetting('ds', 'fields');
        if ($ds_fields_third_party_settings) {
          $f += $entity_display
            ->getThirdPartySetting('ds', 'fields');
        }
        $field_settings[$entity_type][$bundle][$view_mode] = $f;
      }
    }
    $field = FieldConfig::loadByName($entity_type, $bundle, $field_name);

    // Check if this field has custom output settings.
    $config = [];
    if (isset($field_settings[$entity_type][$bundle][$view_mode][$field_name]['ft'])) {
      $config = $field_settings[$entity_type][$bundle][$view_mode][$field_name]['ft'];
    }

    // Initialize suggestion name.
    $suggestion = '';

    // Determine the field template. In case it's something different.
    if (isset($config['id']) && $config['id'] != 'default') {
      $layout_instance = \Drupal::service('plugin.manager.ds.field.layout')
        ->createInstance($config['id']);

      // Either it uses the function.
      $suggestions[] = 'field__' . $layout_instance
        ->getThemeFunction();

      // Or the template file(s).
      $suggestion = 'field__' . $config['id'];
    }
    elseif ($field instanceof FieldConfigInterface && ($theme_function = $field
      ->getThirdPartySetting('ds', 'ds_field_template', '')) && !empty($theme_function)) {

      // Either it uses the function.
      $suggestions[] = 'field__theme_ds_field_' . $theme_function;

      // Or the template file(s).
      $suggestion = 'field__' . $theme_function;
    }
    elseif (!empty($field_theme_function)) {
      $suggestions[] = 'field__theme_ds_field_' . $field_theme_function;

      // Or the template file(s).
      $suggestion = 'field__' . $field_theme_function;
    }
    if (!empty($suggestion)) {
      $suggestions[] = $suggestion;
      $suggestions[] = $suggestion . '__' . $field_name;
      $suggestions[] = $suggestion . '__' . $variables['element']['#bundle'];
      $suggestions[] = $suggestion . '__' . $field_name . '__' . $variables['element']['#bundle'];
      $suggestions[] = $suggestion . '__' . $variables['element']['#entity_type'] . '__' . $field_name;
      $suggestions[] = $suggestion . '__' . $variables['element']['#entity_type'] . '__' . $variables['element']['#bundle'];
      $suggestions[] = $suggestion . '__' . $variables['element']['#entity_type'] . '__' . $field_name . '__' . $variables['element']['#bundle'];
    }

    // Custom DS fields name may contain colon separators or dashes; replace it
    // with "__" or "_" to ensure suggestions are compatible with file names on
    // all systems.
    foreach ($suggestions as $key => $suggestion) {
      $suggestions[$key] = str_replace([
        ':',
        '-',
      ], [
        '__',
        '_',
      ], $suggestion);
    }
  }
}