5 * Contains Drupal\Console\Command\Generate\FormCommand.
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\Command\Shared\ServicesTrait;
14 use Drupal\Console\Command\Shared\ModuleTrait;
15 use Drupal\Console\Command\Shared\MenuTrait;
16 use Drupal\Console\Command\Shared\FormTrait;
17 use Symfony\Component\Console\Command\Command;
18 use Drupal\Console\Core\Style\DrupalStyle;
19 use Drupal\Console\Core\Command\Shared\ContainerAwareCommandTrait;
20 use Drupal\Console\Generator\FormGenerator;
21 use Drupal\Console\Extension\Manager;
22 use Drupal\Console\Core\Utils\ChainQueue;
23 use Drupal\Console\Core\Utils\StringConverter;
24 use Drupal\Core\Render\ElementInfoManager;
25 use Drupal\Core\Routing\RouteProviderInterface;
27 abstract class FormCommand extends Command
29 use ContainerAwareCommandTrait;
41 protected $extensionManager;
51 protected $chainQueue;
54 * @var StringConverter
56 protected $stringConverter;
59 * @var ElementInfoManager
61 protected $elementInfoManager;
64 * @var RouteProviderInterface
66 protected $routeProvider;
70 * FormCommand constructor.
72 * @param Manager $extensionManager
73 * @param FormGenerator $generator
74 * @param ChainQueue $chainQueue
75 * @param StringConverter $stringConverter
76 * @param ElementInfoManager $elementInfoManager
77 * @param RouteProviderInterface $routeProvider
79 public function __construct(
80 Manager $extensionManager,
81 FormGenerator $generator,
82 ChainQueue $chainQueue,
83 StringConverter $stringConverter,
84 ElementInfoManager $elementInfoManager,
85 RouteProviderInterface $routeProvider
87 $this->extensionManager = $extensionManager;
88 $this->generator = $generator;
89 $this->chainQueue = $chainQueue;
90 $this->stringConverter = $stringConverter;
91 $this->elementInfoManager = $elementInfoManager;
92 $this->routeProvider = $routeProvider;
93 parent::__construct();
96 protected function setFormType($formType)
98 return $this->formType = $formType;
101 protected function setCommandName($commandName)
103 return $this->commandName = $commandName;
106 protected function configure()
109 ->setName($this->commandName)
112 $this->trans('commands.generate.form.description'),
118 $this->trans('commands.generate.form.help'),
126 InputOption::VALUE_REQUIRED,
127 $this->trans('commands.common.options.module')
132 InputOption::VALUE_OPTIONAL,
133 $this->trans('commands.generate.form.options.class')
138 InputOption::VALUE_OPTIONAL,
139 $this->trans('commands.generate.form.options.form-id')
144 InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY,
145 $this->trans('commands.common.options.services')
150 InputOption::VALUE_NONE,
151 $this->trans('commands.generate.form.options.config-file')
156 InputOption::VALUE_OPTIONAL,
157 $this->trans('commands.common.options.inputs')
162 InputOption::VALUE_OPTIONAL,
163 $this->trans('commands.generate.form.options.path')
168 InputOption::VALUE_OPTIONAL,
169 $this->trans('commands.generate.form.options.menu_link_gen')
174 InputOption::VALUE_OPTIONAL,
175 $this->trans('commands.generate.form.options.menu_link_title')
180 InputOption::VALUE_OPTIONAL,
181 $this->trans('commands.generate.form.options.menu_parent')
186 InputOption::VALUE_OPTIONAL,
187 $this->trans('commands.generate.form.options.menu_link_desc')
194 protected function execute(InputInterface $input, OutputInterface $output)
196 $module = $input->getOption('module');
197 $services = $input->getOption('services');
198 $path = $input->getOption('path');
199 $config_file = $input->getOption('config-file');
200 $class_name = $input->getOption('class');
201 $form_id = $input->getOption('form-id');
202 $form_type = $this->formType;
203 $menu_link_gen = $input->getOption('menu_link_gen');
204 $menu_parent = $input->getOption('menu_parent');
205 $menu_link_title = $input->getOption('menu_link_title');
206 $menu_link_desc = $input->getOption('menu_link_desc');
208 // if exist form generate config file
209 $inputs = $input->getOption('inputs');
210 $build_services = $this->buildServices($services);
214 ->generate($module, $class_name, $form_id, $form_type, $build_services, $config_file, $inputs, $path, $menu_link_gen, $menu_link_title, $menu_parent, $menu_link_desc);
216 $this->chainQueue->addCommand('router:rebuild', []);
222 protected function interact(InputInterface $input, OutputInterface $output)
224 $io = new DrupalStyle($input, $output);
227 $module = $input->getOption('module');
229 // @see Drupal\Console\Command\Shared\ModuleTrait::moduleQuestion
230 $module = $this->moduleQuestion($io);
231 $input->setOption('module', $module);
235 $className = $input->getOption('class');
237 $className = $io->ask(
238 $this->trans('commands.generate.form.questions.class'),
241 $input->setOption('class', $className);
245 $formId = $input->getOption('form-id');
248 $this->trans('commands.generate.form.questions.form-id'),
249 $this->stringConverter->camelCaseToMachineName($className)
251 $input->setOption('form-id', $formId);
255 // @see use Drupal\Console\Command\Shared\ServicesTrait::servicesQuestion
256 $services = $this->servicesQuestion($io);
257 $input->setOption('services', $services);
259 // --config_file option
260 $config_file = $input->getOption('config-file');
263 $config_file = $io->confirm(
264 $this->trans('commands.generate.form.questions.config-file'),
267 $input->setOption('config-file', $config_file);
271 $inputs = $input->getOption('inputs');
273 // @see \Drupal\Console\Command\Shared\FormTrait::formQuestion
274 $inputs = $this->formQuestion($io);
275 $input->setOption('inputs', $inputs);
278 $path = $input->getOption('path');
280 if ($this->formType == 'ConfigFormBase') {
281 $form_path = '/admin/config/{{ module_name }}/{{ class_name_short }}';
282 $form_path = sprintf(
283 '/admin/config/%s/%s',
285 strtolower($this->stringConverter->removeSuffix($className))
288 $form_path = sprintf(
291 $this->stringConverter->camelCaseToMachineName($this->stringConverter->removeSuffix($className))
295 $this->trans('commands.generate.form.questions.path'),
298 if (count($this->routeProvider->getRoutesByPattern($path)) > 0) {
299 throw new \InvalidArgumentException(
302 'commands.generate.form.messages.path-already-added'
312 $input->setOption('path', $path);
315 // --link option for links.menu
316 if ($this->formType == 'ConfigFormBase') {
317 $menu_options = $this->menuQuestion($io, $className);
318 $menu_link_gen = $input->getOption('menu_link_gen');
319 $menu_link_title = $input->getOption('menu_link_title');
320 $menu_parent = $input->getOption('menu_parent');
321 $menu_link_desc = $input->getOption('menu_link_desc');
322 if (!$menu_link_gen || !$menu_link_title || !$menu_parent || !$menu_link_desc) {
323 $input->setOption('menu_link_gen', $menu_options['menu_link_gen']);
324 $input->setOption('menu_link_title', $menu_options['menu_link_title']);
325 $input->setOption('menu_parent', $menu_options['menu_parent']);
326 $input->setOption('menu_link_desc', $menu_options['menu_link_desc']);