Yaffs site version 1.1
[yaffs-website] / vendor / drupal / console / src / Command / Shared / FeatureTrait.php
1 <?php
2
3 /**
4  * @file
5  * Contains Drupal\Console\Command\Shared\FeatureTrait.
6  */
7
8 namespace Drupal\Console\Command\Shared;
9
10 use Drupal\Console\Core\Style\DrupalStyle;
11 use Drupal\features\FeaturesManagerInterface;
12 use Drupal\features\ConfigurationItem;
13 use Drupal\features\Plugin\FeaturesGeneration\FeaturesGenerationWrite;
14 use Drupal\config_update\ConfigRevertInterface;
15
16 /**
17  * Class FeatureTrait
18  *
19  * @package Drupal\Console\Command
20  */
21 trait FeatureTrait
22 {
23     public function packageQuestion(DrupalStyle $io)
24     {
25         $packages = $this->getPackagesByBundle($bundle);
26
27         if (empty($packages)) {
28             throw new \Exception(
29                 $this->trans('commands.features.message.no-packages')
30             );
31         }
32
33         $package = $io->choiceNoList(
34             $this->trans('commands.features.import.questions.packages'),
35             $packages
36         );
37
38         return $package;
39     }
40
41
42     /**
43    * @param bool $bundle_name
44    *
45    * @return \Drupal\features\FeaturesAssignerInterface
46    */
47     protected function getAssigner($bundle_name)
48     {
49         /**
50          * @var \Drupal\features\FeaturesAssignerInterface $assigner
51          */
52         $assigner = \Drupal::service('features_assigner');
53         if (!empty($bundle_name)) {
54             $bundle = $assigner->applyBundle($bundle_name);
55
56             if ($bundle->getMachineName() != $bundle_name) {
57             }
58         }
59         // return configuration for default bundle
60         else {
61             $assigner->assignConfigPackages();
62         }
63         return $assigner;
64     }
65
66     /**
67      * Get a list of features.
68      *
69      * @param bundle
70      *
71      * @return array
72      */
73     protected function getFeatureList($bundle)
74     {
75         $features = [];
76         $manager =  $this->getFeatureManager();
77         $modules = $this->getPackagesByBundle($bundle);
78
79         foreach ($modules as $module_name) {
80             $feature = $manager->loadPackage($module_name, true);
81             $overrides = $manager->detectOverrides($feature);
82
83             $state = $feature->getState();
84
85             if (!empty($overrides) && ($feature->getStatus() != FeaturesManagerInterface::STATUS_NO_EXPORT)) {
86                 $state = FeaturesManagerInterface::STATE_OVERRIDDEN;
87             }
88
89             if ($feature->getStatus() != FeaturesManagerInterface::STATUS_NO_EXPORT) {
90                 $features[$feature->getMachineName()] = [
91                     'name' => $feature->getName(),
92                     'machine_name' => $feature->getMachineName(),
93                     'bundle_name' => $feature->getBundle(),
94                     'status' => $manager->statusLabel($feature->getStatus()),
95                     'state' => ($state != FeaturesManagerInterface::STATE_DEFAULT) ? $manager->stateLabel($state) : '',
96                 ];
97             }
98         }
99
100         return $features;
101     }
102
103
104     protected function importFeature(DrupalStyle $io, $packages)
105     {
106         $manager =  $this->getFeatureManager();
107
108         $modules = (is_array($packages)) ? $packages : [$packages];
109         $overridden = [] ;
110         foreach ($modules as $module_name) {
111             $package = $manager->loadPackage($module_name, true);
112
113             if (empty($package)) {
114                 $io->warning(
115                     sprintf(
116                         $this->trans('commands.features.import.messages.not-available'),
117                         $module_name
118                     )
119                 );
120                 continue;
121             }
122
123             if ($package->getStatus() != FeaturesManagerInterface::STATUS_INSTALLED) {
124                 $io->warning(
125                     sprintf(
126                         $this->trans('commands.features.import.messages.uninstall'),
127                         $module_name
128                     )
129                 );
130                 continue;
131             }
132
133             $overrides = $manager->detectOverrides($package);
134             $missing = $manager->reorderMissing($manager->detectMissing($package));
135
136             if (!empty($overrides) || !empty($missing) && ($package->getStatus() == FeaturesManagerInterface::STATUS_INSTALLED)) {
137                 $overridden[] = array_merge($missing, $overrides);
138             }
139         }
140
141         // Process only missing or overridden features
142         $components = $overridden;
143
144         if (empty($components)) {
145             $io->warning(
146                 sprintf(
147                     $this->trans('commands.features.import.messages.nothing')
148                 )
149             );
150
151             return ;
152         } else {
153             $this->import($io, $components);
154         }
155     }
156
157     public function import($io, $components)
158     {
159         $manager =  $this->getFeatureManager();
160         /**
161          * @var \Drupal\config_update\ConfigRevertInterface $config_revert
162          */
163         $config_revert = \Drupal::service('features.config_update');
164
165         $config = $manager->getConfigCollection();
166
167         foreach ($components as $component) {
168             foreach ($component as $feature) {
169                 if (!isset($config[$feature])) {
170                     //Import missing component.
171                     $item = $manager->getConfigType($feature);
172                     $type = ConfigurationItem::fromConfigStringToConfigType($item['type']);
173                     $config_revert->import($type, $item['name_short']);
174                     $io->info(
175                         sprintf(
176                             $this->trans('commands.features.import.messages.importing'),
177                             $feature
178                         )
179                     );
180                 } else {
181                     // Revert existing component.
182                     $item = $config[$feature];
183                     $type = ConfigurationItem::fromConfigStringToConfigType($item->getType());
184                     $config_revert->revert($type, $item->getShortName());
185                     $io->info(
186                         sprintf(
187                             $this->trans('commands.features.import.messages.reverting'),
188                             $feature
189                         )
190                     );
191                 }
192             }
193         }
194     }
195
196
197     public function getPackagesByBundle($bundle)
198     {
199         $manager =  $this->getFeatureManager();
200         $assigner = $this->getAssigner($bundle);
201         $current_bundle = $assigner->getBundle();
202
203         // List all packages availables
204         if ($current_bundle->getMachineName() == 'default') {
205             $current_bundle = null;
206         }
207
208         $packages = array_keys($manager->getFeaturesModules($current_bundle));
209
210         return $packages;
211     }
212
213     public function getFeatureManager()
214     {
215         return  \Drupal::service('features.manager');
216     }
217 }