PluginProbe
Elementor Website Builder – more than just a page builder / 4.3.0-beta3
Elementor Website Builder – more than just a page builder v4.3.0-beta3
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-utils/import-utils.php +34 -16 4.1.54.3.0-beta3 View file →
@@ -2,14 +2,16 @@
2 2
3 3 namespace Elementor\Modules\GlobalClasses\ImportExportUtils;
4 4
5 5 use Elementor\App\Modules\ImportExportCustomization\Utils as ImportExportUtils;
6 +use Elementor\Core\Kits\Documents\Kit;
7 +use Elementor\Modules\AtomicWidgets\Parsers\Style_Parser;
8 +use Elementor\Modules\AtomicWidgets\PropTypeMigrations\Migrations_Orchestrator;
9 +use Elementor\Modules\AtomicWidgets\Styles\Style_Schema;
10 +use Elementor\Modules\DesignSystemSync\Classes\Global_Classes_Sync_Map;
6 11 use Elementor\Modules\GlobalClasses\Global_Class_Post;
7 12 use Elementor\Modules\GlobalClasses\Global_Classes_Repository;
8 13 use Elementor\Modules\GlobalClasses\Global_Classes_REST_API;
9 -use Elementor\Modules\AtomicWidgets\Parsers\Style_Parser;
10 -use Elementor\Modules\AtomicWidgets\Styles\Style_Schema;
11 -use Elementor\Modules\AtomicWidgets\PropTypeMigrations\Migrations_Orchestrator;
12 14 use Elementor\Plugin;
13 15
14 16 if ( ! defined( 'ABSPATH' ) ) {
15 17 exit;
@@ -45,11 +47,8 @@
45 47 }
46 48
47 49 $conflict_resolution = $options['conflict_resolution'] ?? self::DEFAULT_CONFLICT_RESOLUTION;
48 50
49 - $classes_repository = Global_Classes_Repository::make( $active_kit );
50 - $classes_repository->set_preview( false );
51 -
52 51 $imported_classes_order = json_decode( file_get_contents( $order_file ), true );
53 52
54 53 if ( ! is_array( $imported_classes_order ) ) {
55 54 throw new \Exception( 'Invalid file: order.json is not valid JSON.' );
@@ -62,9 +61,9 @@
62 61 global $wpdb;
63 62 $wpdb->query( 'START TRANSACTION' );
64 63
65 64 try {
66 - [ 'result' => $result, 'changes' => $changes ] = self::do_import( $classes_repository, $classes_dir, $imported_classes_order, $conflict_resolution );
65 + [ 'result' => $result, 'changes' => $changes ] = self::do_import( $active_kit, $classes_dir, $imported_classes_order, $conflict_resolution );
67 66 $wpdb->query( 'COMMIT' );
68 67 } catch ( \Throwable $e ) {
69 68 $wpdb->query( 'ROLLBACK' );
70 69 throw $e;
@@ -80,9 +79,9 @@
80 79 return $result;
81 80 }
82 81
83 82 private static function do_import(
84 - Global_Classes_Repository $classes_repository,
83 + Kit $active_kit,
85 84 string $classes_dir,
86 85 array $imported_classes_order,
87 86 string $conflict_resolution
88 87 ): array {
@@ -89,23 +88,35 @@
89 88 $added_classes_order = [];
90 89 $added_classes_labels = [];
91 90 $modified_classes = [];
92 91 $deleted_classes = [];
92 + $touched_sync_items = [];
93 93
94 - $previous_order = $classes_repository->get_order();
95 - $order_set = array_flip( $previous_order );
94 + $classes_repository_preview = Global_Classes_Repository::make( $active_kit )->set_preview( true );
95 + $classes_repository_frontend = Global_Classes_Repository::make( $active_kit )->set_preview( false );
96 +
97 + $previous_preview_order = $classes_repository_preview->get_order();
98 + $previous_frontend_order = $classes_repository_frontend->get_order();
99 + $order_set = array_flip( array_unique( array_merge( $previous_preview_order, $previous_frontend_order ) ) );
96 100 $style_parser = Style_Parser::make( Style_Schema::get() );
97 101 $classes_dir = rtrim( $classes_dir, '/' );
98 102
99 103 if ( 'override-all' === $conflict_resolution ) {
100 - $deleted_classes = $previous_order;
101 - $classes_repository->delete_all();
102 - $previous_order = [];
104 + $deleted_classes = array_unique( array_merge( $previous_preview_order, $previous_frontend_order ) );
105 + $classes_repository_preview->delete_all();
106 + $classes_repository_frontend->delete_all();
107 + $previous_preview_order = [];
108 + $previous_frontend_order = [];
103 109 $order_set = [];
104 110 }
105 111
106 - $label_to_id_map = self::build_label_to_id_map_from_labels( $classes_repository->all_labels() );
112 + $all_labels = array_merge(
113 + $classes_repository_frontend->all_labels(),
114 + $classes_repository_preview->all_labels()
115 + );
107 116
117 + $label_to_id_map = self::build_label_to_id_map_from_labels( $all_labels );
118 +
108 119 $result = self::EMPTY_RESULT;
109 120
110 121 foreach ( $imported_classes_order as $import_entry ) {
111 122 [ 'is_valid' => $is_valid, 'error' => $validation_error ] = self::validate_class_entry( $import_entry );
@@ -162,8 +173,9 @@
162 173 if ( 'replace' === $action ) {
163 174 $existing_id = $label_to_id_map[ strtolower( $import_entry['label'] ) ];
164 175 self::replace_existing_class( $existing_id, $sanitized_item );
165 176
177 + $touched_sync_items[ $existing_id ] = [ 'sync_to_v3' => ! empty( $sanitized_item['sync_to_v3'] ) ];
166 178 $modified_classes[] = $existing_id;
167 179 $result['replaced'][] = [
168 180 'import_entry' => $import_entry,
169 181 'result_entry' => [
@@ -188,8 +200,9 @@
188 200 $sanitized_item['id'] = $new_id;
189 201 }
190 202
191 203 self::create_new_class( $sanitized_item );
204 + $touched_sync_items[ $new_id ] = [ 'sync_to_v3' => ! empty( $sanitized_item['sync_to_v3'] ) ];
192 205 $order_set[ $new_id ] = true;
193 206 $added_classes_order[] = $new_id;
194 207 $added_classes_labels[ $new_id ] = $sanitized_item['label'];
195 208 $label_to_id_map[ strtolower( $sanitized_item['label'] ) ] = $new_id;
@@ -215,10 +228,15 @@
215 228 $changes = null;
216 229 $has_changes = ! empty( $added_classes_order ) || ! empty( $modified_classes ) || ! empty( $deleted_classes );
217 230
218 231 if ( $has_changes ) {
219 - $new_order = array_merge( $added_classes_order, $previous_order );
220 - $classes_repository->update_order_and_labels( $new_order, $added_classes_labels );
232 + $new_preview_order = array_merge( $added_classes_order, $previous_preview_order );
233 + $new_frontend_order = array_merge( $added_classes_order, $previous_frontend_order );
234 +
235 + $classes_repository_preview->update_order_and_labels( $new_preview_order, $added_classes_labels );
236 + $classes_repository_frontend->update_order_and_labels( $new_frontend_order, $added_classes_labels );
237 +
238 + Global_Classes_Sync_Map::make( $active_kit )->apply_changes( $touched_sync_items, $deleted_classes );
221 239
222 240 $changes = [
223 241 'added' => $added_classes_order,
224 242 'deleted' => $deleted_classes,