features-8.x-3.11/src/FeaturesGenerationMethodBase.php
src/FeaturesGenerationMethodBase.php
<?php
namespace Drupal\features;
use Drupal\Component\Serialization\Yaml;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
/**
* Base class for package assignment methods.
*/
abstract class FeaturesGenerationMethodBase implements FeaturesGenerationMethodInterface {
use StringTranslationTrait;
/**
* The features manager.
*
* @var \Drupal\features\FeaturesManagerInterface
*/
protected $featuresManager;
/**
* The features assigner.
*
* @var \Drupal\features\FeaturesAssignerInterface
*/
protected $assigner;
/**
* {@inheritdoc}
*/
public function setFeaturesManager(FeaturesManagerInterface $features_manager) {
$this->featuresManager = $features_manager;
}
/**
* {@inheritdoc}
*/
public function setAssigner(FeaturesAssignerInterface $assigner) {
$this->assigner = $assigner;
}
/**
* {@inheritdoc}
*/
public function exportFormSubmit(array &$form, FormStateInterface $form_state) {
}
/**
* Merges an info file into a package's info file.
*
* @param string $package_info
* The Yaml encoded package info.
* @param string $info_file_uri
* The info file's URI.
*/
protected function mergeInfoFile($package_info, $info_file_uri) {
$package_info = Yaml::decode($package_info);
// \Drupal\Core\Extension\InfoParser::parse() makes changes we don't want
// here such as adding a core_incompatible key. Instead parse the file
// directly.
$existing_info = Yaml::decode(file_get_contents($info_file_uri));
// Remove the 'core' property if present since it has been replaced with
// 'core_version_requirement'.
if (isset($existing_info['core'])) {
unset($existing_info['core']);
}
return Yaml::encode($this->featuresManager->mergeInfoArray($existing_info, $package_info));
}
/**
* {@inheritdoc}
*/
public function prepare(array &$packages = [], ?FeaturesBundleInterface $bundle = NULL) {
// If no packages were specified, get all packages.
if (empty($packages)) {
$packages = $this->featuresManager->getPackages();
}
// If any packages exist, read in their files.
$existing_packages = $this->featuresManager->listPackageDirectories(array_keys($packages), $bundle);
foreach ($packages as &$package) {
list($full_name, $path) = $this->featuresManager->getExportInfo($package, $bundle);
if (empty($package->getDirectory())) {
$package->setDirectory($path);
}
// If this is the profile, its directory is already assigned.
if (!isset($bundle) || !$bundle->isProfilePackage($package->getMachineName())) {
$current_path = $package->getDirectory();
if (strpos($current_path, $full_name) < strlen($current_path) - strlen($full_name)) {
// Only append package name if it isn't already there.
$package->setDirectory($package->getDirectory() . '/' . $full_name);
}
}
$this->preparePackage($package, $existing_packages, $bundle);
}
// Clean up the $package pass by reference.
unset($package);
}
/**
* Performs any required changes on a package prior to generation.
*
* @param \Drupal\features\Package $package
* The package to be prepared.
* @param array $existing_packages
* An array of existing packages with machine names as keys and paths as
* values.
* @param \Drupal\features\FeaturesBundleInterface|null $bundle
* (optional) Bundle used for export. Defaults to NULL.
*/
abstract protected function preparePackage(Package $package, array $existing_packages, ?FeaturesBundleInterface $bundle = NULL);
}
