You are here

public function FeaturesInstallStorage::getAllFolders in Features 8.3

Same name and namespace in other branches
  1. 8.4 src/FeaturesInstallStorage.php \Drupal\features\FeaturesInstallStorage::getAllFolders()

Returns a map of all config object names and their folders.

The list is based on installed modules and themes. The active configuration storage is used rather than \Drupal\Core\Extension\ModuleHandler and \Drupal\Core\Extension\ThemeHandler in order to resolve circular dependencies between these services and \Drupal\Core\Config\ConfigInstaller and \Drupal\Core\Config\TypedConfigManager.

NOTE: This code is copied from ExtensionInstallStorage::getAllFolders() with the following changes (Notes in CHANGED below)

  • Load all modules whether installed or not

Return value

array An array mapping config object names with directories.

Overrides ExtensionInstallStorage::getAllFolders

File

src/FeaturesInstallStorage.php, line 67

Class

FeaturesInstallStorage
Storage to access configuration and schema in installed extensions.

Namespace

Drupal\features

Code

public function getAllFolders() {

  // @todo: update to bring in upstream changes from the method this was
  // forked from.
  if (!isset($this->folders)) {
    $this->folders = [];
    $this->folders += $this
      ->getCoreNames();
    $install_profile = Settings::get('install_profile');
    $profile = $this->installProfile;
    $extensions = $this->configStorage
      ->read('core.extension');

    // @todo Remove this scan as part of https://www.drupal.org/node/2186491
    $listing = new ExtensionDiscovery(\Drupal::root());

    // CHANGED START: Add profile directories for any bundles that use a
    // profile.
    $listing
      ->setProfileDirectoriesFromSettings();
    $profile_directories = $listing
      ->getProfileDirectories();
    if ($this->includeProfile) {

      // Add any profiles used in bundles.

      /** @var \Drupal\features\FeaturesAssignerInterface $assigner */
      $assigner = \Drupal::service('features_assigner');
      $bundles = $assigner
        ->getBundleList();
      foreach ($bundles as $bundle_name => $bundle) {
        if ($bundle
          ->isProfile()) {

          // Register the profile directory.
          $profile_directory = 'profiles/' . $bundle
            ->getProfileName();
          if (is_dir($profile_directory)) {
            $profile_directories[] = $profile_directory;
          }
        }
      }
    }
    $listing
      ->setProfileDirectories($profile_directories);

    // CHANGED END.
    if (!empty($extensions['module'])) {

      // CHANGED START: Find ANY modules, not just installed ones.
      // $modules = $extensions['module'];.
      $module_list_scan = $listing
        ->scan('module');
      $modules = $module_list_scan;

      // CHANGED END.
      // Remove the install profile as this is handled later.
      unset($modules[$install_profile]);
      $profile_list = $listing
        ->scan('profile');
      if ($profile && isset($profile_list[$profile])) {

        // Prime the drupal_get_filename() static cache with the profile info
        // file location so we can use drupal_get_path() on the active profile
        // during the module scan.
        // @todo Remove as part of https://www.drupal.org/node/2186491
        drupal_get_filename('profile', $profile, $profile_list[$profile]
          ->getPathname());
      }

      // CHANGED START: Put Features modules first in list returned.
      // to allow features to override config provided by other extensions.
      $featuresManager = \Drupal::service('features.manager');
      $features_list = [];
      $module_list = [];
      foreach (array_keys($module_list_scan) as $module) {
        if ($featuresManager
          ->isFeatureModule($module_list_scan[$module])) {
          $features_list[$module] = $module_list_scan[$module];
        }
        else {
          $module_list[$module] = $module_list_scan[$module];
        }
      }
      $this->folders += $this
        ->getComponentNames($features_list);
      $this->folders += $this
        ->getComponentNames($module_list);

      // CHANGED END.
    }
    if (!empty($extensions['theme'])) {
      $theme_list_scan = $listing
        ->scan('theme');
      foreach (array_keys($extensions['theme']) as $theme) {
        if (isset($theme_list_scan[$theme])) {
          $theme_list[$theme] = $theme_list_scan[$theme];
        }
      }
      $this->folders += $this
        ->getComponentNames($theme_list);
    }
    if ($this->includeProfile) {

      // The install profile can override module default configuration. We do
      // this by replacing the config file path from the module/theme with the
      // install profile version if there are any duplicates.
      if (isset($profile)) {
        if (!isset($profile_list)) {
          $profile_list = $listing
            ->scan('profile');
        }
        if (isset($profile_list[$profile])) {
          $profile_folders = $this
            ->getComponentNames([
            $profile_list[$profile],
          ]);
          $this->folders = $profile_folders + $this->folders;
        }
      }
    }
  }
  return $this->folders;
}