entityTypeManager = $entity_type_manager; $this->moduleHandler = $module_handler; $this->moduleExtensionList = $extension_list_module; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('entity_type.manager'), $container->get('module_handler'), $container->get('extension.list.module') ); } /** * Transforms legacy settings to newer setting architecture. * * @param array $old_settings * The old settings. * @param string $for * The configuration for which the transformation is being done. * Regular config or view. * * @return array * The new format settings. */ public function transformVersion3SettingsToNew(array &$old_settings, string $for = 'config') { $new_settings = []; $new_settings['fields']['stacking'] = !empty($old_settings['grouping']); $old_config_keys = $this->getLegacySettingsMappingKeys(); foreach ($old_settings as $setting_id => $setting_value) { if (empty($old_config_keys[$setting_id])) { continue; } $setting_key_map = $old_config_keys[$setting_id]; $value = $this->transformBoolStringValueToBool($setting_value); // When a block setting belongs to the chart blocks we save it in a // new setting. if (substr($setting_key_map, 0, 7) === 'display') { // Stripping the 'display_' in front of the mapping key. $setting_key_map = substr($setting_key_map, 8, strlen($setting_key_map)); if (substr($setting_key_map, 0, 10) === 'dimensions') { // Stripping dimensions_. $setting_key_map = substr($setting_key_map, 11, strlen($setting_key_map)); $new_settings['display']['dimensions'][$setting_key_map] = $value; } elseif (substr($setting_key_map, 0, 5) === 'gauge') { // Stripping gauge_. $setting_key_map = substr($setting_key_map, 6, strlen($setting_key_map)); $new_settings['display']['gauge'][$setting_key_map] = $value; } else { $new_settings['display'][$setting_key_map] = $value; } } elseif (substr($setting_key_map, 0, 5) === 'xaxis') { // Stripping xaxis_. $setting_key_map = substr($setting_key_map, 6, strlen($setting_key_map)); $new_settings['xaxis'][$setting_key_map] = $value; } elseif (substr($setting_key_map, 0, 5) === 'yaxis') { // Stripping yaxis_. $setting_key_map = substr($setting_key_map, 6, strlen($setting_key_map)); if (substr($setting_key_map, 0, 9) === 'secondary') { // Stripping gauge_. $setting_key_map = substr($setting_key_map, 10, strlen($setting_key_map)); $new_settings['yaxis']['secondary'][$setting_key_map] = $value; } else { $new_settings['yaxis'][$setting_key_map] = $value; } } elseif (substr($setting_key_map, 0, 6) === 'fields') { // Stripping fields_. $setting_key_map = substr($setting_key_map, 7, strlen($setting_key_map)); if ($setting_key_map === 'data_providers' && is_array($value)) { $data_providers = $new_settings['fields']['data_providers'] ?? []; if ($setting_id === 'data_fields' || $setting_id == 'field_colors') { $new_settings['fields']['data_providers'] = $this->transformLegacyFieldsDataProvidersToNew($data_providers, $value); } } else { $new_settings['fields'][$setting_key_map] = $value; } } elseif ($setting_key_map === 'grouping' && $new_settings['fields']['stacking']) { $new_settings[$setting_key_map] = []; } else { // We make sure that we handle the color unneeded array. $new_settings[$setting_key_map] = $setting_key_map !== 'color' ? $value : $value[0]; } // Then we remove it from the main old settings tree. unset($old_settings[$setting_id]); } // Allow other modules to alter the new settings. $this->moduleHandler->alter('charts_version3_to_new_settings_structure', $new_settings, $for, $this); return $new_settings; } /** * Initialize the current default settings. */ public function initializedCurrentDefaultSettings() { $path = $this->moduleExtensionList->getPath('charts'); $default_install_settings_file = $path . '/config/install/charts.settings.yml'; $default_install_settings = Yaml::decode(file_get_contents($default_install_settings_file)); $new_settings = &$default_install_settings['charts_default_settings']; // Allow other modules to alter the new settings. $for = 'config'; $this->moduleHandler->alter('charts_version3_to_new_settings_structure', $new_settings, $for, $this); return $default_install_settings; } /** * Updates settings from version 3 of views. */ public function updateExistingViewsVersion3ToNewSettings() { $view_storage = $this->entityTypeManager->getStorage('view'); $view_ids = $view_storage->getQuery() ->accessCheck(FALSE) ->condition('display.*.display_options.style.type', 'chart', '=') ->execute(); if (!$view_ids) { return 'Views: No views had a display set to a charts style.'; } $updated_views = []; foreach ($view_ids as $view_id) { /** @var \Drupal\views\ViewEntityInterface $view */ if (!($view = $view_storage->load($view_id))) { continue; } $changed = FALSE; $displays = $view->get('display'); foreach ($displays as &$display) { $style = &$display['display_options']['style']; if ($style['type'] !== 'chart' || !isset($style['options']['field_colors']) || !isset($style['options']['fields']['table'])) { continue; } $changed = TRUE; // Removing this because it was set in version 3 but was not used for // anything. unset($style['options']['fields']); $options = &$style['options']; $options = $this->transformVersion3SettingsToNew($options, 'view'); $chart_settings_elements = [ 'library', 'type', 'fields', 'display', 'xaxis', 'yaxis', ]; foreach ($options as $option_key => $option) { if (in_array($option_key, $chart_settings_elements)) { $options['chart_settings'][$option_key] = $option; unset($options[$option_key]); } } } if ($changed) { $view->set('display', $displays); $view->save(); $updated_views[] = $view_id; } } if ($updated_views) { return sprintf('Views: The following views were updated: %s', implode(', ', $updated_views)); } return sprintf('Views: The following views(%s) with at least one display of charts style were loaded but not updated!', implode(', ', array_values($view_ids))); } /** * Transforms boolean string value to real boolean. * * @param mixed $value * The value to be transformed. * * @return bool|mixed * The boolean value or the original passed value. */ public function transformBoolStringValueToBool($value) { if ($value === 'FALSE' || $value === 'false') { return FALSE; } elseif ($value === 'TRUE' || $value === 'true') { return TRUE; } return $value; } /** * Transforms legacy fields data providers to new. * * @param array $data_providers * Data providers. * @param array $legacy_value * Legacy value. * * @return mixed * Data providers returned */ private function transformLegacyFieldsDataProvidersToNew(array $data_providers, array $legacy_value) { $default_weight = 0; foreach ($legacy_value as $field_id => $value) { if (Color::validateHex($value)) { $data_providers[$field_id]['color'] = $value; } else { $data_providers[$field_id]['enabled'] = !empty($value); } $data_providers[$field_id]['weight'] = $default_weight; $default_weight++; } return $data_providers; } /** * Gets legacy settings mapping keys. * * @return array * Legacy settings keys to newer ones mapping. */ private function getLegacySettingsMappingKeys() { return [ 'library' => 'library', 'chart_library' => 'library', 'type' => 'type', 'chart_type' => 'type', 'grouping' => 'grouping', 'title' => 'display_title', 'title_position' => 'display_title_position', 'data_labels' => 'display_data_labels', 'data_markers' => 'display_data_markers', 'legend' => 'display_legend', 'legend_position' => 'display_legend_position', 'background' => 'display_background', 'three_dimensional' => 'display_three_dimensional', 'polar' => 'display_polar', 'series' => 'series', 'data' => 'data', 'color' => 'color', 'data_series' => 'data_series', 'series_label' => 'series_label', 'categories' => 'categories', 'field_colors' => 'fields_data_providers', 'tooltips' => 'display_tooltips', 'tooltips_use_html' => 'display_tooltips_use_html', 'width' => 'display_dimensions_width', 'height' => 'display_dimensions_height', 'width_units' => 'display_dimensions_width_units', 'height_units' => 'display_dimensions_height_units', 'colors' => 'display_colors', 'xaxis_title' => 'xaxis_title', 'xaxis_labels_rotation' => 'xaxis_labels_rotation', 'yaxis_title' => 'yaxis_title', 'yaxis_min' => 'yaxis_min', 'yaxis_max' => 'yaxis_max', 'yaxis_prefix' => 'yaxis_prefix', 'yaxis_suffix' => 'yaxis_suffix', 'yaxis_decimal_count' => 'yaxis_decimal_count', 'yaxis_labels_rotation' => 'yaxis_labels_rotation', 'inherit_yaxis' => 'yaxis_inherit', 'secondary_yaxis_title' => 'yaxis_secondary_title', 'secondary_yaxis_min' => 'yaxis_secondary_min', 'secondary_yaxis_max' => 'yaxis_secondary_min', 'secondary_yaxis_prefix' => 'yaxis_secondary_prefix', 'secondary_yaxis_suffix' => 'yaxis_secondary_suffix', 'secondary_yaxis_decimal_count' => 'yaxis_secondary_decimal_count', 'secondary_yaxis_labels_rotation' => 'yaxis_secondary_labels_rotation', 'green_from' => 'display_gauge_green_from', 'green_to' => 'display_gauge_green_to', 'red_from' => 'display_gauge_red_from', 'red_to' => 'display_gauge_red_to', 'yellow_from' => 'display_gauge_yellow_from', 'yellow_to' => 'display_gauge_yellow_to', 'max' => 'display_gauge_max', 'min' => 'display_gauge_min', 'allow_advanced_rendering' => 'fields_allow_advanced_rendering', 'label_field' => 'fields_label', 'data_fields' => 'fields_data_providers', ]; } }