FeaturesAssignmentForwardDependency.php in Features 8.4
File
src/Plugin/FeaturesAssignment/FeaturesAssignmentForwardDependency.php
View source
<?php
namespace Drupal\features\Plugin\FeaturesAssignment;
use Drupal\Component\Graph\Graph;
use Drupal\features\FeaturesAssignmentMethodBase;
class FeaturesAssignmentForwardDependency extends FeaturesAssignmentMethodBase {
public function assignPackages($force = FALSE) {
$config_collection = $this->featuresManager
->getConfigCollection();
$ordered = $this
->dependencyOrder($config_collection);
foreach ($ordered as $name) {
$item = $config_collection[$name];
if ($item
->getPackage()) {
continue;
}
$dependent_packages = [];
foreach ($item
->getDependents() as $dependent) {
if (isset($config_collection[$dependent])) {
if ($package = $config_collection[$dependent]
->getPackage()) {
$dependent_packages[$package] = $package;
}
}
}
if (count($dependent_packages) == 1) {
$package = key($dependent_packages);
$this->featuresManager
->assignConfigPackage($package, [
$name,
]);
}
}
}
protected function dependencyOrder(array $config_collection) {
$graph = [];
foreach ($config_collection as $config) {
$graph[$config
->getName()] = [];
foreach ($config
->getDependents() as $dependent) {
$graph[$config
->getName()]['edges'][$dependent] = 1;
}
}
$graph_object = new Graph($graph);
$graph = $graph_object
->searchAndSort();
$weights = array_column($graph, 'weight');
array_multisort($weights, SORT_DESC, $graph);
return array_keys($graph);
}
}