Yaffs site version 1.1
[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                 null,
142                 InputOption::VALUE_REQUIRED,
143                 $this->trans('commands.common.options.module')
144             )
145             ->addOption(
146                 'form-id',
147                 null,
148                 InputOption::VALUE_OPTIONAL,
149                 $this->trans('commands.generate.form.alter.options.form-id')
150             )
151             ->addOption(
152                 'inputs',
153                 null,
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 1;
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         return 0;
198     }
199
200     protected function interact(InputInterface $input, OutputInterface $output)
201     {
202         $io = new DrupalStyle($input, $output);
203
204         // --module option
205         $module = $input->getOption('module');
206         if (!$module) {
207             // @see Drupal\Console\Command\Shared\ModuleTrait::moduleQuestion
208             $module = $this->moduleQuestion($io);
209         }
210
211         $input->setOption('module', $module);
212
213         // --form-id option
214         $formId = $input->getOption('form-id');
215         if (!$formId) {
216             $forms = [];
217             // Get form ids from webprofiler
218             if ($this->moduleHandler->moduleExists('webprofiler')) {
219                 $io->info(
220                     $this->trans('commands.generate.form.alter.messages.loading-forms')
221                 );
222                 $forms = $this->getWebprofilerForms();
223             }
224
225             if (!empty($forms)) {
226                 $formId = $io->choiceNoList(
227                     $this->trans('commands.generate.form.alter.options.form-id'),
228                     array_keys($forms)
229                 );
230             }
231         }
232
233         if ($this->moduleHandler->moduleExists('webprofiler') && isset($forms[$formId])) {
234             $this->metadata['class'] = $forms[$formId]['class']['class'];
235             $this->metadata['method'] = $forms[$formId]['class']['method'];
236             $this->metadata['file'] = str_replace(
237                 $this->appRoot,
238                 '',
239                 $forms[$formId]['class']['file']
240             );
241
242             foreach ($forms[$formId]['form'] as $itemKey => $item) {
243                 if ($item['#type'] == 'hidden') {
244                     unset($forms[$formId]['form'][$itemKey]);
245                 }
246             }
247
248             unset($forms[$formId]['form']['form_build_id']);
249             unset($forms[$formId]['form']['form_token']);
250             unset($forms[$formId]['form']['form_id']);
251             unset($forms[$formId]['form']['actions']);
252
253             $formItems = array_keys($forms[$formId]['form']);
254
255             $formItemsToHide = $io->choice(
256                 $this->trans('commands.generate.form.alter.messages.hide-form-elements'),
257                 $formItems,
258                 null,
259                 true
260             );
261
262             $this->metadata['unset'] = array_filter(array_map('trim', $formItemsToHide));
263         }
264
265         $input->setOption('form-id', $formId);
266
267         // @see Drupal\Console\Command\Shared\FormTrait::formQuestion
268         $inputs = $input->getOption('inputs');
269
270         if (empty($inputs)) {
271             $io->writeln($this->trans('commands.generate.form.alter.messages.inputs'));
272             $inputs = $this->formQuestion($io);
273         } else {
274             $inputs= $this->explodeInlineArray($inputs);
275         }
276
277         $input->setOption('inputs', $inputs);
278     }
279
280     /**
281      * @{@inheritdoc}
282      */
283     public function explodeInlineArray($inlineInputs)
284     {
285         $inputs = [];
286         foreach ($inlineInputs as $inlineInput) {
287             $explodeInput = explode(" ", $inlineInput);
288             $parameters = [];
289             foreach ($explodeInput as $inlineParameter) {
290                 list($key, $value) = explode(":", $inlineParameter);
291                 if (!empty($value)) {
292                     $parameters[$key] = $value;
293                 }
294             }
295             $inputs[] = $parameters;
296         }
297
298         return $inputs;
299     }
300
301     protected function createGenerator()
302     {
303         return new FormAlterGenerator();
304     }
305
306     public function getWebprofilerForms()
307     {
308         $tokens = $this->profiler->find(null, null, 1000, null, '', '');
309         $forms = [];
310         foreach ($tokens as $token) {
311             $token = [$token['token']];
312             $profile = $this->profiler->loadProfile($token);
313             $formCollector = $profile->getCollector('forms');
314             $collectedForms = $formCollector->getForms();
315             if (empty($forms)) {
316                 $forms = $collectedForms;
317             } elseif (!empty($collectedForms)) {
318                 $forms = array_merge($forms, $collectedForms);
319             }
320         }
321         return $forms;
322     }
323 }