Files
2025-02-24 22:33:42 +01:00

160 lines
4.7 KiB
PHP

<?php
namespace Essential_Addons_Elementor\Pro\Extensions;
use Elementor\Controls_Stack;
use Elementor\Plugin;
use Elementor\Utils;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class XD_Copy {
use \Essential_Addons_Elementor\Traits\Library;
/**
* Initialize hooks
*/
public function __construct() {
add_action( 'wp_ajax_eael_xd_copy_fetch_content', array( $this, 'eael_xdcp_fetch_content_data' ) );
add_action( 'elementor/editor/after_enqueue_scripts', array( $this, 'enqueue_xd_copy_scripts' ) );
}
/**
* Enqueue cross domain copy paste script files
*/
public function enqueue_xd_copy_scripts() {
wp_enqueue_script(
'eael-xd-copy',
$this->safe_url( EAEL_PRO_PLUGIN_URL . 'assets/front-end/js/edit/eael-xd-copy.min.js' ),
[ 'jquery' ],
time(),
true
);
wp_localize_script(
'eael-xd-copy',
'eael_xd_copy',
[
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'eael_xd_copy_fetch_content' ),
'i18n' => [
'ea_copy' => __( 'Cross-Domain Copy', 'essential-addons-elementor' ),
'ea_copy_all' => __( 'Cross-Domain Page Copy', 'essential-addons-elementor' ),
'ea_paste' => __( 'Cross-Domain Paste', 'essential-addons-elementor' ),
'ea_paste_all' => __( 'Cross-Domain Page Paste', 'essential-addons-elementor' ),
'container_message' => __( '✅ Container Copied Successfully', 'essential-addons-elementor' ),
'section_message' => __( '✅ Section Copied Successfully', 'essential-addons-elementor' ),
'column_message' => __( '✅ Column Copied Successfully', 'essential-addons-elementor' ),
'widget_message' => __( '✅ Widget Copied Successfully', 'essential-addons-elementor' ),
'full_page_message' => __( '✅ Full Page Copied Successfully', 'essential-addons-elementor' ),
'paste_message' => __( '✅ Pasted Successfully', 'essential-addons-elementor' ),
'full_page_paste_message' => __( '✅ Full Page Pasted Successfully', 'essential-addons-elementor' ),
'full_page_pasting_message' => __( '⏳ Please wait while we process your data...', 'essential-addons-elementor' ),
]
]
);
}
/**
* Ajax handler for media elements
*/
public static function eael_xdcp_fetch_content_data() {
check_ajax_referer( 'eael_xd_copy_fetch_content', 'nonce' );
if ( ! current_user_can( 'edit_posts' ) ) {
wp_send_json_error(
__( 'Not a Valid User', 'essential-addons-elementor' ),
403
);
}
$media_xdcp_data = isset( $_POST['xd_copy_data'] ) ? wp_unslash( $_POST['xd_copy_data'] ) : '';
if ( empty( $media_xdcp_data ) ) {
wp_send_json_error( __( 'Empty Content', 'essential-addons-elementor' ) );
}
$media_xdcp_data = array( json_decode( $media_xdcp_data, true ) );
$media_xdcp_data = self::eael_xdcp_replace_elements_ids( $media_xdcp_data );
$media_xdcp_data = self::eael_xdcp_create_copy_content( $media_xdcp_data );
wp_send_json_success( $media_xdcp_data );
}
/**
* Set random id of media elements
*
* @param $media_xdcp_data
*
* @return array|mixed
*/
protected static function eael_xdcp_replace_elements_ids( $media_xdcp_data ) {
return Plugin::instance()->db->iterate_data(
$media_xdcp_data,
function ( $element ) {
$element['id'] = Utils::generate_random_string();
return $element;
}
);
}
/**
* Create element instance from copied content
*
* @param $media_xdcp_data
*
* @return array|mixed
*/
protected static function eael_xdcp_create_copy_content( $media_xdcp_data ) {
return Plugin::instance()->db->iterate_data(
$media_xdcp_data,
function ( $element_data ) {
$elements = Plugin::instance()->elements_manager->create_element_instance( $element_data );
if ( ! $elements ) {
return null;
}
return self::eael_xdcp_process_media( $elements );
}
);
}
/**
* @param Controls_Stack $element
* @param string $method
*
* @return array|mixed
*/
protected static function eael_xdcp_process_media( Controls_Stack $element, $method = 'on_import' ) {
$get_element_instance = $element->get_data();
if ( method_exists( $element, $method ) ) {
$get_element_instance = $element->{$method}( $get_element_instance );
}
foreach ( $element->get_controls() as $get_control ) {
$control_type = Plugin::instance()->controls_manager->get_control( $get_control['type'] );
$control_name = $get_control['name'];
if ( ! $control_type ) {
return $get_element_instance;
}
if ( method_exists( $control_type, $method ) ) {
$get_element_instance['settings'][ $control_name ] = $control_type->{$method}( $element->get_settings( $control_name ), $get_control );
}
}
return $get_element_instance;
}
}