You are here

ui_patterns_settings.module in UI Patterns Settings 8.2

Same filename and directory in other branches
  1. 8 ui_patterns_settings.module

File

ui_patterns_settings.module
View source
<?php

/**
 * @file
 * Contains ui_patterns_settings.module.
 */
use Drupal\ui_patterns_settings\Plugin\PatternSettingTypeBase;
use Drupal\ui_patterns_settings\Plugin\Layout\PatternSettingsLayout;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\ui_patterns_settings\UiPatternsSettings;
use Drupal\ui_patterns\UiPatterns;
use Drupal\ui_patterns\Definition\PatternDefinition;
use Drupal\ui_patterns_settings\Form\SettingsFormBuilder;
use Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_ui_patterns_layouts_display_settings_form_alter().
 */
function ui_patterns_settings_ui_patterns_layouts_display_settings_form_alter(&$form, PatternDefinition $definition, $configuration) {
  SettingsFormBuilder::layoutForm($form, $definition, $configuration);
}

/**
 * Implements hook_form_field_storage_config_edit_form_alter().
 */
function ui_patterns_settings_form_field_storage_config_edit_form_alter(&$form, FormStateInterface $form_state) {

  /** @var \Drupal\field\Entity\FieldStorageConfig $entity */
  $entity = $form_state
    ->getFormObject()
    ->getEntity();
  array_unshift($form['actions']['submit']['#submit'], 'ui_patterns_settings_form_field_storage_config_edit_form_submit');
  $definitions = UiPatterns::getPatternDefinitions();
  $settings_options = [];
  foreach ($definitions as $definition) {
    $infos = UiPatternsSettings::getExposedPatternDefinition($definition, $entity
      ->getType());
    foreach ($infos as $key => $info) {
      $settings_options[$key] = $info['label'];
    }
  }
  if (count($settings_options) > 0) {
    $mapping = UiPatternsSettings::getConfigManager()
      ->getMapping($entity
      ->id());
    $form['settings']['use_pattern'] = [
      '#type' => 'checkbox',
      '#title' => t('Expose pattern setting'),
      '#default_value' => $mapping !== NULL,
      '#description' => '',
    ];
    $form['settings']['pattern_setting'] = [
      '#type' => 'select',
      '#options' => $settings_options,
      '#title' => 'Pattern Setting',
      '#states' => [
        'invisible' => [
          ':input[name="settings[use_pattern]"]' => [
            'checked' => FALSE,
          ],
        ],
      ],
      '#default_value' => $mapping,
    ];
  }
}

/**
 * Implements hook_form_field_storage_config_edit_form_submit().
 */
function ui_patterns_settings_form_field_storage_config_edit_form_submit(array $form, FormStateInterface $form_state) {
  $settings = $form_state
    ->getValue('settings');

  /** @var \Drupal\field\Entity\FieldStorageConfig $entity */
  $entity = $form_state
    ->getFormObject()
    ->getEntity();
  if (isset($settings['use_pattern']) && $settings['use_pattern'] === 1) {
    UiPatternsSettings::getConfigManager()
      ->addMapping($entity
      ->id(), $settings['pattern_setting']);
  }
  else {
    UiPatternsSettings::getConfigManager()
      ->addMapping($entity
      ->id(), NULL);
  }
}

/**
 * Implements hook_entity_field_storage_info_alter().
 */
function ui_patterns_settings_entity_field_storage_info_alter(&$fields, EntityTypeInterface $entity_type) {

  /** @var \Drupal\field\Entity\FieldStorageConfig $field */
  foreach ($fields as $field) {
    if ($field instanceof FieldStorageConfig) {
      if (($mapping = UiPatternsSettings::getConfigManager()
        ->getMapping($field
        ->id())) !== NULL) {
        [
          $pattern_id,
          $setting_id,
        ] = explode('::', $mapping);
        try {
          $pattern_definition = UiPatterns::getPatternDefinition($pattern_id);
          $settings_definition = UiPatternsSettings::getPatternDefinitionSetting($pattern_definition, $setting_id);
          if ($pattern_definition !== NULL && $settings_definition !== NULL) {
            $type = UiPatternsSettings::createSettingType($pattern_definition, $settings_definition);
            $type
              ->alterFieldStorage($field);
          }
          elseif ($pattern_definition !== NULL && $setting_id === 'variant') {
            $field
              ->setSetting('allowed_values_function', 'ui_patterns_settings_allowed_values_function');
          }
          else {
            \Drupal::messenger()
              ->addError('No pattern setting %setting found');
          }
        } catch (\Exception $e) {
          \Drupal::messenger()
            ->addError($e
            ->getMessage());
        }
      }
      else {
        $field
          ->setSetting('allowed_values_function', NULL);
      }
    }
  }
}

/**
 * The storage config.
 *
 * @param \Drupal\field\Entity\FieldStorageConfig $storage_config
 *   The field storage config.
 *
 * @return string[]
 *   The allowed list of the enumeration.
 */
function ui_patterns_settings_allowed_values_function(FieldStorageConfig $storage_config) {
  [
    $pattern,
    $setting_key,
  ] = explode('::', UiPatternsSettings::getConfigManager()
    ->getMapping($storage_config
    ->id()));
  $pattern_definition = UiPatterns::getPatternDefinition($pattern);
  $settings_definition = UiPatternsSettings::getPatternDefinitionSetting($pattern_definition, $setting_key);
  if ($pattern_definition !== NULL && $settings_definition !== NULL) {
    return $settings_definition
      ->getOptions();
  }
  elseif ($pattern_definition !== NULL && $setting_key === 'variant') {
    return $pattern_definition
      ->getVariantsAsOptions();
  }
  return [];
}

/**
 * Implements hook_ui_patterns_display_form_alter().
 */
function ui_patterns_settings_ui_patterns_display_settings_form_alter(array &$form, $configuration) {
  SettingsFormBuilder::displayForm($form, $configuration);
}

/**
 * Preprocess hook.
 *
 * @param array $variables
 *   Theme variables.
 */
function ui_patterns_settings_preprocess_field__pattern_ds_field_template(array &$variables) {
  $pattern_id = $variables['ds-config']['settings']['pattern'];
  $settings = isset($variables['ds-config']['settings']['pattern_settings'][$pattern_id]) ? $variables['ds-config']['settings']['pattern_settings'][$pattern_id] : NULL;
  foreach ($variables['items'] as $delta => $item) {
    $variables['pattern']['pattern_' . $delta]['#settings'] = $settings;
  }
}

/**
 * Preprocess variables for the pattern_views_row theme hook.
 *
 * @param array $variables
 *   Theme variables.
 */
function ui_patterns_settings_preprocess_pattern_views_row(array &$variables) {
  $pattern_id = $variables['options']['pattern'];
  $settings = isset($variables['options']['pattern_settings'][$pattern_id]) ? $variables['options']['pattern_settings'][$pattern_id] : NULL;
  $variables['pattern']['#settings'] = $settings;
}

/**
 * Implements hook_element_info_alter().
 */
function ui_patterns_settings_element_info_alter(array &$info) {
  foreach ($info as &$elm) {
    if (isset($elm['#process'])) {
      array_unshift($elm['#process'], [
        PatternSettingTypeBase::class,
        "formGroupProcess",
      ]);
    }
  }
  if (isset($info['pattern'])) {
    $info['pattern']['#pre_render'][] = [
      "Drupal\\ui_patterns_settings\\Element\\PatternSettings",
      "processSettings",
    ];
  }
  if (isset($info['pattern_preview'])) {
    $info['pattern_preview']['#pre_render'][] = [
      "Drupal\\ui_patterns_settings\\Element\\PatternSettings",
      "processPreviewSettings",
    ];
  }
}

/**
 * Implements hook_theme_registry_alter().
 *
 * Add settings variables to the pattern theme.
 */
function ui_patterns_settings_theme_registry_alter(&$theme_registry) {
  foreach (UiPatterns::getManager()
    ->getPatterns() as $pattern) {
    $definition = $pattern
      ->getPluginDefinition();
    if (isset($theme_registry['pattern_' . $definition
      ->id()])) {
      $settings = UiPatternsSettings::getPatternDefinitionSettings($definition);
      foreach ($settings as $key => $setting) {
        $theme_registry['pattern_' . $definition
          ->id()]['variables'][$key] = NULL;
      }
    }
  }
}

/**
 * Implements hook_field_group_build_pre_render_alter().
 */
function ui_patterns_settings_field_group_pre_render_alter(&$element, $group, $rendering_object) {
  $pattern_id = isset($group->format_settings['pattern']) ? $group->format_settings['pattern'] : NULL;
  $element['#settings'] = isset($group->format_settings['pattern_settings'][$pattern_id]) ? $group->format_settings['pattern_settings'][$pattern_id] : NULL;
}

/**
 * Returns true if current route is a layout builder route.
 *
 * @return bool
 *   True if is layout builder route
 */
function ui_patterns_settings_is_layout_builder_route() {
  $route_name = \Drupal::routeMatch()
    ->getRouteName();
  if (preg_match('/^(layout_builder\\.([^.]+\\.)?)/', $route_name)) {
    return TRUE;
  }
  else {
    return FALSE;
  }
}

/**
 * Implements hook_layout_alter().
 */
function ui_patterns_settings_layout_alter(&$definitions) {

  /** @var \Drupal\Core\Layout\LayoutDefinition $definition */
  foreach ($definitions as $definition) {
    if ($definition
      ->getClass() == '\\Drupal\\ui_patterns_layouts\\Plugin\\Layout\\PatternLayout') {
      $definition
        ->setClass(PatternSettingsLayout::class);
    }
  }
}