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']);
200 protected function interact(InputInterface $input, OutputInterface $output)
202 $io = new DrupalStyle($input, $output);
205 $module = $input->getOption('module');
207 // @see Drupal\Console\Command\Shared\ModuleTrait::moduleQuestion
208 $module = $this->moduleQuestion($io);
211 $input->setOption('module', $module);
214 $formId = $input->getOption('form-id');
217 // Get form ids from webprofiler
218 if ($this->moduleHandler->moduleExists('webprofiler')) {
220 $this->trans('commands.generate.form.alter.messages.loading-forms')
222 $forms = $this->getWebprofilerForms();
225 if (!empty($forms)) {
226 $formId = $io->choiceNoList(
227 $this->trans('commands.generate.form.alter.options.form-id'),
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(
239 $forms[$formId]['class']['file']
242 foreach ($forms[$formId]['form'] as $itemKey => $item) {
243 if ($item['#type'] == 'hidden') {
244 unset($forms[$formId]['form'][$itemKey]);
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']);
253 $formItems = array_keys($forms[$formId]['form']);
255 $formItemsToHide = $io->choice(
256 $this->trans('commands.generate.form.alter.messages.hide-form-elements'),
262 $this->metadata['unset'] = array_filter(array_map('trim', $formItemsToHide));
265 $input->setOption('form-id', $formId);
267 // @see Drupal\Console\Command\Shared\FormTrait::formQuestion
268 $inputs = $input->getOption('inputs');
270 if (empty($inputs)) {
271 $io->writeln($this->trans('commands.generate.form.alter.messages.inputs'));
272 $inputs = $this->formQuestion($io);
274 $inputs= $this->explodeInlineArray($inputs);
277 $input->setOption('inputs', $inputs);
283 public function explodeInlineArray($inlineInputs)
286 foreach ($inlineInputs as $inlineInput) {
287 $explodeInput = explode(" ", $inlineInput);
289 foreach ($explodeInput as $inlineParameter) {
290 list($key, $value) = explode(":", $inlineParameter);
291 if (!empty($value)) {
292 $parameters[$key] = $value;
295 $inputs[] = $parameters;
301 protected function createGenerator()
303 return new FormAlterGenerator();
306 public function getWebprofilerForms()
308 $tokens = $this->profiler->find(null, null, 1000, null, '', '');
310 foreach ($tokens as $token) {
311 $token = [$token['token']];
312 $profile = $this->profiler->loadProfile($token);
313 $formCollector = $profile->getCollector('forms');
314 $collectedForms = $formCollector->getForms();
316 $forms = $collectedForms;
317 } elseif (!empty($collectedForms)) {
318 $forms = array_merge($forms, $collectedForms);