f838827f62ef89b2adaad92243e3d08c81183ef6
[yaffs-website] / vendor / drupal / console / src / Command / Generate / FormAlterCommand.php
1 <?php
2
3 /**
4  * @file
5  * Contains \Drupal\Console\Command\Generate\FormAlterCommand.
6  */
7
8 namespace Drupal\Console\Command\Generate;
9
10 use Symfony\Component\Console\Input\InputInterface;
11 use Symfony\Component\Console\Input\InputOption;
12 use Symfony\Component\Console\Output\OutputInterface;
13 use Drupal\Console\Generator\FormAlterGenerator;
14 use Drupal\Console\Command\Shared\ServicesTrait;
15 use Drupal\Console\Command\Shared\ModuleTrait;
16 use Drupal\Console\Command\Shared\MenuTrait;
17 use Drupal\Console\Command\Shared\FormTrait;
18 use Drupal\Console\Command\Shared\ConfirmationTrait;
19 use Symfony\Component\Console\Command\Command;
20 use Drupal\Console\Core\Style\DrupalStyle;
21 use Drupal\Console\Core\Command\Shared\CommandTrait;
22 use Drupal\Console\Core\Utils\StringConverter;
23 use Drupal\Console\Extension\Manager;
24 use Drupal\Core\Extension\ModuleHandlerInterface;
25 use Drupal\Core\Render\ElementInfoManager;
26 use Drupal\Console\Utils\Validator;
27 use Drupal\Core\Routing\RouteProviderInterface;
28 use Drupal\Console\Core\Utils\ChainQueue;
29 use Drupal\webprofiler\Profiler\Profiler;
30
31 class FormAlterCommand extends Command
32 {
33     use ServicesTrait;
34     use ModuleTrait;
35     use FormTrait;
36     use MenuTrait;
37     use ConfirmationTrait;
38     use CommandTrait;
39
40     /**
41  * @var Manager
42 */
43     protected $extensionManager;
44
45     /**
46  * @var FormAlterGenerator
47 */
48     protected $generator;
49
50     /**
51      * @var StringConverter
52      */
53     protected $stringConverter;
54
55     /**
56      * @var ModuleHandlerInterface
57      */
58     protected $moduleHandler;
59
60     /**
61      * @var ElementInfoManager
62      */
63     protected $elementInfoManager;
64
65     /**
66  * @var Validator
67 */
68     protected $validator;
69
70     /**
71  * @var RouteProviderInterface
72 */
73     protected $routeProvider;
74
75     /**
76      * @var Profiler
77      */
78     protected $profiler;
79
80     /**
81      * @var string
82      */
83     protected $appRoot;
84
85     /**
86      * @var ChainQueue
87      */
88     protected $chainQueue;
89
90
91     /**
92      * FormAlterCommand constructor.
93      *
94      * @param Manager                $extensionManager
95      * @param FormAlterGenerator     $generator
96      * @param StringConverter        $stringConverter
97      * @param ModuleHandlerInterface $moduleHandler
98      * @param ElementInfoManager     $elementInfoManager
99      * @param Profiler               $profiler
100      * @param $appRoot
101      * @param ChainQueue             $chainQueue
102      */
103     public function __construct(
104         Manager $extensionManager,
105         FormAlterGenerator $generator,
106         StringConverter $stringConverter,
107         ModuleHandlerInterface $moduleHandler,
108         ElementInfoManager $elementInfoManager,
109         Profiler $profiler = null,
110         $appRoot,
111         ChainQueue $chainQueue
112     ) {
113         $this->extensionManager = $extensionManager;
114         $this->generator = $generator;
115         $this->stringConverter = $stringConverter;
116         $this->moduleHandler = $moduleHandler;
117         $this->elementInfoManager = $elementInfoManager;
118         $this->profiler = $profiler;
119         $this->appRoot = $appRoot;
120         $this->chainQueue = $chainQueue;
121         parent::__construct();
122     }
123
124     protected $metadata = [
125       'class' => [],
126       'method'=> [],
127       'file'=> [],
128       'unset' => []
129     ];
130
131     protected function configure()
132     {
133         $this
134             ->setName('generate:form:alter')
135             ->setDescription(
136                 $this->trans('commands.generate.form.alter.description')
137             )
138             ->setHelp($this->trans('commands.generate.form.alter.help'))
139             ->addOption(
140                 'module',
141                 '',
142                 InputOption::VALUE_REQUIRED,
143                 $this->trans('commands.common.options.module')
144             )
145             ->addOption(
146                 'form-id',
147                 '',
148                 InputOption::VALUE_OPTIONAL,
149                 $this->trans('commands.generate.form.alter.options.form-id')
150             )
151             ->addOption(
152                 'inputs',
153                 '',
154                 InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY,
155                 $this->trans('commands.common.options.inputs')
156             );
157     }
158
159     /**
160      * {@inheritdoc}
161      */
162     protected function execute(InputInterface $input, OutputInterface $output)
163     {
164         $io = new DrupalStyle($input, $output);
165
166         // @see use Drupal\Console\Command\Shared\ConfirmationTrait::confirmGeneration
167         if (!$this->confirmGeneration($io)) {
168             return;
169         }
170
171         $module = $input->getOption('module');
172         $formId = $input->getOption('form-id');
173         $inputs = $input->getOption('inputs');
174
175         $function = $module . '_form_' .$formId . '_alter';
176
177         if ($this->extensionManager->validateModuleFunctionExist($module, $function)) {
178             throw new \Exception(
179                 sprintf(
180                     $this->trans('commands.generate.form.alter.messages.help-already-implemented'),
181                     $module
182                 )
183             );
184         }
185
186         //validate if input is an array
187         if (!is_array($inputs[0])) {
188             $inputs= $this->explodeInlineArray($inputs);
189         }
190
191         $this
192             ->generator
193             ->generate($module, $formId, $inputs, $this->metadata);
194
195         $this->chainQueue->addCommand('cache:rebuild', ['cache' => 'discovery']);
196     }
197
198     protected function interact(InputInterface $input, OutputInterface $output)
199     {
200         $io = new DrupalStyle($input, $output);
201
202         // --module option
203         $module = $input->getOption('module');
204         if (!$module) {
205             // @see Drupal\Console\Command\Shared\ModuleTrait::moduleQuestion
206             $module = $this->moduleQuestion($io);
207         }
208
209         $input->setOption('module', $module);
210
211         // --form-id option
212         $formId = $input->getOption('form-id');
213         if (!$formId) {
214             $forms = [];
215             // Get form ids from webprofiler
216             if ($this->moduleHandler->moduleExists('webprofiler')) {
217                 $io->info(
218                     $this->trans('commands.generate.form.alter.messages.loading-forms')
219                 );
220                 $forms = $this->getWebprofilerForms();
221             }
222
223             if (!empty($forms)) {
224                 $formId = $io->choiceNoList(
225                     $this->trans('commands.generate.form.alter.options.form-id'),
226                     array_keys($forms)
227                 );
228             }
229         }
230
231         if ($this->moduleHandler->moduleExists('webprofiler') && isset($forms[$formId])) {
232             $this->metadata['class'] = $forms[$formId]['class']['class'];
233             $this->metadata['method'] = $forms[$formId]['class']['method'];
234             $this->metadata['file'] = str_replace(
235                 $this->appRoot,
236                 '',
237                 $forms[$formId]['class']['file']
238             );
239
240             foreach ($forms[$formId]['form'] as $itemKey => $item) {
241                 if ($item['#type'] == 'hidden') {
242                     unset($forms[$formId]['form'][$itemKey]);
243                 }
244             }
245
246             unset($forms[$formId]['form']['form_build_id']);
247             unset($forms[$formId]['form']['form_token']);
248             unset($forms[$formId]['form']['form_id']);
249             unset($forms[$formId]['form']['actions']);
250
251             $formItems = array_keys($forms[$formId]['form']);
252
253             $formItemsToHide = $io->choice(
254                 $this->trans('commands.generate.form.alter.messages.hide-form-elements'),
255                 $formItems,
256                 null,
257                 true
258             );
259
260             $this->metadata['unset'] = array_filter(array_map('trim', $formItemsToHide));
261         }
262
263         $input->setOption('form-id', $formId);
264
265         // @see Drupal\Console\Command\Shared\FormTrait::formQuestion
266         $inputs = $input->getOption('inputs');
267
268         if (empty($inputs)) {
269             $io->writeln($this->trans('commands.generate.form.alter.messages.inputs'));
270             $inputs = $this->formQuestion($io);
271         } else {
272             $inputs= $this->explodeInlineArray($inputs);
273         }
274
275         $input->setOption('inputs', $inputs);
276     }
277
278     /**
279      * @{@inheritdoc}
280      */
281     public function explodeInlineArray($inlineInputs)
282     {
283         $inputs = [];
284         foreach ($inlineInputs as $inlineInput) {
285             $explodeInput = explode(" ", $inlineInput);
286             $parameters = [];
287             foreach ($explodeInput as $inlineParameter) {
288                 list($key, $value) = explode(":", $inlineParameter);
289                 if (!empty($value)) {
290                     $parameters[$key] = $value;
291                 }
292             }
293             $inputs[] = $parameters;
294         }
295
296         return $inputs;
297     }
298
299     protected function createGenerator()
300     {
301         return new FormAlterGenerator();
302     }
303
304     public function getWebprofilerForms()
305     {
306         $tokens = $this->profiler->find(null, null, 1000, null, '', '');
307         $forms = [];
308         foreach ($tokens as $token) {
309             $token = [$token['token']];
310             $profile = $this->profiler->loadProfile($token);
311             $formCollector = $profile->getCollector('forms');
312             $collectedForms = $formCollector->getForms();
313             if (empty($forms)) {
314                 $forms = $collectedForms;
315             } elseif (!empty($collectedForms)) {
316                 $forms = array_merge($forms, $collectedForms);
317             }
318         }
319         return $forms;
320     }
321 }