Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / vendor / chi-teck / drupal-code-generator / src / Command / Drupal_8 / Hook.php
1 <?php
2
3 namespace DrupalCodeGenerator\Command\Drupal_8;
4
5 use DrupalCodeGenerator\Command\BaseGenerator;
6 use DrupalCodeGenerator\Utils;
7 use Symfony\Component\Console\Input\InputInterface;
8 use Symfony\Component\Console\Output\OutputInterface;
9 use Symfony\Component\Console\Question\Question;
10
11 /**
12  * Implements d8:hook command.
13  */
14 class Hook extends BaseGenerator {
15
16   protected $name = 'd8:hook';
17   protected $description = 'Generates a hook';
18   protected $alias = 'hook';
19
20   /**
21    * {@inheritdoc}
22    */
23   protected function interact(InputInterface $input, OutputInterface $output) {
24     $questions = Utils::defaultQuestions();
25     $questions['hook_name'] = new Question('Hook name');
26     $questions['hook_name']->setValidator(function ($value) {
27       if (!in_array($value, $this->supportedHooks())) {
28         throw new \UnexpectedValueException('The value is not correct class name.');
29       }
30       return $value;
31     });
32     $questions['hook_name']->setAutocompleterValues($this->supportedHooks());
33
34     $vars = $this->collectVars($input, $output, $questions);
35
36     // Most Drupal hooks are situated in a module file but some are not.
37     $special_hooks = [
38       'install' => [
39         'install',
40         'uninstall',
41         'schema',
42         'requirements',
43         'update_N',
44         'update_last_removed',
45       ],
46       // See views_hook_info().
47       'views.inc' => [
48         'views_data',
49         'views_data_alter',
50         'views_analyze',
51         'views_invalidate_cache',
52         'field_views_data',
53         'field_views_data_alter',
54         // See \Drupal\views\views::$plugins.
55         'views_plugins_access_alter',
56         'views_plugins_area_alter',
57         'views_plugins_argument_alter',
58         'views_plugins_argument_default_alter',
59         'views_plugins_argument_validator_alter',
60         'views_plugins_cache_alter',
61         'views_plugins_display_extender_alter',
62         'views_plugins_display_alter',
63         'views_plugins_exposed_form_alter',
64         'views_plugins_field_alter',
65         'views_plugins_filter_alter',
66         'views_plugins_join_alter',
67         'views_plugins_pager_alter',
68         'views_plugins_query_alter',
69         'views_plugins_relationship_alter',
70         'views_plugins_row_alter',
71         'views_plugins_sort_alter',
72         'views_plugins_style_alter',
73         'views_plugins_wizard_alter',
74       ],
75       'views_execution.inc' => [
76         'views_query_substitutions',
77         'views_form_substitutions',
78         'views_pre_view',
79         'views_pre_build',
80         'views_post_build',
81         'views_pre_execute',
82         'views_post_execute',
83         'views_pre_render',
84         'views_post_render',
85         'views_query_alter',
86       ],
87       // See system_hook_info().
88       'tokens.inc' => [
89         'token_info',
90         'token_info_alter',
91         'tokens',
92         'tokens_alter',
93       ],
94       'post_update.php' => [
95         'post_update_N',
96       ],
97     ];
98
99     $file_type = 'module';
100     foreach ($special_hooks as $group => $hooks) {
101       if (in_array($vars['hook_name'], $hooks)) {
102         $file_type = $group;
103         break;
104       }
105     }
106
107     $this->addFile()
108       ->path('{machine_name}.' . $file_type)
109       ->headerTemplate("d8/file-docs/$file_type.twig")
110       ->template('d8/hook/' . $vars['hook_name'] . '.twig')
111       ->action('append')
112       ->headerSize(7);
113   }
114
115   /**
116    * Returns list of supported hooks.
117    */
118   protected function supportedHooks() {
119     return array_map(function ($file) {
120       return pathinfo($file, PATHINFO_FILENAME);
121     }, array_diff(scandir($this->templatePath . '/d8/hook'), ['.', '..']));
122   }
123
124 }