FeaturesUIController.php in Features 8.3
File
modules/features_ui/src/Controller/FeaturesUIController.php
View source
<?php
namespace Drupal\features_ui\Controller;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Drupal\features\FeaturesManagerInterface;
use Drupal\features\FeaturesAssignerInterface;
class FeaturesUIController implements ContainerInjectionInterface {
protected $featuresManager;
protected $assigner;
public function __construct(FeaturesManagerInterface $features_manager, FeaturesAssignerInterface $assigner) {
$this->featuresManager = $features_manager;
$this->assigner = $assigner;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('features.manager'), $container
->get('features_assigner'));
}
public function detect($name) {
$detected = [];
$this->assigner
->assignConfigPackages();
$config_collection = $this->featuresManager
->getConfigCollection();
$items = $_POST['items'];
if (!empty($items)) {
$excluded = !empty($_POST['excluded']) ? $_POST['excluded'] : [];
$selected = [];
foreach ($items as $key) {
preg_match('/^([^\\[]+)(\\[.+\\])?\\[(.+)\\]\\[(.+)\\]$/', $key, $matches);
if (!empty($matches[1]) && !empty($matches[4])) {
$component = $matches[1];
$item = $this
->domDecode($matches[4]);
if (!isset($excluded[$component][$item])) {
$selected[] = $this->featuresManager
->getFullName($component, $item);
}
}
}
$detected = !empty($selected) ? $this
->getConfigDependents($selected, $name) : [];
$detected = array_merge($detected, $selected);
}
$result = [];
foreach ($detected as $config_name) {
$item = $config_collection[$config_name];
$result[$item
->getType()][$item
->getShortName()] = $item
->getName();
}
return new JsonResponse($result);
}
protected function getConfigDependents(array $item_names, $package_name) {
$result = [];
$config_collection = $this->featuresManager
->getConfigCollection();
$packages = $this->featuresManager
->getPackages();
$settings = $this->featuresManager
->getSettings();
$allow_conflicts = $settings
->get('conflicts');
if (empty($item_names)) {
$item_names = array_keys($config_collection);
}
$this->package = $packages[$package_name];
$package_config = isset($this->package) ? $this->package
->getConfig() : [];
$package_config = !empty($package_config) ? array_unique(array_merge($package_config, $item_names)) : $item_names;
foreach ($package_config as $config_name) {
if (!$config_collection[$config_name]
->getPackageExcluded()) {
$result[] = $config_name;
}
}
foreach ($item_names as $item_name) {
if ($config_collection[$item_name]
->getPackage()) {
foreach ($config_collection[$item_name]
->getDependents() as $dependent_item_name) {
if (isset($config_collection[$dependent_item_name])) {
$allow = TRUE;
if (!$allow_conflicts && $config_collection[$dependent_item_name]
->getPackage()) {
if ($packages[$config_collection[$dependent_item_name]
->getPackage()]) {
$allow = $packages[$config_collection[$dependent_item_name]
->getPackage()]
->getStatus() == FeaturesManagerInterface::STATUS_NO_EXPORT || $config_collection[$item_name]
->getPackage() == $config_collection[$dependent_item_name]
->getPackage();
}
}
if ($allow) {
$result[] = $dependent_item_name;
}
}
}
}
}
return $result;
}
protected function domEncode($key) {
$replacements = $this
->domEncodeMap();
return strtr($key, $replacements);
}
protected function domDecode($key) {
$replacements = array_flip($this
->domEncodeMap());
return strtr($key, $replacements);
}
protected function domEncodeMap() {
return [
':' => '__' . ord(':') . '__',
'/' => '__' . ord('/') . '__',
',' => '__' . ord(',') . '__',
'.' => '__' . ord('.') . '__',
'<' => '__' . ord('<') . '__',
'>' => '__' . ord('>') . '__',
'%' => '__' . ord('%') . '__',
')' => '__' . ord(')') . '__',
'(' => '__' . ord('(') . '__',
];
}
}