Commit c224419e authored by Rajab Natshah's avatar Rajab Natshah
Browse files

Issue #3272296: Switch to use the Module Installer Factory in the Varbase SEO module

parent 18c25e6c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
    "cweagans/composer-patches": "~1.0",
    "drupal/core": "~9.0",
    "vardot/entity-definition-update-manager": "~1.0",
    "vardot/module-installer-factory": "~1.0",
    "drupal/google_analytics": "~3.0",
    "drupal/metatag": "^1.12",
    "drupal/schema_metatag": "~2.0",
+26 −77
Original line number Diff line number Diff line
@@ -5,106 +5,44 @@
 * Install, update and uninstall functions for the Varbase SEO module.
 */

use Symfony\Component\Yaml\Yaml;
use Drupal\Core\Config\InstallStorage;
use Drupal\Core\Config\StorageInterface;
use Drupal\Core\Config\FileStorage;
use Vardot\Entity\EntityDefinitionUpdateManager;
use Vardot\Installer\ModuleInstallerFactory;

/**
 * Implements hook_install().
 */
function varbase_seo_install() {

  $module_name = preg_replace('/_install$/', '', __FUNCTION__);
  $module_path = Drupal::service('module_handler')->getModule($module_name)->getPath();

  // Processer for install: in [$module_name].info.yml file.
  // Processer for install: in varbase_admin.info.yml file using ModuleInstallerFactory.
  // ---------------------------------------------------------------------------.
  $module_info_file = $module_path . '/' . $module_name . '.info.yml';
  if (file_exists($module_info_file)) {
    $module_info_data = (array) Yaml::parse(file_get_contents($module_info_file));
    if (isset($module_info_data['install'])
      && is_array($module_info_data['install'])) {
      \Drupal::service('module_installer')->install($module_info_data['install'], TRUE);
    }
  }
  ModuleInstallerFactory::installList('varbase_seo');

  // Install optional configs.
  $optional_install_path = $module_path . '/' . InstallStorage::CONFIG_OPTIONAL_DIRECTORY;
  if (is_dir($optional_install_path)) {
    $config_installer = \Drupal::service('config.installer');
    $config_installer->installDefaultConfig('module', $module_name);

    // Create field storage configs first in active config.
    $storage_config_files = \Drupal::service('file_system')->scanDirectory($optional_install_path, '/^field.storage.*\\.(yml)$/i');
    if (isset($storage_config_files) && is_array($storage_config_files)) {
      foreach ($storage_config_files as $storage_config_file) {
        $storage_config_file_content = file_get_contents(DRUPAL_ROOT . '/' . $storage_config_file->uri);
        $storage_config_file_data = (array) Yaml::parse($storage_config_file_content);
        $config_factory = \Drupal::configFactory()->getEditable($storage_config_file->name);
        $config_factory->setData($storage_config_file_data)->save(TRUE);
      }
    }

    // Install any optional config the module provides.
    $storage = new FileStorage($optional_install_path, StorageInterface::DEFAULT_COLLECTION);
    $config_installer->installOptionalConfig($storage, '');

    // Have the .settings.yml configs into the active config.
    $settings_config_files = \Drupal::service('file_system')->scanDirectory($optional_install_path, '/^.*\\.(settings.yml)$/i');
    if (isset($settings_config_files) && is_array($settings_config_files)) {
      foreach ($settings_config_files as $settings_config_file) {
        $settings_config_file_content = file_get_contents(DRUPAL_ROOT . '/' . $settings_config_file->uri);
        $settings_config_file_data = (array) Yaml::parse($settings_config_file_content);
        $config_factory = \Drupal::configFactory()->getEditable($settings_config_file->name);
        $config_factory->setData($settings_config_file_data)->save(TRUE);
      }
    }
  ModuleInstallerFactory::importConfigsFromScanedDirectory('varbase_seo', '/^field.storage.*\\.(yml)$/i');
  ModuleInstallerFactory::importConfigsFromScanedDirectory('varbase_seo', '/^.*(settings.yml)$/i');
  ModuleInstallerFactory::importConfigsFromScanedDirectory('varbase_seo', '/^metatag.metatag_defaults.*\\.(yml)$/i');

    // Have general metatag defaults configs in active config.
    $metatag_defaults_config_files = \Drupal::service('file_system')->scanDirectory($optional_install_path, '/^metatag.metatag_defaults.*\\.(yml)$/i');
    if (isset($metatag_defaults_config_files) && is_array($metatag_defaults_config_files)) {
      foreach ($metatag_defaults_config_files as $metatag_defaults_config_file) {
        $metatag_defaults_config_file_content = file_get_contents(DRUPAL_ROOT . '/' . $metatag_defaults_config_file->uri);
        $metatag_defaults_config_file_data = (array) Yaml::parse($metatag_defaults_config_file_content);
        $config_factory = \Drupal::configFactory()->getEditable($metatag_defaults_config_file->name);
        $config_factory->setData($metatag_defaults_config_file_data)->save(TRUE);
      }
    }
  }
  // ---------------------------------------------------------------------------
  // If the google analytics module were enabled we load the custom GA settings.
  if (\Drupal::moduleHandler()->moduleExists('google_analytics')) {

    $google_analytics_managed_optional_path = Drupal::service('module_handler')->getModule('varbase_seo')->getPath() . '/config/managed/google_analytics';

    // Varbase SEO custom google analytics config settings.
    $google_analytics_managed_optional_configs = [
      'google_analytics.settings',
    ];

    foreach ($google_analytics_managed_optional_configs as $config_name) {
      $config_path = $google_analytics_managed_optional_path . '/' . $config_name . '.yml';
      $config_content = file_get_contents($config_path);
      $config_data = (array) Yaml::parse($config_content);
      $config_factory = \Drupal::configFactory()->getEditable($config_name);
      $config_factory->setData($config_data)->save(TRUE);
    }
    ModuleInstallerFactory::importConfigsFromList('varbase_seo', $google_analytics_managed_optional_configs, 'config/managed/google_analytics');
  }

  // Entity updates to clear up any mismatched entity and/or field definitions
  // And Fix changes were detected in the entity type and field definitions.
  \Drupal::classResolver()
    ->getInstanceFromDefinition(EntityDefinitionUpdateManager::class)
    ->applyUpdates();

  // Have forced configs import after the entity and definitions updates.
  $forced_configs_import_after_entity_updates = [
    'views.view.redirect_404',
  ];

  foreach ($forced_configs_import_after_entity_updates as $config_name) {
    $config_path = $optional_install_path . '/' . $config_name . '.yml';
    $config_content = file_get_contents($config_path);
    $config_data = (array) Yaml::parse($config_content);
    $config_factory = \Drupal::configFactory()->getEditable($config_name);
    $config_factory->setData($config_data)->save(TRUE);
  }
  ModuleInstallerFactory::importConfigsFromList('varbase_seo', $forced_configs_import_after_entity_update);

  // Entity updates to clear up any mismatched entity and/or field definitions
  // And Fix changes were detected in the entity type and field definitions.
@@ -148,3 +86,14 @@ function varbase_seo_update_90001() {
  }

}

/**
 * Issue #3272296: Switch to use the Module Installer Factory.
 *
 * In the Varbase SEO module.
 */
function varbase_seo_update_90002() {
  // Set the weight of the module after installation of list of modules.
  // To make sure that any hook or event subscriber workes after all used modules.
  ModuleInstallerFactory::setModuleWeightAfterInstallation('varbase_seo');
}