Yaffs site version 1.1
[yaffs-website] / vendor / drupal / console / src / Command / Create / NodesCommand.php
1 <?php
2
3 /**
4  * @file
5  * Contains \Drupal\Console\Command\Create\NodesCommand.
6  */
7
8 namespace Drupal\Console\Command\Create;
9
10 use Symfony\Component\Console\Input\InputArgument;
11 use Symfony\Component\Console\Input\InputOption;
12 use Symfony\Component\Console\Input\InputInterface;
13 use Symfony\Component\Console\Output\OutputInterface;
14 use Symfony\Component\Console\Command\Command;
15 use Drupal\Console\Annotations\DrupalCommand;
16 use Drupal\Console\Core\Command\Shared\CommandTrait;
17 use Drupal\Console\Command\Shared\CreateTrait;
18 use Drupal\Console\Utils\Create\NodeData;
19 use Drupal\Console\Utils\DrupalApi;
20 use Drupal\Console\Core\Style\DrupalStyle;
21 use Drupal\Core\Language\LanguageInterface;
22
23 /**
24  * Class NodesCommand
25  *
26  * @package Drupal\Console\Command\Generate
27  *
28  * @DrupalCommand(
29  *     extension = "node",
30  *     extensionType = "module"
31  * )
32  */
33 class NodesCommand extends Command
34 {
35     use CreateTrait;
36     use CommandTrait;
37
38     /**
39      * @var DrupalApi
40      */
41     protected $drupalApi;
42     /**
43      * @var NodeData
44      */
45     protected $createNodeData;
46
47     /**
48      * NodesCommand constructor.
49      *
50      * @param DrupalApi $drupalApi
51      * @param NodeData  $createNodeData
52      */
53     public function __construct(
54         DrupalApi $drupalApi,
55         NodeData $createNodeData
56     ) {
57         $this->drupalApi = $drupalApi;
58         $this->createNodeData = $createNodeData;
59         parent::__construct();
60     }
61
62     /**
63      * {@inheritdoc}
64      */
65     protected function configure()
66     {
67         $this
68             ->setName('create:nodes')
69             ->setDescription($this->trans('commands.create.nodes.description'))
70             ->addArgument(
71                 'content-types',
72                 InputArgument::IS_ARRAY,
73                 $this->trans('commands.create.nodes.arguments.content-types')
74             )
75             ->addOption(
76                 'limit',
77                 null,
78                 InputOption::VALUE_OPTIONAL,
79                 $this->trans('commands.create.nodes.options.limit')
80             )
81             ->addOption(
82                 'title-words',
83                 null,
84                 InputOption::VALUE_OPTIONAL,
85                 $this->trans('commands.create.nodes.options.title-words')
86             )
87             ->addOption(
88                 'time-range',
89                 null,
90                 InputOption::VALUE_OPTIONAL,
91                 $this->trans('commands.create.nodes.options.time-range')
92             )
93             ->addOption(
94                 'language',
95                 null,
96                 InputOption::VALUE_OPTIONAL,
97                 $this->trans('commands.create.nodes.options.language')
98             );
99     }
100
101     /**
102      * {@inheritdoc}
103      */
104     protected function interact(InputInterface $input, OutputInterface $output)
105     {
106         $io = new DrupalStyle($input, $output);
107
108         $contentTypes = $input->getArgument('content-types');
109         if (!$contentTypes) {
110             $bundles = $this->drupalApi->getBundles();
111             $contentTypes = $io->choice(
112                 $this->trans('commands.create.nodes.questions.content-type'),
113                 array_values($bundles),
114                 null,
115                 true
116             );
117
118             $contentTypes = array_map(
119                 function ($contentType) use ($bundles) {
120                     return array_search($contentType, $bundles);
121                 },
122                 $contentTypes
123             );
124
125             $input->setArgument('content-types', $contentTypes);
126         }
127
128         $limit = $input->getOption('limit');
129         if (!$limit) {
130             $limit = $io->ask(
131                 $this->trans('commands.create.nodes.questions.limit'),
132                 25
133             );
134             $input->setOption('limit', $limit);
135         }
136
137         $titleWords = $input->getOption('title-words');
138         if (!$titleWords) {
139             $titleWords = $io->ask(
140                 $this->trans('commands.create.nodes.questions.title-words'),
141                 5
142             );
143
144             $input->setOption('title-words', $titleWords);
145         }
146
147         $timeRange = $input->getOption('time-range');
148         if (!$timeRange) {
149             $timeRanges = $this->getTimeRange();
150
151             $timeRange = $io->choice(
152                 $this->trans('commands.create.nodes.questions.time-range'),
153                 array_values($timeRanges)
154             );
155
156             $input->setOption('time-range', array_search($timeRange, $timeRanges));
157         }
158
159         // Language module is enabled or not.
160         $languageModuleEnabled = \Drupal::moduleHandler()
161             ->moduleExists('language');
162
163         // If language module is enabled.
164         if ($languageModuleEnabled) {
165             // Get available languages on site.
166             $languages = \Drupal::languageManager()->getLanguages();
167             // Holds the available languages.
168             $language_list = [];
169
170             foreach ($languages as $lang) {
171                 $language_list[$lang->getId()] = $lang->getName();
172             }
173
174             $language = $input->getOption('language');
175             // If no language option or invalid language code in option.
176             if (!$language || !array_key_exists($language, $language_list)) {
177                 $language = $io->choice(
178                     $this->trans('commands.create.nodes.questions.language'),
179                     $language_list
180                 );
181             }
182             $input->setOption('language', $language);
183         } else {
184             // If 'language' module is not enabled.
185             $input->setOption('language', LanguageInterface::LANGCODE_NOT_SPECIFIED);
186         }
187     }
188
189     /**
190      * {@inheritdoc}
191      */
192     protected function execute(InputInterface $input, OutputInterface $output)
193     {
194         $io = new DrupalStyle($input, $output);
195
196         $contentTypes = $input->getArgument('content-types');
197         $limit = $input->getOption('limit')?:25;
198         $titleWords = $input->getOption('title-words')?:5;
199         $timeRange = $input->getOption('time-range')?:31536000;
200         $available_types = array_keys($this->drupalApi->getBundles());
201         $language = $input->getOption('language')?:'und';
202
203         foreach ($contentTypes as $type) {
204             if (!in_array($type, $available_types)) {
205                 throw new \Exception('Invalid content type name given.');
206             }
207         }
208
209         if (!$contentTypes) {
210             $contentTypes = $available_types;
211         }
212
213         $nodes = $this->createNodeData->create(
214             $contentTypes,
215             $limit,
216             $titleWords,
217             $timeRange,
218             $language
219         );
220         
221         $nodes = is_array($nodes) ? $nodes : [$nodes];
222
223         $tableHeader = [
224           $this->trans('commands.create.nodes.messages.node-id'),
225           $this->trans('commands.create.nodes.messages.content-type'),
226           $this->trans('commands.create.nodes.messages.title'),
227           $this->trans('commands.create.nodes.messages.created'),
228         ];
229
230         $io->table($tableHeader, $nodes['success']);
231
232         $io->success(
233             sprintf(
234                 $this->trans('commands.create.nodes.messages.created-nodes'),
235                 $limit
236             )
237         );
238
239         return 0;
240     }
241 }