378f4c0a6fdf932d09685747a2bc865b4a1ee450
[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 overriden features
142         $components = $overridden;
143
144         if (empty($components)) {
145             $io->warning(
146                 sprintf(
147                     $this->trans('commands.features.import.messages.nothing'),
148                     $components
149                 )
150             );
151
152             return ;
153         } else {
154             $this->import($io, $components);
155         }
156     }
157
158     public function import($io, $components)
159     {
160         $manager =  $this->getFeatureManager();
161         /**
162          * @var \Drupal\config_update\ConfigRevertInterface $config_revert
163          */
164         $config_revert = \Drupal::service('features.config_update');
165
166         $config = $manager->getConfigCollection();
167
168         foreach ($components as $component) {
169             foreach ($component as $feature) {
170                 if (!isset($config[$feature])) {
171
172                     //Import missing component.
173                     $item = $manager->getConfigType($feature);
174                     $type = ConfigurationItem::fromConfigStringToConfigType($item['type']);
175                     $config_revert->import($type, $item['name_short']);
176                     $io->info(
177                         sprintf(
178                             $this->trans('commands.features.import.messages.importing'),
179                             $feature
180                         )
181                     );
182                 } else {
183                     // Revert existing component.
184                     $item = $config[$feature];
185                     $type = ConfigurationItem::fromConfigStringToConfigType($item->getType());
186                     $config_revert->revert($type, $item->getShortName());
187                     $io->info(
188                         sprintf(
189                             $this->trans('commands.features.import.messages.reverting'),
190                             $feature
191                         )
192                     );
193                 }
194             }
195         }
196     }
197
198
199     public function getPackagesByBundle($bundle)
200     {
201         $manager =  $this->getFeatureManager();
202         $assigner = $this->getAssigner($bundle);
203         $current_bundle = $assigner->getBundle();
204
205         // List all packages availables
206         if ($current_bundle->getMachineName() == 'default') {
207             $current_bundle = null;
208         }
209
210         $packages = array_keys($manager->getFeaturesModules($current_bundle));
211
212         return $packages;
213     }
214
215     public function getFeatureManager()
216     {
217         return  \Drupal::service('features.manager');
218     }
219 }