first commit
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace Elementor\Modules\AtomicWidgets\ImportExport;
|
||||
|
||||
use Elementor\Modules\AtomicWidgets\Elements\Atomic_Element_Base;
|
||||
use Elementor\Modules\AtomicWidgets\Elements\Atomic_Widget_Base;
|
||||
use Elementor\Modules\AtomicWidgets\ImportExport\Modifiers\Settings_Props_Modifier;
|
||||
use Elementor\Modules\AtomicWidgets\ImportExport\Modifiers\Styles_Ids_Modifier;
|
||||
use Elementor\Modules\AtomicWidgets\ImportExport\Modifiers\Styles_Props_Modifier;
|
||||
use Elementor\Modules\AtomicWidgets\PropsResolver\Import_Export_Props_Resolver;
|
||||
use Elementor\Modules\AtomicWidgets\Styles\Style_Schema;
|
||||
use Elementor\Modules\AtomicWidgets\Utils;
|
||||
use Elementor\Plugin;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Atomic_Import_Export {
|
||||
public function register_hooks() {
|
||||
add_filter(
|
||||
'elementor/template_library/sources/local/import/elements',
|
||||
fn( $elements ) => $this->run( $elements, Import_Export_Props_Resolver::for_import() )
|
||||
);
|
||||
|
||||
add_filter(
|
||||
'elementor/template_library/sources/cloud/import/elements',
|
||||
fn( $elements ) => $this->run( $elements, Import_Export_Props_Resolver::for_import() )
|
||||
);
|
||||
|
||||
add_filter(
|
||||
'elementor/template_library/sources/local/export/elements',
|
||||
fn( $elements ) => $this->run( $elements, Import_Export_Props_Resolver::for_export() )
|
||||
);
|
||||
|
||||
add_filter(
|
||||
'elementor/document/element/replace_id',
|
||||
fn( $element ) => $this->replace_styles_ids( $element )
|
||||
);
|
||||
}
|
||||
|
||||
private function run( $elements, Import_Export_Props_Resolver $props_resolver ) {
|
||||
if ( empty( $elements ) || ! is_array( $elements ) ) {
|
||||
return $elements;
|
||||
}
|
||||
|
||||
return Plugin::$instance->db->iterate_data( $elements, function ( $element ) use ( $props_resolver ) {
|
||||
$element_instance = Plugin::$instance->elements_manager->create_element_instance( $element );
|
||||
|
||||
/** @var Atomic_Element_Base | Atomic_Widget_Base $element_instance */
|
||||
if ( ! Utils::is_atomic( $element_instance ) ) {
|
||||
return $element;
|
||||
}
|
||||
|
||||
$runners = [
|
||||
Settings_Props_Modifier::make( $props_resolver, $element_instance::get_props_schema() ),
|
||||
Styles_Props_Modifier::make( $props_resolver, Style_Schema::get() ),
|
||||
];
|
||||
|
||||
foreach ( $runners as $runner ) {
|
||||
$element = $runner->run( $element );
|
||||
}
|
||||
|
||||
return $element;
|
||||
} );
|
||||
}
|
||||
|
||||
private function replace_styles_ids( $element ) {
|
||||
if ( empty( $element ) || ! is_array( $element ) ) {
|
||||
return $element;
|
||||
}
|
||||
|
||||
$element_instance = Plugin::$instance->elements_manager->create_element_instance( $element );
|
||||
|
||||
/** @var Atomic_Element_Base | Atomic_Widget_Base $element_instance */
|
||||
if ( ! Utils::is_atomic( $element_instance ) ) {
|
||||
return $element;
|
||||
}
|
||||
|
||||
return Styles_Ids_Modifier::make()->run( $element );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace Elementor\Modules\AtomicWidgets\ImportExport\Modifiers;
|
||||
|
||||
use Elementor\Modules\AtomicWidgets\PropsResolver\Import_Export_Props_Resolver;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Settings_Props_Modifier {
|
||||
private Import_Export_Props_Resolver $props_resolver;
|
||||
|
||||
private array $schema;
|
||||
|
||||
public function __construct( Import_Export_Props_Resolver $props_resolver, array $schema ) {
|
||||
$this->props_resolver = $props_resolver;
|
||||
$this->schema = $schema;
|
||||
}
|
||||
|
||||
public static function make( Import_Export_Props_Resolver $props_resolver, array $schema ) {
|
||||
return new self( $props_resolver, $schema );
|
||||
}
|
||||
|
||||
public function run( array $element ) {
|
||||
if ( empty( $element['settings'] ) || ! is_array( $element['settings'] ) ) {
|
||||
return $element;
|
||||
}
|
||||
|
||||
$element['settings'] = $this->props_resolver->resolve(
|
||||
$this->schema,
|
||||
$element['settings']
|
||||
);
|
||||
|
||||
return $element;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
namespace Elementor\Modules\AtomicWidgets\ImportExport\Modifiers;
|
||||
|
||||
use Elementor\Core\Utils\Collection;
|
||||
use Elementor\Modules\AtomicWidgets\PropTypes\Classes_Prop_Type;
|
||||
use Elementor\Modules\AtomicWidgets\Utils;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Styles_Ids_Modifier {
|
||||
private Collection $old_to_new_ids;
|
||||
|
||||
public static function make() {
|
||||
return new self();
|
||||
}
|
||||
|
||||
public function run( array $element ) {
|
||||
$this->old_to_new_ids = Collection::make();
|
||||
|
||||
$element = $this->replace_styles_ids( $element );
|
||||
$element = $this->replace_references( $element );
|
||||
|
||||
return $element;
|
||||
}
|
||||
|
||||
private function replace_styles_ids( array $element ) {
|
||||
if ( empty( $element['styles'] ) || empty( $element['id'] ) ) {
|
||||
return $element;
|
||||
}
|
||||
|
||||
$styles = Collection::make( $element['styles'] )->map_with_keys( function ( $style, $id ) use ( $element ) {
|
||||
$style['id'] = $this->generate_id( $element['id'], $id );
|
||||
|
||||
return [ $style['id'] => $style ];
|
||||
} )->all();
|
||||
|
||||
$element['styles'] = $styles;
|
||||
|
||||
return $element;
|
||||
}
|
||||
|
||||
private function replace_references( array $element ) {
|
||||
if ( empty( $element['settings'] ) ) {
|
||||
return $element;
|
||||
}
|
||||
|
||||
$element['settings'] = Collection::make( $element['settings'] )->map( function ( $setting ) {
|
||||
if ( ! $setting || ! Classes_Prop_Type::make()->validate( $setting ) ) {
|
||||
return $setting;
|
||||
}
|
||||
|
||||
$setting['value'] = Collection::make( $setting['value'] )
|
||||
->map( fn( $style_id ) => $this->old_to_new_ids->get( $style_id ) ?? $style_id )
|
||||
->all();
|
||||
|
||||
return $setting;
|
||||
} )->all();
|
||||
|
||||
return $element;
|
||||
}
|
||||
|
||||
private function generate_id( $element_id, $old_id ): string {
|
||||
$id = Utils::generate_id( "e-{$element_id}-", $this->old_to_new_ids->values() );
|
||||
|
||||
$this->old_to_new_ids[ $old_id ] = $id;
|
||||
|
||||
return $id;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
namespace Elementor\Modules\AtomicWidgets\ImportExport\Modifiers;
|
||||
|
||||
use Elementor\Modules\AtomicWidgets\PropsResolver\Import_Export_Props_Resolver;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Styles_Props_Modifier {
|
||||
private Import_Export_Props_Resolver $props_resolver;
|
||||
|
||||
private array $schema;
|
||||
|
||||
public function __construct( Import_Export_Props_Resolver $props_resolver, array $schema ) {
|
||||
$this->props_resolver = $props_resolver;
|
||||
$this->schema = $schema;
|
||||
}
|
||||
|
||||
public static function make( Import_Export_Props_Resolver $props_resolver, array $schema ) {
|
||||
return new self( $props_resolver, $schema );
|
||||
}
|
||||
|
||||
public function run( array $element ) {
|
||||
if ( empty( $element['styles'] ) && ! is_array( $element['styles'] ) ) {
|
||||
return $element;
|
||||
}
|
||||
|
||||
foreach ( $element['styles'] as $style_key => $style ) {
|
||||
if ( empty( $style['variants'] ) || ! is_array( $style['variants'] ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ( $style['variants'] as $variant_key => $variant ) {
|
||||
if ( empty( $variant['props'] ) || ! is_array( $variant['props'] ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$element['styles'][ $style_key ]['variants'][ $variant_key ]['props'] = $this->props_resolver->resolve(
|
||||
$this->schema,
|
||||
$variant['props']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return $element;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user