vlsuite-1.0.x-dev/modules/vlsuite_utility_classes/vlsuite_utility_classes.install

modules/vlsuite_utility_classes/vlsuite_utility_classes.install
<?php

/**
 * @file
 * VLSuite Utility Classes - install module file.
 */

use Drupal\Component\Utility\Html;
use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
use Drupal\layout_builder\SectionComponent;
use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
use Drupal\field\Entity\FieldConfig;
use Drupal\layout_builder\SectionStorageInterface;
use Drupal\layout_builder\Section;

/**
 * Dynamize the utilities that apply to the background image/video.
 */
function vlsuite_utility_classes_update_10004() {
  $displays = LayoutBuilderEntityViewDisplay::loadMultiple();
  $need_save = FALSE;
  $overridable_displays = [];
  foreach ($displays as $display_id => $display) {
    /** @var \Drupal\layout_builder\Entity\LayoutEntityDisplayInterface $display */
    if ($display->isLayoutBuilderEnabled()) {
      if ($display->isOverridable()) {
        $overridable_displays[$display_id] = $display;
      }
      $sections = $display->getSections();
      _vlsuite_utility_classes_update_helper_media_bg($sections, $need_save);
      if ($need_save) {
        $display->setThirdPartySetting('layout_builder', 'sections', $sections);
        $display->save();
        _vlsuite_utility_classes_update_helper_clean_section_storage('defaults', $display_id);
      }
    }
  }
  foreach ($overridable_displays as $display_id => $display) {
    [$entity_type_id, $bundle, $view_mode] = explode('.', $display_id);
    $content_entity_storage = \Drupal::entityTypeManager()->getStorage($entity_type_id);
    $ids = $content_entity_storage->getQuery()->accessCheck(FALSE)->condition(Drupal::entityTypeManager()->getDefinition($entity_type_id)->getKey('bundle'), $bundle)->execute();
    foreach ($ids as $content_entity_id) {
      $content_entity = $content_entity_storage->load($content_entity_id);
      $field_is_translatable = FieldConfig::loadByName($entity_type_id, $bundle, OverridesSectionStorage::FIELD_NAME)->isTranslatable();
      if ($content_entity->isTranslatable() && $field_is_translatable) {
        foreach ($content_entity->getTranslationLanguages() as $translation_language) {
          if ($content_entity->hasTranslation($translation_language->getId())) {
            $content_translation = $content_entity->getTranslation($translation_language->getId());
            $sections = !$content_translation->get(OverridesSectionStorage::FIELD_NAME)->isEmpty() ? $content_translation->get(OverridesSectionStorage::FIELD_NAME)->getValue() : [];
            if (!empty($sections)) {
              _vlsuite_utility_classes_update_helper_media_bg($sections, $need_save);
              if ($need_save) {
                $content_translation->set(OverridesSectionStorage::FIELD_NAME, $sections);
                $content_translation->save();
                _vlsuite_utility_classes_update_helper_clean_section_storage('overrides', "{$entity_type_id}.{$content_translation->id()}.{$view_mode}.{$translation_language->getId()}");
              }
            }
          }
        }
      }
      else {
        $sections = !$content_entity->get(OverridesSectionStorage::FIELD_NAME)->isEmpty() ? $content_entity->get(OverridesSectionStorage::FIELD_NAME)->getValue() : [];
        if (!empty($sections)) {
          _vlsuite_utility_classes_update_helper_media_bg($sections, $need_save);
          if ($need_save) {
            $content_entity->set(OverridesSectionStorage::FIELD_NAME, $sections);
            $content_entity->save();
            _vlsuite_utility_classes_update_helper_clean_section_storage('overrides', "{$entity_type_id}.{$content_entity->id()}.{$view_mode}.{$content_entity->language()->getId()}");
          }
        }
      }
    }
  }
  if (\Drupal::service('module_handler')->moduleExists('section_library')) {
    $section_library_storage = \Drupal::entityTypeManager()->getStorage('section_library_template');
    $ids = $section_library_storage->getQuery()->accessCheck(FALSE)->execute();
    foreach ($ids as $section_library_id) {
      $section_library = $section_library_storage->load($section_library_id);
      $sections = $section_library->get('layout_section')->getValue();
      _vlsuite_utility_classes_update_helper_media_bg($sections, $need_save);
      if ($need_save) {
        $section_library->save();
      }
    }
  }
}

