Skip to content
Snippets Groups Projects
Commit cbf72104 authored by Bohdan Melnychuk's avatar Bohdan Melnychuk Committed by Scott Euser
Browse files

Issue #3365584 by bobi-mel, scott_euser: Add the ability to set a machine name for "settings_group"

parent 1cdeac9f
No related branches found
No related tags found
1 merge request!10Issue #3365584: Add the ability to set a machine name for "settings_group"
Pipeline #93597 passed
Showing
with 563 additions and 149 deletions
......@@ -95,7 +95,7 @@ Access a non-repeating variable with multiple fields and complex field settings:
Access a repeating variable with one field like so:
`{% for site_setting in site_settings.your_settings_group.your_setting_name %}
{{ site_setting }}
{{ site_setting }}
{% endfor %}`
#### Configuration
......@@ -117,7 +117,7 @@ or
/** @var \Drupal\site_settings\SiteSettingsLoaderPluginManager $plugin_manager */
$plugin_manager = \Drupal::service('plugin.manager.site_settings_loader');
$site_settings = $plugin_manager->getActiveLoaderPlugin();
$settings = $site_settings->loadByFieldset('your_settings_group');
$settings = $site_settings->loadByGroup('your_settings_group');
```
## How to access the settings via the token browser
......@@ -143,4 +143,4 @@ Initial development of this module was sponsored by Fat Beehive until mid-2018.
## Maintainers
- Scott Euser (scott_euser) - <https://www.drupal.org/u/scott_euser>
- Scott Euser (scott_euser) - <https://www.drupal.org/u/scott_euser>
\ No newline at end of file
uuid: null
langcode: en
status: true
dependencies:
......@@ -79,7 +80,7 @@ display:
thousand_separator: ''
prefix_suffix: true
group_column: value
group_columns: { }
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
......@@ -88,17 +89,17 @@ display:
multi_type: separator
separator: ', '
field_api_classes: false
fieldset:
id: fieldset
group:
id: group
table: site_setting_entity_field_data
field: fieldset
field: group
relationship: none
group_type: group
admin_label: ''
entity_type: site_setting_entity
entity_field: fieldset
entity_field: group
plugin_id: field
label: Fieldset
label: Group
exclude: false
alter:
alter_text: false
......@@ -131,7 +132,7 @@ display:
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: false
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
......@@ -139,11 +140,11 @@ display:
hide_empty: false
empty_zero: false
hide_alter_empty: true
click_sort_column: value
type: string
click_sort_column: target_id
type: entity_reference_label
settings:
link_to_entity: false
group_column: value
link: true
group_column: target_id
group_columns: { }
group_rows: true
delta_limit: 0
......@@ -360,15 +361,15 @@ display:
options: { }
empty: { }
sorts:
fieldset:
id: fieldset
group:
id: group
table: site_setting_entity_field_data
field: fieldset
field: group
relationship: none
group_type: group
admin_label: ''
entity_type: site_setting_entity
entity_field: fieldset
entity_field: group
plugin_id: standard
order: ASC
expose:
......@@ -393,29 +394,29 @@ display:
granularity: second
arguments: { }
filters:
fieldset:
id: fieldset
group:
id: group
table: site_setting_entity_field_data
field: fieldset
field: group
relationship: none
group_type: group
admin_label: ''
entity_type: site_setting_entity
entity_field: fieldset
entity_field: group
plugin_id: string
operator: contains
value: ''
group: 1
exposed: true
expose:
operator_id: fieldset_op
label: Fieldset
operator_id: group_op
label: Group
description: ''
use_operator: false
operator: fieldset_op
operator: group_op
operator_limit_selection: false
operator_list: { }
identifier: fieldset
identifier: group
required: false
remember: false
multiple: false
......@@ -444,12 +445,12 @@ display:
row_class: ''
default_row_class: true
columns:
fieldset: fieldset
group: group
description: description
rendered_entity: rendered_entity
default: fieldset
default: group
info:
fieldset:
group:
sortable: true
default_sort_order: asc
align: ''
......
......@@ -8,9 +8,9 @@ site_settings.site_setting_entity_type.*:
label:
type: label
label: 'Label'
fieldset:
group:
type: string
label: 'Fieldset'
label: 'Group'
multiple:
type: boolean
label: 'Multiple'
site_settings.site_setting_group_entity_type.*:
type: config_entity
label: 'Site Setting group type config'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
......@@ -59,7 +59,7 @@ class SiteSettingTypePermissionsUiTest extends BrowserTestBase {
// Open the site settings list page.
$this->drupalGet('admin/content/site-settings');
// Make sure the fieldsets match.
// Make sure the groups match.
$this->assertSession()->responseContains('Other');
$this->assertSession()->responseNotContains('Images');
......@@ -87,7 +87,7 @@ class SiteSettingTypePermissionsUiTest extends BrowserTestBase {
// Open the site settings list page.
$this->drupalGet('admin/content/site-settings');
// Make sure the fieldsets match.
// Make sure the groups match.
$this->assertSession()->responseContains('Other');
$this->assertSession()->responseNotContains('Images');
......
......@@ -6,6 +6,9 @@
*/
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Language\LanguageInterface;
use Drupal\Core\Utility\UpdateException;
use Symfony\Component\Yaml\Yaml;
/**
......@@ -129,7 +132,7 @@ function site_settings_update_8004() {
'langcode' => $item->langcode,
'user_id' => $item->user_id,
'name' => $item->name,
'fieldset' => $item->fieldset,
'group' => $item->group,
'status' => $item->status,
'created' => $item->created,
'changed' => $item->changed,
......@@ -143,7 +146,7 @@ function site_settings_update_8004() {
// Remove base table fields that are no longer needed.
$schema = \Drupal::database()->schema();
$drop_fields = ['name', 'fieldset', 'status', 'created', 'changed'];
$drop_fields = ['name', 'group', 'status', 'created', 'changed'];
foreach ($drop_fields as $drop_field) {
$schema->dropField('site_setting_entity', $drop_field);
}
......@@ -246,3 +249,174 @@ function site_settings_update_10005(&$sandbox) {
->save(TRUE);
}
}
/**
* Convert fieldset string to group with machine name.
*/
function site_settings_update_10006(&$sandbox) {
$update_manager = \Drupal::entityDefinitionUpdateManager();
$entity_type_manager = \Drupal::entityTypeManager();
// Install the group entity type.
try {
$entity_type_manager->clearCachedDefinitions();
$entity_type = $entity_type_manager->getDefinition('site_setting_group_entity_type');
$update_manager->installEntityType($entity_type);
$update_manager->updateEntityType($update_manager->getEntityType('site_setting_group_entity_type'));
}
catch (\Exception $exception) {
throw new UpdateException($exception->getMessage());
}
// Adds a new Group field to the Site Settings entity.
$field_storage_definition = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Group'))
->setDescription(t('The Site Setting Group type.'))
->setSetting('target_type', 'site_setting_group_entity_type')
->setDisplayOptions('view', [
'label' => 'hidden',
'type' => 'author',
'weight' => 0,
])
->setDisplayOptions('form', [
'type' => 'entity_reference_autocomplete',
'weight' => 5,
'settings' => [
'match_operator' => 'CONTAINS',
'size' => '60',
'autocomplete_type' => 'tags',
'placeholder' => '',
],
])
->setRequired(TRUE)
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$update_manager->installFieldStorageDefinition('group', 'site_setting_entity', 'site_setting_entity', $field_storage_definition);
// Generates new Site Settings Group entities.
$site_settings_group = $entity_type_manager->getStorage('site_setting_group_entity_type');
$groups_enties = $site_settings_group->loadMultiple();
$site_settings = $entity_type_manager->getStorage('site_setting_entity')
->loadMultiple();
// Converts index array to associative array to correct check
// if Site Settings group entity on unique.
$groups = [];
foreach ($groups_enties as $entity) {
if (!isset($groups[$entity->id()])) {
$groups[$entity->id()] = $entity;
}
}
// Removed the Fieldset field if still exists as it is no longer applicable.
$update_manager = \Drupal::entityDefinitionUpdateManager();
$definition = $update_manager->getFieldStorageDefinition('fieldset', 'site_setting_entity');
if ($definition instanceof FieldStorageDefinitionInterface) {
$update_manager->uninstallFieldStorageDefinition($definition);
}
/** @var \Drupal\Component\Transliteration\TransliterationInterface $transliteration */
$transliteration = \Drupal::service('transliteration');
foreach ($site_settings as $site_setting) {
// In case of failures, if fieldset is already moved, skip row.
if (empty($site_setting->fieldset)) {
continue;
}
$fieldset = reset($site_setting->fieldset);
$new_value = $transliteration->transliterate($fieldset, LanguageInterface::LANGCODE_DEFAULT, '_');
$new_value = strtolower($new_value);
$new_value = preg_replace('/[^a-z0-9_]+/', '_', $new_value);
$generated_id = preg_replace('/_+/', '_', $new_value);
// Checks availability the SS Group Entity with generated id.
// Creates if it does not exist.
if (isset($groups[$generated_id])) {
$group = $groups[$generated_id];
}
else {
$new_group = $site_settings_group->create([
'id' => $generated_id,
'label' => $fieldset,
'description' => '',
]);
$new_group->save();
$group = $new_group;
$groups[$new_group->id()] = $new_group;
}
// Updates the Site Settings Type Entity.
$ref_entities = $site_setting->referencedEntities();
foreach ($ref_entities as $ref_entity) {
if ($ref_entity->bundle() == 'site_setting_entity_type') {
/** @var \Drupal\site_settings\SiteSettingEntityTypeInterface $ref_entity */
if (!$ref_entity->get('group')) {
$ref_entity->set('group', $group->id());
$ref_entity->save();
}
break;
}
}
// Updates the Site Settings Entity.
$site_setting->set('group', $group->id());
$site_setting->save();
}
// If we have site setting types not yet created, these
// need updates too.
$connection = \Drupal::service('database');
$bundles = $entity_type_manager->getStorage('site_setting_entity_type')->loadMultiple();
$query = $connection->select('site_setting_entity', 'sse');
$query->addField('sse', 'type');
$used_bundles = $query->distinct()->execute()->fetchCol();
$used_bundles = $used_bundles ?: [];
$missing_bundles = array_diff(array_keys($bundles), $used_bundles);
if ($missing_bundles) {
foreach ($missing_bundles as $missing) {
$site_setting_type = $bundles[$missing];
$fieldset = $site_setting_type->fieldset;
$new_value = $transliteration->transliterate($fieldset, LanguageInterface::LANGCODE_DEFAULT, '_');
$new_value = strtolower($new_value);
$new_value = preg_replace('/[^a-z0-9_]+/', '_', $new_value);
$generated_id = preg_replace('/_+/', '_', $new_value);
// Checks availability the SS Group Entity with generated id.
// Creates if it does not exist.
if (isset($groups[$generated_id])) {
$group = $groups[$generated_id];
}
else {
$new_group = $site_settings_group->create([
'id' => $generated_id,
'label' => $fieldset,
'description' => '',
]);
$new_group->save();
$group = $new_group;
$groups[$new_group->id()] = $new_group;
}
$site_setting_type->set('group', $group->id());
$site_setting_type->save();
}
}
}
/**
* Re-install view.
*/
function site_settings_update_10007(&$sandbox) {
$config_id = 'views.view.site_settings';
$site_settings_path = \Drupal::service('extension.list.module')->getPath('site_settings');
$config_factory = \Drupal::configFactory();
$config_path = $site_settings_path . '/config/install/' . $config_id . '.yml';
$data = Yaml::parseFile($config_path);
$config_factory->getEditable($config_id)
->setData($data)
->save(TRUE);
}
......@@ -6,4 +6,8 @@ entity.site_setting_entity_type.add_form:
title: 'Add Site Setting type'
appears_on:
- entity.site_setting_entity_type.collection
site_settings_group_entity.type_add:
title: 'Add site settings group entity type'
route_name: entity.site_setting_group_entity_type.add_form
appears_on:
- entity.site_setting_group_entity_type.collection
......@@ -8,3 +8,14 @@ entity.site_setting_entity.delete_form:
group: site_settings
title: Delete
weight: 10
entity.site_settings_group_entity.edit_form:
route_name: entity.site_settings_group_entity.edit_form
group: site_settings_group_entity
title: 'Edit'
entity.site_settings_group_entity.delete_form:
route_name: entity.site_settings_group_entity.delete_form
group: site_settings_group_entity
title: 'Delete'
weight: 10
......@@ -13,3 +13,10 @@ site_settings.site_settings_config_form:
description: 'Configure how Site Settings behaves'
parent: system.admin_config_system
weight: 99
# Site Setting groups menu items definition
entity.site_setting_group_entity_type.collection:
title: 'Manage Site Settings Group'
description: 'Manage Site Settings Group entities.'
parent: entity.site_setting_entity_type.collection
route_name: entity.site_setting_group_entity_type.collection
......@@ -13,4 +13,14 @@ entity.site_setting_entity.delete_form:
site_settings.admin:
title: Site Settings
route_name: entity.site_setting_entity.collection
base_route: system.admin_content
\ No newline at end of file
base_route: system.admin_content
entity.site_setting_group_entity_type.edit_form:
title: 'Edit'
route_name: entity.site_setting_group_entity_type.edit_form
base_route: entity.site_setting_group_entity_type.edit_form
entity.site_setting_group_entity_type.collection:
title: 'List'
route_name: entity.site_setting_group_entity_type.collection
base_route: entity.site_setting_group_entity_type.collection
......@@ -73,7 +73,7 @@ function site_settings_preprocess(&$variables): void {
/** @var \Drupal\site_settings\SiteSettingsLoaderPluginManager $plugin_manager */
$plugin_manager = \Drupal::service('plugin.manager.site_settings_loader');
$loader = $plugin_manager->getActiveLoaderPlugin();
if ($loader->allowAutoload()) {
if ($loader && $loader->allowAutoload()) {
// Load the site settings into the specified key.
$template_key = $config->get('template_key');
......
......@@ -26,3 +26,11 @@ site_settings.site_setting_replicate_form:
setting: ^[a-zA-Z0-9_]+
options:
_admin_route: TRUE
entity.site_setting_group.settings:
path: 'admin/structure/site-setting-group'
defaults:
_form: '\Drupal\site_setting\Form\SiteSettingGroupSettingsForm'
_title: 'Site setting group'
requirements:
_permission: 'administer site_setting_group'
......@@ -27,9 +27,9 @@ function site_settings_token_info(): array {
$settings = $site_settings_loader->loadAll();
if ($settings) {
foreach ($settings as $fieldset => $fieldtypes) {
foreach ($settings as $group => $fieldtypes) {
foreach ($fieldtypes as $fieldtype => $values) {
$site_settings = _site_settings_build_token($site_settings, $fieldset, $fieldtype, $values);
$site_settings = _site_settings_build_token($site_settings, $group, $fieldtype, $values);
}
}
}
......@@ -51,8 +51,8 @@ function site_settings_token_info(): array {
*
* @param array $site_settings
* The site settings.
* @param string $fieldset
* The fieldset.
* @param string $group
* The group.
* @param string $fieldtype
* The field type.
* @param mixed $values
......@@ -63,13 +63,13 @@ function site_settings_token_info(): array {
* @return array
* The array of tokens.
*/
function _site_settings_build_token(array $site_settings, string $fieldset, string $fieldtype, mixed $values, bool|string $suffix = FALSE): array {
function _site_settings_build_token(array $site_settings, string $group, string $fieldtype, mixed $values, bool|string $suffix = FALSE): array {
if (is_array($values)) {
// Recursively get all values.
foreach ($values as $key => $values) {
$this_suffix = ($suffix !== FALSE ? $suffix . '-' : '') . $key;
$site_settings = _site_settings_build_token($site_settings, $fieldset, $fieldtype, $values, $this_suffix);
$site_settings = _site_settings_build_token($site_settings, $group, $fieldtype, $values, $this_suffix);
}
}
......@@ -77,20 +77,20 @@ function _site_settings_build_token(array $site_settings, string $fieldset, stri
// Set description based on whether flat or array of data.
if ($suffix !== FALSE) {
$description = t('One of the values of "@type" within "@fieldset"', [
$description = t('One of the values of "@type" within "@group"', [
'@type' => $fieldtype,
'@fieldset' => $fieldset,
'@group' => $group,
]);
}
else {
$description = t('The value of "@type" within "@fieldset"', [
$description = t('The value of "@type" within "@group"', [
'@type' => $fieldtype,
'@fieldset' => $fieldset,
'@group' => $group,
]);
}
// Store each value or subvalue as a token option.
$key = $fieldset . '--' . $fieldtype . ($suffix !== FALSE ? '--' . $suffix : '');
$key = $group . '--' . $fieldtype . ($suffix !== FALSE ? '--' . $suffix : '');
$label = _site_settings_token_label($key);
$site_settings[$key] = [
'name' => t("@label", ['@label' => $label]),
......@@ -126,7 +126,7 @@ function site_settings_tokens($type, $tokens, array $data, array $options, Bubbl
// Break apart name.
$name_parts = explode('--', $name);
$fieldset = $name_parts[0];
$group = $name_parts[0];
$type = $name_parts[1] ?? NULL;
// We may be deep into a multidimensional array.
......@@ -136,16 +136,16 @@ function site_settings_tokens($type, $tokens, array $data, array $options, Bubbl
// need to navigate down.
$additional_depth = $name_parts[2];
$keys = explode('-', $additional_depth);
if (isset($settings[$fieldset][$type])) {
$setting = $settings[$fieldset][$type];
if (isset($settings[$group][$type])) {
$setting = $settings[$group][$type];
$value = _site_settings_retrieve_deep_value($setting, $keys);
$replacements[$original] = $value;
}
}
elseif (isset($settings[$fieldset][$type])) {
elseif (isset($settings[$group][$type])) {
// Flat setting value.
$value = $settings[$fieldset][$type];
$value = $settings[$group][$type];
}
// No setting value found.
......
......@@ -51,7 +51,7 @@ use Drupal\user\UserInterface;
* "label" = "name",
* "uuid" = "uuid",
* "uid" = "user_id",
* "fieldset" = "fieldset",
* "group" = "group",
* "langcode" = "langcode",
* "published" = "status",
* },
......@@ -120,15 +120,15 @@ class SiteSettingEntity extends EditorialContentEntityBase implements SiteSettin
/**
* {@inheritdoc}
*/
public function getFieldset(): string {
return $this->get('fieldset')->value;
public function getGroup(): string {
return $this->get('group')->value;
}
/**
* {@inheritdoc}
*/
public function setFieldset($fieldset): SiteSettingEntityInterface {
$this->set('fieldset', $fieldset);
public function setGroup($group): SiteSettingEntityInterface {
$this->set('group', $group);
return $this;
}
......@@ -261,23 +261,25 @@ class SiteSettingEntity extends EditorialContentEntityBase implements SiteSettin
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['fieldset'] = BaseFieldDefinition::create('string')
->setLabel(t('Fieldset'))
->setDescription(t('The fieldset of the Site Setting entity.'))
->setSettings([
'max_length' => 50,
'text_processing' => 0,
])
->setDefaultValueCallback(static::class . '::getDefaultFieldset')
$fields['group'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Group'))
->setDescription(t('The Site Setting Group type.'))
->setSetting('target_type', 'site_setting_group_entity_type')
->setRevisionable(TRUE)
->setDisplayOptions('view', [
'label' => 'above',
'type' => 'string',
'weight' => -4,
'label' => 'hidden',
'type' => 'author',
'weight' => 0,
])
->setDisplayOptions('form', [
'type' => 'string_textfield',
'weight' => -4,
'type' => 'entity_reference_autocomplete',
'weight' => 5,
'settings' => [
'match_operator' => 'CONTAINS',
'size' => '60',
'autocomplete_type' => 'tags',
'placeholder' => '',
],
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
......@@ -334,18 +336,4 @@ class SiteSettingEntity extends EditorialContentEntityBase implements SiteSettin
return [\Drupal::currentUser()->id()];
}
/**
* Default value callback for 'fieldset' base field definition.
*
* @param \Drupal\site_settings\Entity\SiteSettingEntity $entity
* The site setting entity.
*
* @return array
* An array of default values.
*/
public static function getDefaultFieldset(SiteSettingEntity $entity): array {
$site_settings_entity_type = SiteSettingEntityType::load($entity->getType());
return [$site_settings_entity_type->get('fieldset')];
}
}
......@@ -26,7 +26,7 @@ use Drupal\site_settings\SiteSettingEntityTypeInterface;
* config_export = {
* "id",
* "label",
* "fieldset",
* "group",
* "multiple",
* },
* admin_permission = "administer site configuration",
......@@ -34,7 +34,7 @@ use Drupal\site_settings\SiteSettingEntityTypeInterface;
* entity_keys = {
* "id" = "id",
* "label" = "label",
* "fieldset" = "fieldset",
* "group" = "group",
* "multiple" = "multiple",
* "uuid" = "uuid"
* },
......@@ -63,11 +63,11 @@ class SiteSettingEntityType extends ConfigEntityBundleBase implements SiteSettin
protected $label;
/**
* The Site Setting type fieldset.
* The Site Setting type group.
*
* @var string
*/
public $fieldset;
public $group;
/**
* The Site Setting type multiple.
......@@ -76,4 +76,15 @@ class SiteSettingEntityType extends ConfigEntityBundleBase implements SiteSettin
*/
public $multiple;
/**
* {@inheritDoc}
*/
public function calculateDependencies() {
parent::calculateDependencies();
if (!empty($this->group)) {
$this->addDependency('config', 'site_settings.site_setting_group_entity_type.' . $this->group);
}
return $this;
}
}
<?php
namespace Drupal\site_settings\Entity;
use Drupal\Core\Config\Entity\ConfigEntityBase;
use Drupal\site_settings\SiteSettingGroupEntityTypeInterface;
/**
* Defines the Site Settings Group Entity type configuration entity.
*
* @ConfigEntityType(
* id = "site_setting_group_entity_type",
* label = @Translation("Site Setting Group Entity type"),
* label_collection = @Translation("Site Setting Group Entity types"),
* label_singular = @Translation("Site setting group entity type"),
* label_plural = @Translation("Site setting group entities types"),
* label_count = @PluralTranslation(
* singular = "@count site setting group entities type",
* plural = "@count site setting group entities types",
* ),
* handlers = {
* "form" = {
* "add" = "Drupal\site_settings\Form\SiteSettingGroupEntityTypeForm",
* "edit" = "Drupal\site_settings\Form\SiteSettingGroupEntityTypeForm",
* "delete" = "Drupal\Core\Entity\EntityDeleteForm",
* },
* "list_builder" = "Drupal\site_settings\SiteSettingGroupEntityTypeListBuilder",
* "access" = "Drupal\site_settings\SiteSettingGroupEntityTypeAccessControlHandler",
* "route_provider" = {
* "html" = "Drupal\Core\Entity\Routing\AdminHtmlRouteProvider",
* },
* },
* admin_permission = "access site settings overview",
* config_prefix = "site_setting_group_entity_type",
* entity_keys = {
* "id" = "id",
* "label" = "label",
* "uuid" = "uuid",
* },
* links = {
* "add-form" = "/admin/structure/site_setting_group_entity_types/add",
* "edit-form" = "/admin/structure/site_setting_group_entity_types/manage/{site_setting_group_entity_type}",
* "delete-form" = "/admin/structure/site_setting_group_entity_types/manage/{site_setting_group_entity_type}/delete",
* "collection" = "/admin/structure/site_setting_group_entity_types",
* },
* config_export = {
* "id",
* "label",
* "uuid",
* },
* )
*/
class SiteSettingGroupEntityType extends ConfigEntityBase implements SiteSettingGroupEntityTypeInterface {
/**
* The machine name of this site settings group entity type.
*/
protected string $id;
/**
* The human-readable name of the site settings group entity type.
*/
protected string $label;
}
......@@ -73,14 +73,16 @@ class SiteSettingEntityForm extends ContentEntityForm {
'#weight' => -100,
];
// Set entity title and fieldset to match the bundle.
// Set entity title and group to match the bundle.
$form['name']['widget'][0]['value']['#value'] = $site_settings_entity_type->get('label');
$form['fieldset']['widget'][0]['value']['#value'] = $site_settings_entity_type->get('fieldset');
$groupId = $site_settings_entity_type->get('group');
$group = $this->entityRepository->getActive('site_setting_group_entity_type', $groupId);
$form['group']['widget'][0]['target_id']['#value'] = $group->label();
// Hide fields.
hide($form['name']);
hide($form['user_id']);
hide($form['fieldset']);
$form['group']['#disabled'] = TRUE;
if (isset($form['multiple'])) {
hide($form['multiple']);
}
......
......@@ -2,9 +2,12 @@
namespace Drupal\site_settings\Form;
use Drupal\Component\Transliteration\TransliterationInterface;
use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Language\LanguageInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\site_settings\SiteSettingsLoaderPluginManager;
use Symfony\Component\DependencyInjection\ContainerInterface;
......@@ -22,6 +25,20 @@ class SiteSettingEntityTypeForm extends EntityForm {
*/
protected $pluginManager;
/**
* The transliteration service.
*
* @var \Drupal\Component\Transliteration\TransliterationInterface
*/
protected TransliterationInterface $transliteration;
/**
* Drupal\Core\Language\LanguageManagerInterface definition.
*
* @var \Drupal\Core\Language\LanguageManagerInterface
*/
protected LanguageManagerInterface $language;
/**
* Constructs a ContentEntityForm object.
*
......@@ -29,13 +46,17 @@ class SiteSettingEntityTypeForm extends EntityForm {
* The site settings loader plugin manager.
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler service.
* @param \Drupal\Component\Transliteration\TransliterationInterface $transliteration
* The transliteration service.
*/
public function __construct(
SiteSettingsLoaderPluginManager $plugin_manager,
ModuleHandlerInterface $module_handler
ModuleHandlerInterface $module_handler,
TransliterationInterface $transliteration,
) {
$this->pluginManager = $plugin_manager;
$this->moduleHandler = $module_handler;
$this->transliteration = $transliteration;
}
/**
......@@ -44,7 +65,8 @@ class SiteSettingEntityTypeForm extends EntityForm {
public static function create(ContainerInterface $container) {
return new static(
$container->get('plugin.manager.site_settings_loader'),
$container->get('module_handler')
$container->get('module_handler'),
$container->get('transliteration')
);
}
......@@ -65,42 +87,56 @@ class SiteSettingEntityTypeForm extends EntityForm {
'#required' => TRUE,
];
$fieldsets = $this->getFieldsets($site_setting_entity_type);
if ($fieldsets) {
array_unshift($fieldsets, $this->getCreateNewLabel());
$form['existing_fieldset'] = [
// Gets chosen group for the current Site Settings Entity.
$group = $site_setting_entity_type->get('group') ?? NULL;
// Gets all created Site Settings Groups.
$groups = $this->getGroups();
if ($groups) {
// Add create new group to the beginning of the options.
$groups = [$this->getCreateGroup() => $this->getCreateGroup()] + $groups;
// Select from existing groups.
$form['existing_group'] = [
'#type' => 'select',
'#title' => $this->t('Choose existing "Fieldset Legend" label'),
'#options' => array_combine($fieldsets, $fieldsets),
'#default_value' => $site_setting_entity_type->fieldset,
'#description' => $this->t("The fieldset to group this particular setting in."),
'#title' => $this->t('Choose existing "Group" label'),
'#options' => $groups,
'#default_value' => $group,
'#description' => $this->t("The group this particular setting is in."),
'#required' => TRUE,
'#empty_option' => '-- select one --',
'#empty_value' => '',
];
}
$form['new_fieldset'] = [
'#type' => 'textfield',
'#title' => $this->t('Create a new "Fieldset Legend" label'),
$form['new_group'] = [
'#type' => 'entity_autocomplete',
'#target_type' => 'site_setting_group_entity_type',
'#title' => $this->t('Create a new "Group" label'),
'#maxlength' => 255,
'#default_value' => $site_setting_entity_type->fieldset,
'#description' => $this->t("A new fieldset to group this particular setting in."),
'#selection_handler' => 'default',
'#description' => $this->t("Create a new group for this site setting."),
'#required' => FALSE,
'#autocreate' => [
'bundle' => 'site_setting_group_entity_type',
'uid' => $this->currentUser()->id(),
],
];
if ($fieldsets) {
$form['new_fieldset']['#states'] = [
if ($groups) {
$form['new_group']['#states'] = [
'visible' => [
':input[name="existing_fieldset"]' => ['value' => '-- create new fieldset --'],
':input[name="existing_group"]' => ['value' => '-- create new group --'],
],
'required' => [
':input[name="existing_fieldset"]' => ['value' => '-- create new fieldset --'],
':input[name="existing_group"]' => ['value' => '-- create new group --'],
],
];
}
$form['fieldset'] = [
$form['group'] = [
'#type' => 'hidden',
'#default_value' => $site_setting_entity_type->fieldset,
'#default_value' => $site_setting_entity_type->group,
];
$form['multiple'] = [
......@@ -128,46 +164,33 @@ class SiteSettingEntityTypeForm extends EntityForm {
}
/**
* Get the create new label. This is reused.
* Get the create new group. This is reused.
*
* @return string
* The label for the create new option.
*/
private function getCreateNewLabel(): string {
return $this->t('-- create new fieldset --');
private function getCreateGroup(): string {
return $this->t('-- create new group --');
}
/**
* Get a list of fieldsets that already exist.
*
* @param object $entity_type
* The site settings entity type object.
* Get a list of groups that already exist.
*
* @return array
* The fieldsets.
* The groups.
*/
private function getFieldsets($entity_type): array {
$fieldsets = [];
if ($bundles = $entity_type->loadMultiple()) {
private function getGroups(): array {
$groups = [];
$bundles = $this->entityTypeManager
->getStorage('site_setting_group_entity_type')
->loadMultiple();
if ($bundles) {
foreach ($bundles as $bundle) {
$fieldsets[] = $bundle->fieldset;
$groups[$bundle->id()] = $bundle->label();
}
}
return array_unique($fieldsets);
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state): void {
parent::validateForm($form, $form_state);
$values = $form_state->getValues();
if (!isset($values['existing_fieldset']) || $values['existing_fieldset'] == $this->getCreateNewLabel()) {
if (empty($values['new_fieldset'])) {
$form_state->setErrorByName('new_fieldset', $this->t('Please enter a fieldset name.'));
}
}
return $groups;
}
/**
......@@ -175,11 +198,20 @@ class SiteSettingEntityTypeForm extends EntityForm {
*/
public function save(array $form, FormStateInterface $form_state): void {
$values = $form_state->getValues();
if (!isset($values['existing_fieldset']) || $values['existing_fieldset'] == $this->getCreateNewLabel()) {
$this->entity->fieldset = $values['new_fieldset'];
if (!isset($values['existing_group']) || $values['existing_group'] == $this->getCreateGroup()) {
/** @var \Drupal\site_settings\SiteSettingGroupEntityTypeInterface $new_group */
$new_group = reset($values['new_group']);
$new_group->set('id', $this->generateMachineName($new_group->label()));
$new_group->set('description', '');
if ($new_group->isNew()) {
$new_group->save();
}
$this->entity->group = $new_group->id();
}
else {
$this->entity->fieldset = $values['existing_fieldset'];
$this->entity->group = $values['existing_group'];
}
$this->entity->multiple = $values['multiple'];
......@@ -215,4 +247,20 @@ class SiteSettingEntityTypeForm extends EntityForm {
$form_state->setRedirect($route_name, $route_parameters);
}
/**
* Generates the human-readable machine name.
*
* @param string $value
* The value to be transformed.
*
* @return string
* Generated machine name.
*/
private function generateMachineName(string $value): string {
$new_value = $this->transliteration->transliterate($value, LanguageInterface::LANGCODE_DEFAULT, '_');
$new_value = strtolower($new_value);
$new_value = preg_replace('/[^a-z0-9_]+/', '_', $new_value);
return preg_replace('/_+/', '_', $new_value);
}
}
<?php
namespace Drupal\site_settings\Form;
use Drupal\Core\Entity\BundleEntityFormBase;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\site_settings\Entity\SiteSettingGroupEntityType;
/**
* Form handler for site settings group entity type forms.
*/
class SiteSettingGroupEntityTypeForm extends BundleEntityFormBase {
/**
* {@inheritdoc}
*/
public function form(array $form, FormStateInterface $form_state): array {
$form = parent::form($form, $form_state);
if ($this->operation === 'edit') {
$form['#title'] = $this->t('Edit %label site settings group entity type', ['%label' => $this->entity->label()]);
}
$form['label'] = [
'#title' => $this->t('Label'),
'#type' => 'textfield',
'#default_value' => $this->entity->label(),
'#description' => $this->t('The human-readable name of this site settings group entity type.'),
'#required' => TRUE,
];
$form['id'] = [
'#type' => 'machine_name',
'#default_value' => $this->entity->id(),
'#maxlength' => EntityTypeInterface::BUNDLE_MAX_LENGTH,
'#machine_name' => [
'exists' => [SiteSettingGroupEntityType::class, 'load'],
'source' => ['label'],
],
'#description' => $this->t('A unique machine-readable name for this site settings group entity type. It must only contain lowercase letters, numbers, and underscores.'),
];
return $this->protectBundleIdElement($form);
}
/**
* {@inheritdoc}
*/
protected function actions(array $form, FormStateInterface $form_state): array {
$actions = parent::actions($form, $form_state);
$actions['submit']['#value'] = $this->t('Save site settings group entity type');
$actions['delete']['#value'] = $this->t('Delete site settings group entity type');
return $actions;
}
/**
* {@inheritdoc}
*/
public function save(array $form, FormStateInterface $form_state): int {
$result = parent::save($form, $form_state);
$message_args = ['%label' => $this->entity->label()];
$this->messenger()->addStatus(
match($result) {
SAVED_NEW => $this->t('The site settings group entity type %label has been added.', $message_args),
SAVED_UPDATED => $this->t('The site settings group entity type %label has been updated.', $message_args),
}
);
$form_state->setRedirectUrl($this->entity->toUrl('collection'));
return $result;
}
}
......@@ -113,7 +113,7 @@ class SiteSettingReplicateForm extends FormBase {
'#header' => [
$this->t('Machine name'),
$this->t('Label'),
$this->t('Fieldset'),
$this->t('Group'),
],
];
......@@ -137,12 +137,12 @@ class SiteSettingReplicateForm extends FormBase {
'#size' => 20,
];
$form['new_settings'][$x]['fieldset'] = [
$form['new_settings'][$x]['group'] = [
'#type' => 'textfield',
'#title' => '',
'#description' => '',
'#size' => 20,
'#default_value' => $site_setting_entity_type->fieldset,
'#default_value' => $site_setting_entity_type->group,
];
}
......@@ -180,7 +180,7 @@ class SiteSettingReplicateForm extends FormBase {
foreach ($values['new_settings'] as $key => $setting) {
// Skip if all empty and not first row.
if ($key > 0 && empty($setting['machine_name']) && empty($setting['label']) && empty($setting['fieldset'])) {
if ($key > 0 && empty($setting['machine_name']) && empty($setting['label']) && empty($setting['group'])) {
continue;
}
......@@ -191,8 +191,8 @@ class SiteSettingReplicateForm extends FormBase {
if (empty($setting['label'])) {
$form_state->setErrorByName('new_settings][' . $key . '][label', $this->t('Please enter a label'));
}
if (empty($setting['fieldset'])) {
$form_state->setErrorByName('new_settings][' . $key . '][fieldset', $this->t('Please enter a fieldset'));
if (empty($setting['group'])) {
$form_state->setErrorByName('new_settings][' . $key . '][group', $this->t('Please enter a group'));
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment