PluginProbe
Elementor Website Builder – more than just a page builder / 4.0.8
Elementor Website Builder – more than just a page builder v4.0.8
4.3.0-beta3 4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 All 452 releases
← All changes | modules/global-classes/import-export-customization/runners/import.php +120 -18 4.3.0-beta34.0.8 View file →
@@ -1,15 +1,15 @@
1 1 <?php
2 2
3 3 namespace Elementor\Modules\GlobalClasses\ImportExportCustomization\Runners;
4 4
5 -use Elementor\App\Modules\ImportExportCustomization\Design_System_Import_Context;
6 5 use Elementor\App\Modules\ImportExportCustomization\Runners\Import\Import_Runner_Base;
6 +use Elementor\App\Modules\ImportExportCustomization\Utils as ImportExportUtils;
7 +use Elementor\Modules\AtomicWidgets\Utils\Utils;
8 +use Elementor\Modules\GlobalClasses\Global_Classes_Parser;
9 +use Elementor\Modules\GlobalClasses\Global_Classes_Repository;
7 10 use Elementor\Modules\GlobalClasses\ImportExportCustomization\Import_Export_Customization;
8 -use Elementor\Modules\GlobalClasses\ImportExportUtils\Import_Utils;
9 11 use Elementor\Plugin;
10 -use Elementor\Core\Kits\Documents\Kit;
11 -use Elementor\Modules\GlobalClasses\ImportExportUtils\Legacy_Import_Utils;
12 12
13 13 if ( ! defined( 'ABSPATH' ) ) {
14 14 exit;
15 15 }
@@ -19,12 +19,11 @@
19 19 return 'global-classes';
20 20 }
21 21
22 22 public function should_import( array $data ): bool {
23 - $import_context = Design_System_Import_Context::from_data( $data );
24 -
25 23 return (
26 - $import_context->is_included() &&
24 + isset( $data['include'] ) &&
25 + in_array( 'settings', $data['include'], true ) &&
27 26 ! empty( $data['extracted_directory_path'] ) &&
28 27 $this->is_classes_enabled( $data )
29 28 );
30 29 }
@@ -37,23 +36,126 @@
37 36 return true;
38 37 }
39 38
40 39 public function import( array $data, array $imported_data ): array {
41 - $import_context = Design_System_Import_Context::from_data( $data );
42 - $conflict_resolution = $import_context->resolve_conflict_resolution( $data, 'classesOverrideAll' );
40 + $kit = Plugin::$instance->kits_manager->get_active_kit();
43 41
44 - if ( $this->is_legacy_import_format( $data ) ) {
45 - $global_classes_file = $data['extracted_directory_path'] . '/' . Import_Export_Customization::FILE_NAME . '.json';
46 - return Legacy_Import_Utils::import_classes( $global_classes_file, $conflict_resolution );
42 + $file_name = Import_Export_Customization::FILE_NAME;
43 + $global_classes = ImportExportUtils::read_json_file( "{$data['extracted_directory_path']}/{$file_name}.json" );
44 +
45 + if ( ! $kit || ! $global_classes ) {
46 + return [];
47 47 }
48 48
49 - $global_classes_dir = $data['extracted_directory_path'] . '/' . Import_Export_Customization::DIRECTORY_NAME;
50 - return Import_Utils::import_classes( $global_classes_dir, [ 'conflict_resolution' => $conflict_resolution ] );
49 + $global_classes['order'] = Global_Classes_Parser::sanitize_order(
50 + $global_classes['items'] ?? [],
51 + $global_classes['order'] ?? []
52 + );
53 +
54 + $global_classes_result = Global_Classes_Parser::make()->parse( $global_classes );
55 +
56 + if ( ! $global_classes_result->is_valid() ) {
57 + return [];
58 + }
59 +
60 + $imported_classes = $global_classes_result->unwrap();
61 + $repository = Global_Classes_Repository::make();
62 +
63 + $override_all = ! empty( $data['customization']['settings']['classesOverrideAll'] );
64 +
65 + if ( $override_all ) {
66 + $repository->put(
67 + $imported_classes['items'],
68 + $imported_classes['order']
69 + );
70 +
71 + return $imported_classes;
72 + }
73 +
74 + $existing_classes = $this->get_existing_classes( $repository, $imported_data );
75 + $merged = $this->merge_classes( $existing_classes, $imported_classes );
76 +
77 + $repository->put(
78 + $merged['items'],
79 + $merged['order']
80 + );
81 +
82 + return $imported_classes;
51 83 }
52 84
53 - protected function is_legacy_import_format( array $data ): bool {
54 - $manifest = $data['manifest'];
55 - $elementor_version = $manifest['elementor_version'];
85 + private function get_existing_classes( Global_Classes_Repository $repository, array $imported_data ): array {
86 + $existing = $repository->all()->get();
56 87
57 - return version_compare( $elementor_version, '4.1.0-beta1', '<' );
88 + if ( ! empty( $existing['items'] ) ) {
89 + return $existing;
90 + }
91 +
92 + $was_new_kit_created = ! empty( $imported_data['site-settings']['imported_kit_id'] );
93 +
94 + if ( ! $was_new_kit_created ) {
95 + return $existing;
96 + }
97 +
98 + $previous_kit_id = Plugin::$instance->kits_manager->get_previous_id();
99 +
100 + if ( ! $previous_kit_id ) {
101 + return $existing;
102 + }
103 +
104 + $previous_kit = Plugin::$instance->kits_manager->get_kit( $previous_kit_id );
105 +
106 + return Global_Classes_Repository::make( $previous_kit )->all()->get();
107 + }
108 +
109 + private function merge_classes( array $existing, array $imported ): array {
110 + $existing_items = $existing['items'] ?? [];
111 + $existing_order = $existing['order'] ?? [];
112 + $existing_labels = $this->get_existing_labels( $existing_items );
113 +
114 + $imported_items = $imported['items'] ?? [];
115 + $imported_order = $imported['order'] ?? [];
116 +
117 + foreach ( $imported_order as $imported_id ) {
118 + if ( ! isset( $imported_items[ $imported_id ] ) ) {
119 + continue;
120 + }
121 +
122 + $imported_class = $imported_items[ $imported_id ];
123 +
124 + $id_exists = array_key_exists( $imported_id, $existing_items );
125 + $new_id = $id_exists
126 + ? $this->generate_unique_id( array_keys( $existing_items ) )
127 + : $imported_id;
128 +
129 + $original_label = $imported_class['label'] ?? $imported_id;
130 + $new_label = ImportExportUtils::resolve_label_conflict( $original_label, $existing_labels );
131 + $existing_labels[] = strtolower( $new_label );
132 +
133 + $imported_class['id'] = $new_id;
134 + $imported_class['label'] = $new_label;
135 +
136 + $existing_items[ $new_id ] = $imported_class;
137 + $existing_order[] = $new_id;
138 + }
139 +
140 + return [
141 + 'items' => $existing_items,
142 + 'order' => $existing_order,
143 + ];
144 + }
145 +
146 + private function get_existing_labels( array $items ): array {
147 + $labels = [];
148 +
149 + foreach ( $items as $item ) {
150 + if ( isset( $item['label'] ) ) {
151 + $labels[] = strtolower( $item['label'] );
152 + }
153 + }
154 +
155 + return $labels;
156 + }
157 +
158 + private function generate_unique_id( array $existing_ids ): string {
159 + return Utils::generate_id( 'g-', $existing_ids );
58 160 }
59 161 }