5 * Contains \Drupal\Console\Command\Generate\FormAlterCommand.
8 namespace Drupal\Console\Command\Generate;
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;
31 class FormAlterCommand extends Command
37 use ConfirmationTrait;
43 protected $extensionManager;
46 * @var FormAlterGenerator
51 * @var StringConverter
53 protected $stringConverter;
56 * @var ModuleHandlerInterface
58 protected $moduleHandler;
61 * @var ElementInfoManager
63 protected $elementInfoManager;
71 * @var RouteProviderInterface
73 protected $routeProvider;
88 protected $chainQueue;
92 * FormAlterCommand constructor.
94 * @param Manager $extensionManager
95 * @param FormAlterGenerator $generator
96 * @param StringConverter $stringConverter
97 * @param ModuleHandlerInterface $moduleHandler
98 * @param ElementInfoManager $elementInfoManager
99 * @param Profiler $profiler
101 * @param ChainQueue $chainQueue
103 public function __construct(
104 Manager $extensionManager,
105 FormAlterGenerator $generator,
106 StringConverter $stringConverter,
107 ModuleHandlerInterface $moduleHandler,
108 ElementInfoManager $elementInfoManager,
109 Profiler $profiler = null,
111 ChainQueue $chainQueue
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();
124 protected $metadata = [
131 protected function configure()
134 ->setName('generate:form:alter')
136 $this->trans('commands.generate.form.alter.description')
138 ->setHelp($this->trans('commands.generate.form.alter.help'))
142 InputOption::VALUE_REQUIRED,
143 $this->trans('commands.common.options.module')
148 InputOption::VALUE_OPTIONAL,
149 $this->trans('commands.generate.form.alter.options.form-id')
154 InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY,
155 $this->trans('commands.common.options.inputs')
162 protected function execute(InputInterface $input, OutputInterface $output)
164 $io = new DrupalStyle($input, $output);
166 // @see use Drupal\Console\Command\Shared\ConfirmationTrait::confirmGeneration
167 if (!$this->confirmGeneration($io)) {
171 $module = $input->getOption('module');
172 $formId = $input->getOption('form-id');
173 $inputs = $input->getOption('inputs');
175 $function = $module . '_form_' .$formId . '_alter';
177 if ($this->extensionManager->validateModuleFunctionExist($module, $function)) {
178 throw new \Exception(
180 $this->trans('commands.generate.form.alter.messages.help-already-implemented'),
186 //validate if input is an array
187 if (!is_array($inputs[0])) {
188 $inputs= $this->explodeInlineArray($inputs);
193 ->generate($module, $formId, $inputs, $this->metadata);
195 $this->chainQueue->addCommand('cache:rebuild', ['cache' => 'discovery']);
198 protected function interact(InputInterface $input, OutputInterface $output)
200 $io = new DrupalStyle($input, $output);
203 $module = $input->getOption('module');
205 // @see Drupal\Console\Command\Shared\ModuleTrait::moduleQuestion
206 $module = $this->moduleQuestion($io);
209 $input->setOption('module', $module);
212 $formId = $input->getOption('form-id');
215 // Get form ids from webprofiler
216 if ($this->moduleHandler->moduleExists('webprofiler')) {
218 $this->trans('commands.generate.form.alter.messages.loading-forms')
220 $forms = $this->getWebprofilerForms();
223 if (!empty($forms)) {
224 $formId = $io->choiceNoList(
225 $this->trans('commands.generate.form.alter.options.form-id'),
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(
237 $forms[$formId]['class']['file']
240 foreach ($forms[$formId]['form'] as $itemKey => $item) {
241 if ($item['#type'] == 'hidden') {
242 unset($forms[$formId]['form'][$itemKey]);
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']);
251 $formItems = array_keys($forms[$formId]['form']);
253 $formItemsToHide = $io->choice(
254 $this->trans('commands.generate.form.alter.messages.hide-form-elements'),
260 $this->metadata['unset'] = array_filter(array_map('trim', $formItemsToHide));
263 $input->setOption('form-id', $formId);
265 // @see Drupal\Console\Command\Shared\FormTrait::formQuestion
266 $inputs = $input->getOption('inputs');
268 if (empty($inputs)) {
269 $io->writeln($this->trans('commands.generate.form.alter.messages.inputs'));
270 $inputs = $this->formQuestion($io);
272 $inputs= $this->explodeInlineArray($inputs);
275 $input->setOption('inputs', $inputs);
281 public function explodeInlineArray($inlineInputs)
284 foreach ($inlineInputs as $inlineInput) {
285 $explodeInput = explode(" ", $inlineInput);
287 foreach ($explodeInput as $inlineParameter) {
288 list($key, $value) = explode(":", $inlineParameter);
289 if (!empty($value)) {
290 $parameters[$key] = $value;
293 $inputs[] = $parameters;
299 protected function createGenerator()
301 return new FormAlterGenerator();
304 public function getWebprofilerForms()
306 $tokens = $this->profiler->find(null, null, 1000, null, '', '');
308 foreach ($tokens as $token) {
309 $token = [$token['token']];
310 $profile = $this->profiler->loadProfile($token);
311 $formCollector = $profile->getCollector('forms');
312 $collectedForms = $formCollector->getForms();
314 $forms = $collectedForms;
315 } elseif (!empty($collectedForms)) {
316 $forms = array_merge($forms, $collectedForms);