improvements-2.x-dev/modules/improvements_site_information/improvements_site_information.module
modules/improvements_site_information/improvements_site_information.module
<?php use Drupal\Component\Utility\NestedArray; use Drupal\Core\Form\FormStateInterface; /** * Implements hook_config_schema_info_alter(). */ function improvements_site_information_config_schema_info_alter(array &$definitions): void { $definitions['system.site']['mapping']['improvements'] = [ 'type' => 'sequence', 'label' => 'Third-party site information', 'sequence' => [ 'type' => 'site_third_party_setting.[%key]', ], ]; } /** * Implements hook_site_third_party_settings_info(). */ function improvements_site_information_site_third_party_settings_info(): array { return [ 'company_name' => [ 'title' => t('Company name'), 'form_element_type' => 'textfield', 'weight' => 0, ], 'company_mail' => [ 'title' => t('Company e-mail address'), 'description' => '', 'form_element_type' => 'textfield', 'weight' => 1, ], 'mail_for_notifications' => [ 'title' => t('E-mail address for notifications'), 'description' => t('E-mail address for notifications of new comments, contact messages and other.'), 'form_element_type' => 'textfield', 'weight' => 2, ], 'phone' => [ 'title' => t('Phone number'), 'form_element_type' => 'textfield', 'weight' => 3, ], 'company_location' => [ 'title' => t('Company location'), 'form_element_type' => 'textfield', 'weight' => 4, ], 'company_schedule' => [ 'title' => t('Work schedule'), 'form_element_type' => 'textfield', 'weight' => 5, ], 'personal_data_processing_policy_url' => [ 'title' => t('Personal data processing policy page url'), 'form_element_type' => 'textfield', 'weight' => 6, ], ]; } /** * Return site third-party settings info. */ function improvements_get_site_third_party_settings_info(): ?array { static $cache; if ($cache === NULL) { $cache = \Drupal::moduleHandler()->invokeAll('site_third_party_settings_info'); } return $cache; } /** * Implements hook_form_FORM_ID_alter(): system_site_information_settings. * * @see \Drupal\system\Form\SiteInformationForm */ function improvements_site_information_form_system_site_information_settings_alter(array &$form, FormStateInterface $form_state): void { $form['site_information']['site_mail']['#title'] = t('E-mail for "From"'); $site_third_party_settings_info = improvements_get_site_third_party_settings_info(); $site_information = improvements_get_site_information(); foreach ($site_third_party_settings_info as $setting_name => $setting_info) { $group = $setting_info['group'] ?? 'site_information'; $form_element_type = $setting_info['form_element_type'] ?? 'textfield'; if (!isset($form[$group])) { $form[$group] = [ '#type' => 'details', '#open' => TRUE, ]; if (isset($setting_info['group_info'])) { $form[$group]['#title'] = $setting_info['group_info']['title']; } } $form[$group][$setting_name] = [ '#type' => $form_element_type, '#title' => $setting_info['title'], '#description' => $setting_info['description'] ?? '', '#default_value' => $site_information[$setting_name] ?? NULL, '#weight' => $setting_info['weight'] ?? 0, ]; } $form['#submit'][] = 'improvements_site_information_form_system_site_information_settings_submit'; } /** * Custom submit callback for system_site_information_settings form. * * @see improvements_form_system_site_information_settings_alter() */ function improvements_site_information_form_system_site_information_settings_submit(array &$form, FormStateInterface $form_state): void { $site_information_editable_config = \Drupal::configFactory()->getEditable('system.site'); $site_third_party_settings_info = improvements_get_site_third_party_settings_info(); foreach ($site_third_party_settings_info as $setting_name => $setting_info) { $site_information_editable_config->set('improvements.' . $setting_name, $form_state->getValue($setting_name)); } $site_information_editable_config->save(); } /** * Return site information. */ function improvements_get_site_information(string|array $setting_key = NULL): array|string { static $site_information; if ($site_information === NULL) { $site_information = \Drupal::config('system.site')->get(); if (isset($site_information['improvements'])) { $site_information += $site_information['improvements']; unset($site_information['improvements']); } } if ($setting_key) { if (is_array($setting_key)) { return NestedArray::getValue($site_information, $setting_key); } return $site_information[$setting_key] ?? ''; } return $site_information; } /** * Implements hook_filter_functions(). */ function improvements_site_information_filter_functions(): array { return [ 'site_information' => [ 'function' => 'function_filter__site_information', ], 'clean_company_phone' => [ 'function' => 'function_filter__clean_company_phone', ], ]; } /** * Filter function returning site information. */ function function_filter__site_information(string $setting_key, int $index = NULL): string { if (str_contains($setting_key, '.')) { $value = improvements_get_site_information(explode('.', $setting_key)); } else { $value = improvements_get_site_information($setting_key); } if ($index !== NULL) { $value = explode('; ', $value); return $value[$index] ?? ''; } return $value; } /** * Filter function returning site information. */ function function_filter__clean_company_phone(): string { return preg_replace('/\D/', '', improvements_get_site_information('phone')); }