/**
 * Update helper media-bg-xxx configurations structure.
 *
 * @param array $sections
 *   Sections.
 * @param bool $need_save
 *   Need save.
 */
function _vlsuite_utility_classes_update_helper_media_bg(array $sections, bool &$need_save) {
  $need_save = FALSE;
  foreach ($sections as $key => $section_item) {
    $section = is_array($section_item) && !empty($section_item['section']) && $section_item['section'] instanceof Section ? $section_item['section'] : $section_item;
    if (!($section instanceof Section)) {
      continue;
    }
    $layout_settings = $section->getLayoutSettings();
    $section_utilities = $layout_settings['vlsuite_utility_class'] ?? [];
    if (empty($section_utilities)) {
      continue;
    }
    if (!empty($section_utilities['vlsuite_layout:section']['media-bg-opacity'])) {
      $section_utilities['vlsuite_layout:media_bg']['media-bg-opacity'] = $section_utilities['vlsuite_layout:section']['media-bg-opacity'];
      unset($section_utilities['vlsuite_layout:section']['media-bg-opacity']);
      if (empty($section_utilities['vlsuite_layout:section'])) {
        unset($section_utilities['vlsuite_layout:section']);
      }
      $need_save = TRUE;
    }
    if (!empty($section_utilities['vlsuite_layout:section']['media-bg-variant'])) {
      $section_utilities['vlsuite_layout:media_bg']['media-bg-variant'] = $section_utilities['vlsuite_layout:section']['media-bg-variant'];
      unset($section_utilities['vlsuite_layout:section']['media-bg-variant']);
      if (empty($section_utilities['vlsuite_layout:section'])) {
        unset($section_utilities['vlsuite_layout:section']);
      }
      $need_save = TRUE;
    }
    $layout_settings['vlsuite_utility_class'] = $section_utilities;
    if (is_array($section_item) && !empty($section_item['section']) && $section_item['section'] instanceof Section) {
      $sections[$key]['section']->setLayoutSettings($layout_settings);
    }
    else {
      $sections[$key]->setLayoutSettings($layout_settings);
    }
  }
}

/**
 * Dynamize the utilities that apply to the background image/video.
 */
function vlsuite_utility_classes_update_10003() {
  $main_utility_classes_settings = \Drupal::configFactory()->getEditable('vlsuite_utility_classes.settings');
  $utilities = $main_utility_classes_settings->get('utilities') ?? [];

  if (!empty($utilities['media-bg-opacity']['apply_to']['vlsuite_layout:section'])) {
    $utilities['media-bg-opacity']['apply_to']['vlsuite_layout:media_bg'] = 'vlsuite_layout:media_bg';
    unset($utilities['media-bg-opacity']['apply_to']['vlsuite_layout:section']);
  }
  if (!empty($utilities['media-bg-variant']['apply_to']['vlsuite_layout:section'])) {
    $utilities['media-bg-variant']['apply_to']['vlsuite_layout:media_bg'] = 'vlsuite_layout:media_bg';
    unset($utilities['media-bg-variant']['apply_to']['vlsuite_layout:section']);
  }

  $main_utility_classes_settings->set('utilities', $utilities);
  $main_utility_classes_settings->save();
}

/**
 * Replace utility values config & content with identifiers.
 */
function vlsuite_utility_classes_update_10002() {
  $utilities = \Drupal::configFactory()->get('vlsuite_utility_classes.settings')->get('utilities') ?? [];
  $remap = [];
  foreach ($utilities as $utility_identifier => $utility) {
    foreach ($utility['values'] as $utility_value_identifier => $utility_value) {
      $remap[$utility_identifier][$utility_value_identifier] = $utility_value['class_suffix'];
    }
  }
  $displays = LayoutBuilderEntityViewDisplay::loadMultiple();
  $overridable_displays = [];
  foreach ($displays as $display_id => $display) {
    /** @var \Drupal\layout_builder\Entity\LayoutEntityDisplayInterface $display */
    if ($display->isLayoutBuilderEnabled()) {
      if ($display->isOverridable()) {
        $overridable_displays[$display_id] = $display;
      }
      $sections = $display->getSections();
      _vlsuite_utility_classes_update_helper_sections_suffix_to_identifier($sections, $remap);
      $display->setThirdPartySetting('layout_builder', 'sections', $sections);
      $display->save();
      _vlsuite_utility_classes_update_helper_clean_section_storage('defaults', $display_id);
    }
  }
  foreach ($overridable_displays as $display_id => $display) {
    [$entity_type_id, $bundle, $view_mode] = explode('.', $display_id);
    $content_entity_storage = \Drupal::entityTypeManager()->getStorage($entity_type_id);
    $ids = $content_entity_storage->getQuery()->accessCheck(FALSE)->condition(Drupal::entityTypeManager()->getDefinition($entity_type_id)->getKey('bundle'), $bundle)->execute();
    foreach ($ids as $content_entity_id) {
      $content_entity = $content_entity_storage->load($content_entity_id);
      $field_is_translatable = FieldConfig::loadByName($entity_type_id, $bundle, OverridesSectionStorage::FIELD_NAME)->isTranslatable();
      if ($content_entity->isTranslatable() && $field_is_translatable) {
        foreach ($content_entity->getTranslationLanguages() as $translation_language) {
          if ($content_entity->hasTranslation($translation_language->getId())) {
            $content_translation = $content_entity->getTranslation($translation_language->getId());
            $sections = !$content_translation->get(OverridesSectionStorage::FIELD_NAME)->isEmpty() ? $content_translation->get(OverridesSectionStorage::FIELD_NAME)->getValue() : [];
            if (!empty($sections)) {
              _vlsuite_utility_classes_update_helper_sections_suffix_to_identifier($sections, $remap);
              $content_translation->set(OverridesSectionStorage::FIELD_NAME, $sections);
              $content_translation->save();
              _vlsuite_utility_classes_update_helper_clean_section_storage('overrides', "{$entity_type_id}.{$content_translation->id()}.{$view_mode}.{$translation_language->getId()}");
            }
          }
        }
      }
      else {
        $sections = !$content_entity->get(OverridesSectionStorage::FIELD_NAME)->isEmpty() ? $content_entity->get(OverridesSectionStorage::FIELD_NAME)->getValue() : [];
        if (!empty($sections)) {
          _vlsuite_utility_classes_update_helper_sections_suffix_to_identifier($sections, $remap);
          $content_entity->set(OverridesSectionStorage::FIELD_NAME, $sections);
          $content_entity->save();
          _vlsuite_utility_classes_update_helper_clean_section_storage('overrides', "{$entity_type_id}.{$content_entity->id()}.{$view_mode}.{$content_entity->language()->getId()}");
        }
      }
    }
  }
  if (\Drupal::service('module_handler')->moduleExists('section_library')) {
    $section_library_storage = \Drupal::entityTypeManager()->getStorage('section_library_template');
    $ids = $section_library_storage->getQuery()->accessCheck(FALSE)->execute();
    foreach ($ids as $section_library_id) {
      $section_library = $section_library_storage->load($section_library_id);
      $sections = $section_library->get('layout_section')->getValue();
      _vlsuite_utility_classes_update_helper_sections_suffix_to_identifier($sections, $remap);
      $section_library->save();
    }
  }
}

/**
 * Update helper section storage type.
 *
 * @param string $section_storage_type
 *   Section storage type.
 * @param string $key_value_key
 *   Key value key.
 */
function _vlsuite_utility_classes_update_helper_clean_section_storage(string $section_storage_type, string $key_value_key) {
  /** @var \Drupal\Core\KeyValueStore\KeyValueExpirableFactoryInterface $key_value_factory */
  $key_value_factory = \Drupal::service('keyvalue.expirable');
  /** @var \Drupal\layout_builder\SectionStorage\SectionStorageManagerInterface $section_storage_manager */
  // @code $section_storage_manager = \Drupal::service('plugin.manager.layout_builder.section_storage'); @endcode
  $key_value = $key_value_factory->get("tempstore.shared.layout_builder.section_storage.{$section_storage_type}");
  if ($key_value->has($key_value_key)) {
    $section_storage = $key_value->get($key_value_key)->data['section_storage'] ?? NULL;
    if ($section_storage instanceof SectionStorageInterface) {
      \Drupal::service('layout_builder.tempstore_repository')->delete($section_storage);
    }
  }
}

