From 330ac2f36b9fa41186f4d0715ddd5d898e558037 Mon Sep 17 00:00:00 2001 From: Ferrisx4 Date: Thu, 11 Jan 2024 13:21:33 -0500 Subject: [PATCH 01/14] Create Tripal Extension Module Generator --- .../TripalExtensionModuleGenerator.php | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 src/Drush/Generators/TripalExtensionModuleGenerator.php diff --git a/src/Drush/Generators/TripalExtensionModuleGenerator.php b/src/Drush/Generators/TripalExtensionModuleGenerator.php new file mode 100644 index 0000000..b32b680 --- /dev/null +++ b/src/Drush/Generators/TripalExtensionModuleGenerator.php @@ -0,0 +1,142 @@ +get('extension.list.module')); + } + + /** + * {@inheritdoc} + */ + protected function generate(array &$vars, AssetCollection $assets): void { + $ir = $this->createInterviewer($vars); + + $vars['name'] = $ir->askName(); + $vars['machine_name'] = $ir->askMachineName(); + + $vars['description'] = $ir->ask('Module description', 'Provides additional functionality for the site.', new Required()); + $vars['package'] = $ir->ask('Package', 'Tripal Extension'); + + $dependencies = $ir->ask('Dependencies (comma separated)', 'tripal, tripal_chado'); + // @todo Clean-up and test. + $vars['dependencies'] = $this->buildDependencies($dependencies); + + $vars['class_prefix'] = '{machine_name|camelize}'; + + $assets->addFile('{machine_name}/{machine_name}.info.yml', 'module.info.yml.twig'); + + if ($ir->confirm('Would you like to create module file?', TRUE)) { + $assets->addFile('{machine_name}/{machine_name}.module', 'module.module.twig'); + } + + if ($ir->confirm('Would you like to create install file?', TRUE)) { + $assets->addFile('{machine_name}/{machine_name}.install', 'module.install.twig'); + } + + if ($ir->confirm('Would you like to create libraries.yml file?', TRUE)) { + $assets->addFile('{machine_name}/{machine_name}.libraries.yml', 'module.libraries.yml.twig'); + } + + if ($ir->confirm('Would you like to create permissions.yml file?', TRUE)) { + $assets->addFile('{machine_name}/{machine_name}.permissions.yml', 'module.permissions.yml.twig'); + } + + // @todo Create an event subscriber? see https://github.com/Chi-teck/drupal-code-generator/blob/985d8343a143437050b89a36c0d20ff1fc10f8bf/src/Command/Module.php + + if ($vars['controller'] = $ir->confirm('Would you like to create a controller?', TRUE)) { + $assets->addFile("{machine_name}/src/Controller/{class_prefix}Controller.php") + ->template('ExampleController.php.twig'); + } + + if ($vars['form'] = $ir->confirm('Would you like to create settings form?', TRUE)) { + $assets->addFile('{machine_name}/src/Form/SettingsForm.php.twig') + ->template('SettingsForm.php.twig'); + $assets->addFile('{machine_name}/config/schema/{machine_name}.schema.yml') + ->template('module.schema.yml.twig'); + $assets->addFile('{machine_name}/{machine_name}.links.menu.yml') + ->template('module.links.menu.twig'); + } + + if ($vars['controller'] || $vars['form']) { + $assets->addFile('{machine_name}/{machine_name}.routing.yml') + ->template('module.routing.yml.twig'); + } + } + + /** + * Builds array of dependencies from comma-separated string. + */ + private function buildDependencies(?string $dependencies_encoded): array { + + $dependencies = $dependencies_encoded ? \explode(',', $dependencies_encoded) : []; + + foreach ($dependencies as &$dependency) { + $dependency = \str_replace(' ', '_', \trim(\strtolower($dependency))); + // Check if the module name is already prefixed. + if (\str_contains($dependency, ':')) { + continue; + } + // Dependencies should be namespaced in the format {project}:{name}. + $project = $dependency; + try { + // The extension list is internal for extending not for instantiating. + // @see \Drupal\Core\Extension\ExtensionList + /** @psalm-suppress InternalMethod */ + $package = $this->moduleList->getExtensionInfo($dependency)['package'] ?? NULL; + if ($package === 'Core') { + $project = 'drupal'; + } + } + catch (UnknownExtensionException) { + + } + $dependency = $project . ':' . $dependency; + } + + $dependency_sorter = static function (string $a, string $b): int { + // Core dependencies go first. + $a_is_drupal = \str_starts_with($a, 'drupal:'); + $b_is_drupal = \str_starts_with($b, 'drupal:'); + if ($a_is_drupal xor $b_is_drupal) { + return $a_is_drupal ? -1 : 1; + } + return $a <=> $b; + }; + \uasort($dependencies, $dependency_sorter); + + return $dependencies; + } + +} \ No newline at end of file From 8081f84465c22952bd34eea4f62556bd73982d5f Mon Sep 17 00:00:00 2001 From: Ferrisx4 Date: Thu, 11 Jan 2024 13:22:15 -0500 Subject: [PATCH 02/14] Create Tripal Extension Module templates Initial commit only, may require modifications --- .../generator/tripal-extension-module.twig | 34 +++++++ .../ExampleController.php.twig | 25 +++++ .../SettingsForm.php.twig | 59 ++++++++++++ .../module.info.yml.twig | 11 +++ .../module.install.twig | 96 +++++++++++++++++++ .../module.libraries.yml.twig | 10 ++ .../module.links.menu.twig | 6 ++ .../module.module.twig | 6 ++ .../module.permissions.yml.twig | 4 + .../module.routing.yml.twig | 19 ++++ .../module.schema.yml.twig | 8 ++ .../module.services.yml.twig | 6 ++ 12 files changed, 284 insertions(+) create mode 100644 templates/generator/tripal-extension-module.twig create mode 100644 templates/generator/tripal_extension_module/ExampleController.php.twig create mode 100644 templates/generator/tripal_extension_module/SettingsForm.php.twig create mode 100644 templates/generator/tripal_extension_module/module.info.yml.twig create mode 100644 templates/generator/tripal_extension_module/module.install.twig create mode 100644 templates/generator/tripal_extension_module/module.libraries.yml.twig create mode 100644 templates/generator/tripal_extension_module/module.links.menu.twig create mode 100644 templates/generator/tripal_extension_module/module.module.twig create mode 100644 templates/generator/tripal_extension_module/module.permissions.yml.twig create mode 100644 templates/generator/tripal_extension_module/module.routing.yml.twig create mode 100644 templates/generator/tripal_extension_module/module.schema.yml.twig create mode 100644 templates/generator/tripal_extension_module/module.services.yml.twig diff --git a/templates/generator/tripal-extension-module.twig b/templates/generator/tripal-extension-module.twig new file mode 100644 index 0000000..3f9155f --- /dev/null +++ b/templates/generator/tripal-extension-module.twig @@ -0,0 +1,34 @@ + [ + 'variables' => ['foo' => NULL], + ], + ]; +} +{% endif %} +{% if create_preprocess %} + +/** + * Prepares variables for {{ template_name }} template. + * + * Default template: {{ template_name }}. + * + * @param array $variables + * An associative array containing: + * - foo: Foo variable description. + */ +function template_preprocess_{{ theme_key }}(array &$variables): void { + $variables['foo'] = 'bar'; +} +{% endif %} diff --git a/templates/generator/tripal_extension_module/ExampleController.php.twig b/templates/generator/tripal_extension_module/ExampleController.php.twig new file mode 100644 index 0000000..79efdb2 --- /dev/null +++ b/templates/generator/tripal_extension_module/ExampleController.php.twig @@ -0,0 +1,25 @@ + 'item', + '#markup' => $this->t('It works!'), + ]; + + return $build; + } + +} \ No newline at end of file diff --git a/templates/generator/tripal_extension_module/SettingsForm.php.twig b/templates/generator/tripal_extension_module/SettingsForm.php.twig new file mode 100644 index 0000000..9306516 --- /dev/null +++ b/templates/generator/tripal_extension_module/SettingsForm.php.twig @@ -0,0 +1,59 @@ + 'textfield', + '#title' => $this->t('Example'), + '#default_value' => $this->config('{{ machine_name }}.settings')->get('example'), + ]; + return parent::buildForm($form, $form_state); + } + + /** + * {@inheritdoc} + */ + public function validateForm(array &$form, FormStateInterface $form_state) { + if ($form_state->getValue('example') != 'example') { + $form_state->setErrorByName('example', $this->t('The value is not correct.')); + } + parent::validateForm($form, $form_state); + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + $this->config('{{ machine_name }}.settings') + ->set('example', $form_state->getValue('example')) + ->save(); + parent::submitForm($form, $form_state); + } + +} \ No newline at end of file diff --git a/templates/generator/tripal_extension_module/module.info.yml.twig b/templates/generator/tripal_extension_module/module.info.yml.twig new file mode 100644 index 0000000..bc6e46d --- /dev/null +++ b/templates/generator/tripal_extension_module/module.info.yml.twig @@ -0,0 +1,11 @@ +name: {{ name }} +type: module +description: {{ description }} +package: {{ package }} +core_version_requirement: ^10 +{% if dependencies %} +dependencies: + {% for dependency in dependencies %} + - {{ dependency }} + {% endfor %} +{% endif %} \ No newline at end of file diff --git a/templates/generator/tripal_extension_module/module.install.twig b/templates/generator/tripal_extension_module/module.install.twig new file mode 100644 index 0000000..aea7c4e --- /dev/null +++ b/templates/generator/tripal_extension_module/module.install.twig @@ -0,0 +1,96 @@ +addStatus(__FUNCTION__); +} + +/** + * Implements hook_uninstall(). + */ +function {{ machine_name }}_uninstall() { + \Drupal::messenger()->addStatus(__FUNCTION__); +} + +/** + * Implements hook_schema(). + */ +function {{ machine_name }}_schema() { + $schema['{{ machine_name }}_example'] = [ + 'description' => 'Table description.', + 'fields' => [ + 'id' => [ + 'type' => 'serial', + 'not null' => TRUE, + 'description' => 'Primary Key: Unique record ID.', + ], + 'uid' => [ + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + 'description' => 'The {users}.uid of the user who created the record.', + ], + 'status' => [ + 'description' => 'Boolean indicating whether this record is active.', + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + 'size' => 'tiny', + ], + 'type' => [ + 'type' => 'varchar_ascii', + 'length' => 64, + 'not null' => TRUE, + 'default' => '', + 'description' => 'Type of the record.', + ], + 'created' => [ + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + 'description' => 'Timestamp when the record was created.', + ], + 'data' => [ + 'type' => 'blob', + 'not null' => TRUE, + 'size' => 'big', + 'description' => 'The arbitrary data for the item.', + ], + ], + 'primary key' => ['id'], + 'indexes' => [ + 'type' => ['type'], + 'uid' => ['uid'], + 'status' => ['status'], + ], + ]; + + return $schema; +} + +/** + * Implements hook_requirements(). + */ +function {{ machine_name }}_requirements($phase) { + $requirements = []; + + if ($phase == 'runtime') { + $value = mt_rand(0, 100); + $requirements['{{ machine_name }}_status'] = [ + 'title' => t('{{ name }} status'), + 'value' => t('{{ name }} value: @value', ['@value' => $value]), + 'severity' => $value > 50 ? REQUIREMENT_INFO : REQUIREMENT_WARNING, + ]; + } + + return $requirements; +} \ No newline at end of file diff --git a/templates/generator/tripal_extension_module/module.libraries.yml.twig b/templates/generator/tripal_extension_module/module.libraries.yml.twig new file mode 100644 index 0000000..8f6a04e --- /dev/null +++ b/templates/generator/tripal_extension_module/module.libraries.yml.twig @@ -0,0 +1,10 @@ +# Custom module library for general purposes. +{{ machine_name }}: + js: + js/{{ machine_name|u2h }}.js: {} + css: + component: + css/{{ machine_name|u2h }}.css: {} + dependencies: + - core/drupalSettings + - {{ machine_name }}/jquery-labelauty diff --git a/templates/generator/tripal_extension_module/module.links.menu.twig b/templates/generator/tripal_extension_module/module.links.menu.twig new file mode 100644 index 0000000..cd88c77 --- /dev/null +++ b/templates/generator/tripal_extension_module/module.links.menu.twig @@ -0,0 +1,6 @@ +{{ machine_name }}.settings_form: + title: '{{ name }}' + description: 'Configure {{ name }}.' + parent: system.admin_config_system + route_name: {{ machine_name }}.settings_form + weight: 10 \ No newline at end of file diff --git a/templates/generator/tripal_extension_module/module.module.twig b/templates/generator/tripal_extension_module/module.module.twig new file mode 100644 index 0000000..10f8318 --- /dev/null +++ b/templates/generator/tripal_extension_module/module.module.twig @@ -0,0 +1,6 @@ + Date: Thu, 11 Jan 2024 13:26:36 -0500 Subject: [PATCH 03/14] Change name to match conventions --- src/Drush/Generators/TripalExtensionModuleGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Drush/Generators/TripalExtensionModuleGenerator.php b/src/Drush/Generators/TripalExtensionModuleGenerator.php index b32b680..406a91d 100644 --- a/src/Drush/Generators/TripalExtensionModuleGenerator.php +++ b/src/Drush/Generators/TripalExtensionModuleGenerator.php @@ -14,7 +14,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; #[Generator( - name: 'tripal_extension_module', + name: 'tripal:extension_module', description: 'Generates a Tripal extension module', templatePath: __DIR__ . '/../../../templates/generator/tripal_extension_module', type: GeneratorType::MODULE, From b9c6f22c6aae85c43fb139548722764757afb718 Mon Sep 17 00:00:00 2001 From: Ferrisx4 Date: Thu, 11 Jan 2024 13:27:17 -0500 Subject: [PATCH 04/14] Add Tripal Extension Module to Command table --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 576af7b..3140563 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ The following commands are currently implemented: | tripal-chado:field-formatter | Generates a Chado Formatter to be used with an existing Chado Field. | | tripal-chado:field-type | Generates a Chado Field Type for developing fields which store their data in chado. | | tripal-chado:field-widget | Generates a Chado Field Widget to be used with an existing Chado Field. | +| tripal:extension_module | Generates a Tripal Extension module and its associated files. | #### Usage: From 461fc78a21a0ad3d363b8fc1a9835794f4eec56a Mon Sep 17 00:00:00 2001 From: Ferrisx4 Date: Thu, 11 Jan 2024 13:58:24 -0500 Subject: [PATCH 05/14] Apply correct permissions based on user choice --- src/Drush/Generators/TripalExtensionModuleGenerator.php | 3 ++- .../tripal_extension_module/module.routing.yml.twig | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Drush/Generators/TripalExtensionModuleGenerator.php b/src/Drush/Generators/TripalExtensionModuleGenerator.php index 406a91d..eb334c9 100644 --- a/src/Drush/Generators/TripalExtensionModuleGenerator.php +++ b/src/Drush/Generators/TripalExtensionModuleGenerator.php @@ -69,8 +69,9 @@ protected function generate(array &$vars, AssetCollection $assets): void { $assets->addFile('{machine_name}/{machine_name}.libraries.yml', 'module.libraries.yml.twig'); } - if ($ir->confirm('Would you like to create permissions.yml file?', TRUE)) { + if ($ir->confirm('Would you like to create permissions.yml file?', FALSE)) { $assets->addFile('{machine_name}/{machine_name}.permissions.yml', 'module.permissions.yml.twig'); + $vars['permissions'] = TRUE; } // @todo Create an event subscriber? see https://github.com/Chi-teck/drupal-code-generator/blob/985d8343a143437050b89a36c0d20ff1fc10f8bf/src/Command/Module.php diff --git a/templates/generator/tripal_extension_module/module.routing.yml.twig b/templates/generator/tripal_extension_module/module.routing.yml.twig index 57d8bf7..f4a30ff 100644 --- a/templates/generator/tripal_extension_module/module.routing.yml.twig +++ b/templates/generator/tripal_extension_module/module.routing.yml.twig @@ -15,5 +15,10 @@ _title: '{{ name }} settings' _form: 'Drupal\{{ machine_name }}\Form\SettingsForm' requirements: - _permission: 'administer {{ machine_name }} configuration' + {% if permissions %} + _permission: 'administer {{ machine_name }}' + {% endif %} + {% if not permissions %} + _permission: 'administer tripal' + {% endif %} {% endif %} \ No newline at end of file From 90aa78ec83e0dfe22383a44dc8541c9105b71450 Mon Sep 17 00:00:00 2001 From: Ferrisx4 Date: Thu, 11 Jan 2024 17:58:06 -0500 Subject: [PATCH 06/14] Add configure links Tripal Extensions page and Drupal Extend listing --- .../TripalExtensionModuleGenerator.php | 25 ++++++++++--------- .../module.info.yml.twig | 3 +++ .../module.links.menu.twig | 2 +- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/Drush/Generators/TripalExtensionModuleGenerator.php b/src/Drush/Generators/TripalExtensionModuleGenerator.php index eb334c9..6228e6c 100644 --- a/src/Drush/Generators/TripalExtensionModuleGenerator.php +++ b/src/Drush/Generators/TripalExtensionModuleGenerator.php @@ -55,8 +55,7 @@ protected function generate(array &$vars, AssetCollection $assets): void { $vars['class_prefix'] = '{machine_name|camelize}'; - $assets->addFile('{machine_name}/{machine_name}.info.yml', 'module.info.yml.twig'); - + if ($ir->confirm('Would you like to create module file?', TRUE)) { $assets->addFile('{machine_name}/{machine_name}.module', 'module.module.twig'); } @@ -68,28 +67,30 @@ protected function generate(array &$vars, AssetCollection $assets): void { if ($ir->confirm('Would you like to create libraries.yml file?', TRUE)) { $assets->addFile('{machine_name}/{machine_name}.libraries.yml', 'module.libraries.yml.twig'); } - + if ($ir->confirm('Would you like to create permissions.yml file?', FALSE)) { $assets->addFile('{machine_name}/{machine_name}.permissions.yml', 'module.permissions.yml.twig'); $vars['permissions'] = TRUE; } - + // @todo Create an event subscriber? see https://github.com/Chi-teck/drupal-code-generator/blob/985d8343a143437050b89a36c0d20ff1fc10f8bf/src/Command/Module.php - + if ($vars['controller'] = $ir->confirm('Would you like to create a controller?', TRUE)) { $assets->addFile("{machine_name}/src/Controller/{class_prefix}Controller.php") - ->template('ExampleController.php.twig'); + ->template('ExampleController.php.twig'); } - + if ($vars['form'] = $ir->confirm('Would you like to create settings form?', TRUE)) { - $assets->addFile('{machine_name}/src/Form/SettingsForm.php.twig') - ->template('SettingsForm.php.twig'); + $assets->addFile('{machine_name}/src/Form/SettingsForm.php') + ->template('SettingsForm.php.twig'); $assets->addFile('{machine_name}/config/schema/{machine_name}.schema.yml') - ->template('module.schema.yml.twig'); + ->template('module.schema.yml.twig'); $assets->addFile('{machine_name}/{machine_name}.links.menu.yml') - ->template('module.links.menu.twig'); + ->template('module.links.menu.twig'); } - + + $assets->addFile('{machine_name}/{machine_name}.info.yml', 'module.info.yml.twig'); + if ($vars['controller'] || $vars['form']) { $assets->addFile('{machine_name}/{machine_name}.routing.yml') ->template('module.routing.yml.twig'); diff --git a/templates/generator/tripal_extension_module/module.info.yml.twig b/templates/generator/tripal_extension_module/module.info.yml.twig index bc6e46d..48c2c61 100644 --- a/templates/generator/tripal_extension_module/module.info.yml.twig +++ b/templates/generator/tripal_extension_module/module.info.yml.twig @@ -8,4 +8,7 @@ dependencies: {% for dependency in dependencies %} - {{ dependency }} {% endfor %} +{% endif %} +{% if form %} +configure: {{ machine_name }}.settings_form {% endif %} \ No newline at end of file diff --git a/templates/generator/tripal_extension_module/module.links.menu.twig b/templates/generator/tripal_extension_module/module.links.menu.twig index cd88c77..84b080b 100644 --- a/templates/generator/tripal_extension_module/module.links.menu.twig +++ b/templates/generator/tripal_extension_module/module.links.menu.twig @@ -1,6 +1,6 @@ {{ machine_name }}.settings_form: title: '{{ name }}' description: 'Configure {{ name }}.' - parent: system.admin_config_system + parent: tripal.extension route_name: {{ machine_name }}.settings_form weight: 10 \ No newline at end of file From 114f695ce7cbf5e99e8f8600e4fbff42d44855d2 Mon Sep 17 00:00:00 2001 From: Ferrisx4 Date: Thu, 11 Jan 2024 18:41:46 -0500 Subject: [PATCH 07/14] Make the config page class have a unique name --- src/Drush/Generators/TripalExtensionModuleGenerator.php | 4 ++-- .../generator/tripal_extension_module/SettingsForm.php.twig | 2 +- .../generator/tripal_extension_module/module.routing.yml.twig | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Drush/Generators/TripalExtensionModuleGenerator.php b/src/Drush/Generators/TripalExtensionModuleGenerator.php index 6228e6c..2d08b88 100644 --- a/src/Drush/Generators/TripalExtensionModuleGenerator.php +++ b/src/Drush/Generators/TripalExtensionModuleGenerator.php @@ -81,7 +81,7 @@ protected function generate(array &$vars, AssetCollection $assets): void { } if ($vars['form'] = $ir->confirm('Would you like to create settings form?', TRUE)) { - $assets->addFile('{machine_name}/src/Form/SettingsForm.php') + $assets->addFile('{machine_name}/src/Form/{machine_name|camelize}SettingsForm.php') ->template('SettingsForm.php.twig'); $assets->addFile('{machine_name}/config/schema/{machine_name}.schema.yml') ->template('module.schema.yml.twig'); @@ -90,7 +90,7 @@ protected function generate(array &$vars, AssetCollection $assets): void { } $assets->addFile('{machine_name}/{machine_name}.info.yml', 'module.info.yml.twig'); - + if ($vars['controller'] || $vars['form']) { $assets->addFile('{machine_name}/{machine_name}.routing.yml') ->template('module.routing.yml.twig'); diff --git a/templates/generator/tripal_extension_module/SettingsForm.php.twig b/templates/generator/tripal_extension_module/SettingsForm.php.twig index 9306516..007b3c3 100644 --- a/templates/generator/tripal_extension_module/SettingsForm.php.twig +++ b/templates/generator/tripal_extension_module/SettingsForm.php.twig @@ -8,7 +8,7 @@ use Drupal\Core\Form\FormStateInterface; /** * Configure {{ name }} settings for this site. */ -class SettingsForm extends ConfigFormBase { +class {{ machine_name|camelize }}SettingsForm extends ConfigFormBase { /** * {@inheritdoc} diff --git a/templates/generator/tripal_extension_module/module.routing.yml.twig b/templates/generator/tripal_extension_module/module.routing.yml.twig index f4a30ff..47e937f 100644 --- a/templates/generator/tripal_extension_module/module.routing.yml.twig +++ b/templates/generator/tripal_extension_module/module.routing.yml.twig @@ -13,7 +13,7 @@ path: '/admin/config/system/{{ machine_name|u2h }}' defaults: _title: '{{ name }} settings' - _form: 'Drupal\{{ machine_name }}\Form\SettingsForm' + _form: 'Drupal\{{ machine_name }}\Form\{{ machine_name|camelize }}SettingsForm' requirements: {% if permissions %} _permission: 'administer {{ machine_name }}' From d9212fbe1bb587b6e06091c0edab3d482aee18da Mon Sep 17 00:00:00 2001 From: Ferrisx4 Date: Thu, 18 Jan 2024 13:00:25 -0500 Subject: [PATCH 08/14] Add a 'description' for the Example field This field actually does work, it just was not obvious that it requires a specific value --- .../generator/tripal_extension_module/SettingsForm.php.twig | 1 + 1 file changed, 1 insertion(+) diff --git a/templates/generator/tripal_extension_module/SettingsForm.php.twig b/templates/generator/tripal_extension_module/SettingsForm.php.twig index 007b3c3..0d76d6f 100644 --- a/templates/generator/tripal_extension_module/SettingsForm.php.twig +++ b/templates/generator/tripal_extension_module/SettingsForm.php.twig @@ -31,6 +31,7 @@ class {{ machine_name|camelize }}SettingsForm extends ConfigFormBase { $form['example'] = [ '#type' => 'textfield', '#title' => $this->t('Example'), + '#prefix' => $this->t('Please type the word "example".'), '#default_value' => $this->config('{{ machine_name }}.settings')->get('example'), ]; return parent::buildForm($form, $form_state); From 34c5bd10ec4d646e7eb950088bbe79d72b98e2cb Mon Sep 17 00:00:00 2001 From: Ferrisx4 Date: Thu, 18 Jan 2024 13:19:27 -0500 Subject: [PATCH 09/14] Use hyphen instead of underscore, follow convention --- README.md | 2 +- src/Drush/Generators/TripalExtensionModuleGenerator.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3140563..01f2dc8 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ The following commands are currently implemented: | tripal-chado:field-formatter | Generates a Chado Formatter to be used with an existing Chado Field. | | tripal-chado:field-type | Generates a Chado Field Type for developing fields which store their data in chado. | | tripal-chado:field-widget | Generates a Chado Field Widget to be used with an existing Chado Field. | -| tripal:extension_module | Generates a Tripal Extension module and its associated files. | +| tripal:extension-module | Generates a Tripal Extension module and its associated files. | #### Usage: diff --git a/src/Drush/Generators/TripalExtensionModuleGenerator.php b/src/Drush/Generators/TripalExtensionModuleGenerator.php index 2d08b88..b25de2e 100644 --- a/src/Drush/Generators/TripalExtensionModuleGenerator.php +++ b/src/Drush/Generators/TripalExtensionModuleGenerator.php @@ -14,7 +14,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; #[Generator( - name: 'tripal:extension_module', + name: 'tripal:extension-module', description: 'Generates a Tripal extension module', templatePath: __DIR__ . '/../../../templates/generator/tripal_extension_module', type: GeneratorType::MODULE, From f4dfa59a369b503f1d97916f153f31607a25e485 Mon Sep 17 00:00:00 2001 From: Lacey Sanderson Date: Mon, 29 Jan 2024 11:54:25 -0600 Subject: [PATCH 10/14] Ask machine name first so it's more clear that the name should be human readable. --- .../Generators/TripalExtensionModuleGenerator.php | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Drush/Generators/TripalExtensionModuleGenerator.php b/src/Drush/Generators/TripalExtensionModuleGenerator.php index b25de2e..3b44ff2 100644 --- a/src/Drush/Generators/TripalExtensionModuleGenerator.php +++ b/src/Drush/Generators/TripalExtensionModuleGenerator.php @@ -43,8 +43,8 @@ public static function create(ContainerInterface $container): self { protected function generate(array &$vars, AssetCollection $assets): void { $ir = $this->createInterviewer($vars); - $vars['name'] = $ir->askName(); $vars['machine_name'] = $ir->askMachineName(); + $vars['name'] = $ir->askName(); $vars['description'] = $ir->ask('Module description', 'Provides additional functionality for the site.', new Required()); $vars['package'] = $ir->ask('Package', 'Tripal Extension'); @@ -55,7 +55,6 @@ protected function generate(array &$vars, AssetCollection $assets): void { $vars['class_prefix'] = '{machine_name|camelize}'; - if ($ir->confirm('Would you like to create module file?', TRUE)) { $assets->addFile('{machine_name}/{machine_name}.module', 'module.module.twig'); } @@ -67,19 +66,19 @@ protected function generate(array &$vars, AssetCollection $assets): void { if ($ir->confirm('Would you like to create libraries.yml file?', TRUE)) { $assets->addFile('{machine_name}/{machine_name}.libraries.yml', 'module.libraries.yml.twig'); } - + if ($ir->confirm('Would you like to create permissions.yml file?', FALSE)) { $assets->addFile('{machine_name}/{machine_name}.permissions.yml', 'module.permissions.yml.twig'); $vars['permissions'] = TRUE; } - + // @todo Create an event subscriber? see https://github.com/Chi-teck/drupal-code-generator/blob/985d8343a143437050b89a36c0d20ff1fc10f8bf/src/Command/Module.php - + if ($vars['controller'] = $ir->confirm('Would you like to create a controller?', TRUE)) { $assets->addFile("{machine_name}/src/Controller/{class_prefix}Controller.php") ->template('ExampleController.php.twig'); } - + if ($vars['form'] = $ir->confirm('Would you like to create settings form?', TRUE)) { $assets->addFile('{machine_name}/src/Form/{machine_name|camelize}SettingsForm.php') ->template('SettingsForm.php.twig'); @@ -88,7 +87,7 @@ protected function generate(array &$vars, AssetCollection $assets): void { $assets->addFile('{machine_name}/{machine_name}.links.menu.yml') ->template('module.links.menu.twig'); } - + $assets->addFile('{machine_name}/{machine_name}.info.yml', 'module.info.yml.twig'); if ($vars['controller'] || $vars['form']) { @@ -141,4 +140,4 @@ private function buildDependencies(?string $dependencies_encoded): array { return $dependencies; } -} \ No newline at end of file +} From 24be04161561484c182518b24699337ed4fbe77b Mon Sep 17 00:00:00 2001 From: Lacey Sanderson Date: Mon, 29 Jan 2024 20:33:26 -0600 Subject: [PATCH 11/14] Update install twig with more help comments and comment out existing code samples. --- .../TripalExtensionModuleGenerator.php | 4 +- .../module.install.twig | 40 +++++++++++++++++-- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/Drush/Generators/TripalExtensionModuleGenerator.php b/src/Drush/Generators/TripalExtensionModuleGenerator.php index 3b44ff2..c451011 100644 --- a/src/Drush/Generators/TripalExtensionModuleGenerator.php +++ b/src/Drush/Generators/TripalExtensionModuleGenerator.php @@ -55,11 +55,11 @@ protected function generate(array &$vars, AssetCollection $assets): void { $vars['class_prefix'] = '{machine_name|camelize}'; - if ($ir->confirm('Would you like to create module file?', TRUE)) { + if ($ir->confirm('Would you like to create the module file?', TRUE)) { $assets->addFile('{machine_name}/{machine_name}.module', 'module.module.twig'); } - if ($ir->confirm('Would you like to create install file?', TRUE)) { + if ($ir->confirm('Would you like to create install file (install tasks + creating tables)?', FALSE)) { $assets->addFile('{machine_name}/{machine_name}.install', 'module.install.twig'); } diff --git a/templates/generator/tripal_extension_module/module.install.twig b/templates/generator/tripal_extension_module/module.install.twig index aea7c4e..3395aa6 100644 --- a/templates/generator/tripal_extension_module/module.install.twig +++ b/templates/generator/tripal_extension_module/module.install.twig @@ -7,22 +7,47 @@ /** * Implements hook_install(). + * + * Use this function for all tasks which need to be executed when this module + * is installed. We suggest submitting Tripal jobs to complete any longer tasks + * such as importing an ontology. */ function {{ machine_name }}_install() { - \Drupal::messenger()->addStatus(__FUNCTION__); + + // Uncomment the following code to add a Drupal status message + // showing when this function is called. + // \Drupal::messenger()->addStatus(__FUNCTION__); } /** * Implements hook_uninstall(). + * + * Use this method for all tasks which need to be executed when this module is + * uninstalled. We DO NOT suggest deleting any terms or data added to Chado + * by this module on uninstall. */ function {{ machine_name }}_uninstall() { - \Drupal::messenger()->addStatus(__FUNCTION__); + // Uncomment the following code to add a Drupal status message + // showing when this function is called. + // \Drupal::messenger()->addStatus(__FUNCTION__); } /** * Implements hook_schema(). + * + * Use the Drupal Schema API to define any database tables you want created + * in the DRUPAL Schema. Do Not use this to create Tripal/Chado Custom tables + * or Materialized Views. + * + * @see https://www.drupal.org/docs/7/api/schema-api/schema-reference */ function {{ machine_name }}_schema() { + $schema = []; + + // Uncomment the following code example to create the {{ machine_name }}_example + // table in the Drupal Schema. The {{ machine_name }}_example table has + // id, uid, status, type created, and data columns, where the primary key is the id. + /* @code-sample $schema['{{ machine_name }}_example'] = [ 'description' => 'Table description.', 'fields' => [ @@ -73,16 +98,25 @@ function {{ machine_name }}_schema() { 'status' => ['status'], ], ]; + */ return $schema; } /** * Implements hook_requirements(). + * + * Use this function to define specific requirements for your module. + * If the severity key is set to warning or error then your module will + * not be able to be installed. */ function {{ machine_name }}_requirements($phase) { $requirements = []; + // This example requirement is only run when checking requirements + // through the UI. It simply generates a random number between 1-100 + // and produces a warning if it's above 50. This should show up on the + // Drupal Report Status page. if ($phase == 'runtime') { $value = mt_rand(0, 100); $requirements['{{ machine_name }}_status'] = [ @@ -93,4 +127,4 @@ function {{ machine_name }}_requirements($phase) { } return $requirements; -} \ No newline at end of file +} From accc7a61871f60196f39bbdca9a79d161cc43d09 Mon Sep 17 00:00:00 2001 From: Lacey Sanderson Date: Mon, 4 Mar 2024 13:03:56 -0600 Subject: [PATCH 12/14] Remove libraries, controller and event subscriber after discussion with Sean. --- .../TripalExtensionModuleGenerator.php | 13 +--------- .../ExampleController.php.twig | 25 ------------------- .../module.libraries.yml.twig | 10 -------- .../module.services.yml.twig | 6 ----- 4 files changed, 1 insertion(+), 53 deletions(-) delete mode 100644 templates/generator/tripal_extension_module/ExampleController.php.twig delete mode 100644 templates/generator/tripal_extension_module/module.libraries.yml.twig delete mode 100644 templates/generator/tripal_extension_module/module.services.yml.twig diff --git a/src/Drush/Generators/TripalExtensionModuleGenerator.php b/src/Drush/Generators/TripalExtensionModuleGenerator.php index c451011..b94dd15 100644 --- a/src/Drush/Generators/TripalExtensionModuleGenerator.php +++ b/src/Drush/Generators/TripalExtensionModuleGenerator.php @@ -63,22 +63,11 @@ protected function generate(array &$vars, AssetCollection $assets): void { $assets->addFile('{machine_name}/{machine_name}.install', 'module.install.twig'); } - if ($ir->confirm('Would you like to create libraries.yml file?', TRUE)) { - $assets->addFile('{machine_name}/{machine_name}.libraries.yml', 'module.libraries.yml.twig'); - } - if ($ir->confirm('Would you like to create permissions.yml file?', FALSE)) { $assets->addFile('{machine_name}/{machine_name}.permissions.yml', 'module.permissions.yml.twig'); $vars['permissions'] = TRUE; } - // @todo Create an event subscriber? see https://github.com/Chi-teck/drupal-code-generator/blob/985d8343a143437050b89a36c0d20ff1fc10f8bf/src/Command/Module.php - - if ($vars['controller'] = $ir->confirm('Would you like to create a controller?', TRUE)) { - $assets->addFile("{machine_name}/src/Controller/{class_prefix}Controller.php") - ->template('ExampleController.php.twig'); - } - if ($vars['form'] = $ir->confirm('Would you like to create settings form?', TRUE)) { $assets->addFile('{machine_name}/src/Form/{machine_name|camelize}SettingsForm.php') ->template('SettingsForm.php.twig'); @@ -90,7 +79,7 @@ protected function generate(array &$vars, AssetCollection $assets): void { $assets->addFile('{machine_name}/{machine_name}.info.yml', 'module.info.yml.twig'); - if ($vars['controller'] || $vars['form']) { + if ($vars['form']) { $assets->addFile('{machine_name}/{machine_name}.routing.yml') ->template('module.routing.yml.twig'); } diff --git a/templates/generator/tripal_extension_module/ExampleController.php.twig b/templates/generator/tripal_extension_module/ExampleController.php.twig deleted file mode 100644 index 79efdb2..0000000 --- a/templates/generator/tripal_extension_module/ExampleController.php.twig +++ /dev/null @@ -1,25 +0,0 @@ - 'item', - '#markup' => $this->t('It works!'), - ]; - - return $build; - } - -} \ No newline at end of file diff --git a/templates/generator/tripal_extension_module/module.libraries.yml.twig b/templates/generator/tripal_extension_module/module.libraries.yml.twig deleted file mode 100644 index 8f6a04e..0000000 --- a/templates/generator/tripal_extension_module/module.libraries.yml.twig +++ /dev/null @@ -1,10 +0,0 @@ -# Custom module library for general purposes. -{{ machine_name }}: - js: - js/{{ machine_name|u2h }}.js: {} - css: - component: - css/{{ machine_name|u2h }}.css: {} - dependencies: - - core/drupalSettings - - {{ machine_name }}/jquery-labelauty diff --git a/templates/generator/tripal_extension_module/module.services.yml.twig b/templates/generator/tripal_extension_module/module.services.yml.twig deleted file mode 100644 index 1f930ad..0000000 --- a/templates/generator/tripal_extension_module/module.services.yml.twig +++ /dev/null @@ -1,6 +0,0 @@ -services: - {{ machine_name }}.event_subscriber: - class: Drupal\{{ machine_name }}\EventSubscriber\{{ class_prefix }}Subscriber - arguments: ['@messenger'] - tags: - - { name: event_subscriber } \ No newline at end of file From c0d89cc6c6c33694ffeb745422adce79a3314493 Mon Sep 17 00:00:00 2001 From: Lacey Sanderson Date: Mon, 4 Mar 2024 13:05:54 -0600 Subject: [PATCH 13/14] Remove mention of controller from routing template. --- .../tripal_extension_module/module.routing.yml.twig | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/templates/generator/tripal_extension_module/module.routing.yml.twig b/templates/generator/tripal_extension_module/module.routing.yml.twig index 47e937f..9048576 100644 --- a/templates/generator/tripal_extension_module/module.routing.yml.twig +++ b/templates/generator/tripal_extension_module/module.routing.yml.twig @@ -1,13 +1,3 @@ -{% if controller %} -{{ machine_name }}.example: - path: '/{{ machine_name|u2h }}/example' - defaults: - _title: 'Example' - _controller: '\Drupal\{{ machine_name }}\Controller\{{ class_prefix }}Controller::build' - requirements: - _permission: 'access content' - -{% endif %} {% if form %} {{ machine_name }}.settings_form: path: '/admin/config/system/{{ machine_name|u2h }}' @@ -21,4 +11,4 @@ {% if not permissions %} _permission: 'administer tripal' {% endif %} -{% endif %} \ No newline at end of file +{% endif %} From cef123d8dd42895935f36891f56966ed61182176 Mon Sep 17 00:00:00 2001 From: Lacey Sanderson Date: Mon, 4 Mar 2024 13:56:11 -0600 Subject: [PATCH 14/14] Add some messages to make it clear how to test config form. --- .../tripal_extension_module/SettingsForm.php.twig | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/templates/generator/tripal_extension_module/SettingsForm.php.twig b/templates/generator/tripal_extension_module/SettingsForm.php.twig index 0d76d6f..8cf59a7 100644 --- a/templates/generator/tripal_extension_module/SettingsForm.php.twig +++ b/templates/generator/tripal_extension_module/SettingsForm.php.twig @@ -31,7 +31,7 @@ class {{ machine_name|camelize }}SettingsForm extends ConfigFormBase { $form['example'] = [ '#type' => 'textfield', '#title' => $this->t('Example'), - '#prefix' => $this->t('Please type the word "example".'), + '#description' => $this->t('Please type the word "example".'), '#default_value' => $this->config('{{ machine_name }}.settings')->get('example'), ]; return parent::buildForm($form, $form_state); @@ -42,7 +42,7 @@ class {{ machine_name|camelize }}SettingsForm extends ConfigFormBase { */ public function validateForm(array &$form, FormStateInterface $form_state) { if ($form_state->getValue('example') != 'example') { - $form_state->setErrorByName('example', $this->t('The value is not correct.')); + $form_state->setErrorByName('example', $this->t('The value is not correct. Instead enter "example" to get validation to pass.')); } parent::validateForm($form, $form_state); } @@ -51,10 +51,14 @@ class {{ machine_name|camelize }}SettingsForm extends ConfigFormBase { * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { + + $value = $form_state->getValue('example'); $this->config('{{ machine_name }}.settings') - ->set('example', $form_state->getValue('example')) + ->set('example', $value) ->save(); + $this->messenger()->addStatus("Setting the value of {{ machine_name }}.settings.example to $value."); + parent::submitForm($form, $form_state); } -} \ No newline at end of file +}