← All changes
|
modules/global-classes/import-export-utils/import-utils.php
+34
-16
4.1.5
→
4.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, |