/**
 * Update helper sections & components suffix to identifier.
 *
 * @param array $sections
 *   Sections.
 * @param array $remap
 *   Remap.
 */
function _vlsuite_utility_classes_update_helper_sections_suffix_to_identifier(array $sections, array $remap) {
  foreach ($sections as $key => $section_item) {
    $section = is_array($section_item) && !empty($section_item['section']) && $section_item['section'] instanceof Section ? $section_item['section'] : $section_item;
    if (!($section instanceof Section)) {
      continue;
    }
    $layout_settings = $section->getLayoutSettings();
    $section_utilities = $layout_settings['vlsuite_utility_class'] ?? [];
    if (empty($section_utilities)) {
      continue;
    }
    foreach ($section_utilities as $apply_to => $apply_to_utilities) {
      foreach ($apply_to_utilities as $utility_id => $class_suffix) {
        $new_value = array_search($class_suffix, $remap[$utility_id]);
        if (empty($new_value)) {
          continue;
        }
        $section_utilities[$apply_to][$utility_id] = $new_value;
        foreach ($section->getComponents() as $component) {
          if (!($component instanceof SectionComponent)) {
            continue;
          }
          $component_config = $component->get('configuration');
          $utility_component_config = $component_config['vlsuite_utility_class'] ?? [];
          if (empty($utility_component_config)) {
            continue;
          }
          foreach ($utility_component_config as $component_utility_apply_to => $component_utilities) {
            foreach ($component_utilities as $component_utility_id => $component_class_suffix) {
              $new_component_value = !empty($component_class_suffix) ? array_search($component_class_suffix, $remap[$component_utility_id]) : NULL;
              if (empty($new_component_value)) {
                continue;
              }
              $utility_component_config[$component_utility_apply_to][$component_utility_id] = $new_component_value;
            }
          }
          $component_config['vlsuite_utility_class'] = $utility_component_config;
          $component->setConfiguration($component_config);
        }
      }
    }
    $layout_settings['vlsuite_utility_class'] = $section_utilities;
    if (is_array($section_item) && !empty($section_item['section']) && $section_item['section'] instanceof Section) {
      $sections[$key]['section']->setLayoutSettings($layout_settings);
    }
    else {
      $sections[$key]->setLayoutSettings($layout_settings);
    }
  }
}

/**
 * Replace utility values configurations with identifiers.
 */
function vlsuite_utility_classes_update_10001() {
  $language_manager = \Drupal::languageManager();
  $main_utility_classes_settings = \Drupal::configFactory()->getEditable('vlsuite_utility_classes.settings');
  $default_language = $main_utility_classes_settings->get('langcode') ?? $language_manager->getDefaultLanguage()->getId();
  $utilities = $main_utility_classes_settings->get('utilities') ?? [];
  $remap = [];

  // Adapt configuration utility values to the new schema with identifiers.
  foreach ($utilities as $utility_identifier => $utility_def) {
    $values = [];
    foreach ($utility_def['values'] as $suffix => $visual_name) {
      $value_identifier = Html::getId(\Drupal::service('transliteration')->transliterate($visual_name));
      $values[$value_identifier] = [
        'visual_name' => $visual_name,
        'class_suffix' => $suffix,
      ];
      $remap[$utility_identifier][$suffix] = $value_identifier;
    }
    $utilities[$utility_identifier]['values'] = $values;
  }
  $main_utility_classes_settings->set('utilities', $utilities);

  // Configuration translations.
  $languages = array_keys($language_manager->getLanguages());
  foreach ($languages as $language) {
    if ($language != $default_language) {
      $translation_config = $language_manager->getLanguageConfigOverride($language, 'vlsuite_utility_classes.settings');
      $utilities = $translation_config->get('utilities') ?? [];
      foreach ($utilities as $utility_identifier => $utility_def) {
        $values = [];
        if (empty($utility_def['values'])) {
          continue;
        }
        foreach ($utility_def['values'] as $suffix => $visual_name) {
          $values[$remap[$utility_identifier][$suffix]] = [
            'visual_name' => $visual_name,
          ];
        }
        $utilities[$utility_identifier]['values'] = $values;
      }
      $translation_config->set('utilities', $utilities)->save(TRUE);
    }
  }
  $main_utility_classes_settings->save(TRUE);
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc