| 1 |
<?php |
| 2 |
|
| 3 |
namespace Elementor\Modules\Variables\Utils; |
| 4 |
|
| 5 |
use Elementor\Core\Utils\Template_Library_Element_Iterator; |
| 6 |
|
| 7 |
if ( ! defined( 'ABSPATH' ) ) { |
| 8 |
exit; |
| 9 |
} |
| 10 |
|
| 11 |
class Template_Library_Variables_Element_Transformer { |
| 12 |
|
| 13 |
public static function rewrite_elements_variable_ids( array $elements, array $id_map ): array { |
| 14 |
if ( empty( $elements ) || empty( $id_map ) ) { |
| 15 |
return $elements; |
| 16 |
} |
| 17 |
|
| 18 |
$variable_types_map = array_fill_keys( Variable_Type_Keys::get_all(), true ); |
| 19 |
|
| 20 |
return Template_Library_Element_Iterator::iterate( |
| 21 |
$elements, |
| 22 |
function ( $element_data ) use ( $id_map, $variable_types_map ) { |
| 23 |
return self::rewrite_variable_ids_in_element( $element_data, $id_map, $variable_types_map ); |
| 24 |
} |
| 25 |
); |
| 26 |
} |
| 27 |
|
| 28 |
public static function flatten_elements_variables( array $elements, array $global_variables, ?array $only_ids = null ): array { |
| 29 |
$variable_data = $global_variables['data'] ?? []; |
| 30 |
|
| 31 |
if ( empty( $elements ) || empty( $variable_data ) ) { |
| 32 |
return $elements; |
| 33 |
} |
| 34 |
|
| 35 |
$variable_types_map = array_fill_keys( Variable_Type_Keys::get_all(), true ); |
| 36 |
$ids_to_flatten = null !== $only_ids ? array_fill_keys( $only_ids, true ) : null; |
| 37 |
|
| 38 |
return Template_Library_Element_Iterator::iterate( |
| 39 |
$elements, |
| 40 |
function ( $element_data ) use ( $variable_data, $variable_types_map, $ids_to_flatten ) { |
| 41 |
return self::flatten_variable_refs_in_element( $element_data, $variable_data, $variable_types_map, $ids_to_flatten ); |
| 42 |
} |
| 43 |
); |
| 44 |
} |
| 45 |
|
| 46 |
private static function rewrite_variable_ids_in_element( array $element_data, array $id_map, array $variable_types_map ): array { |
| 47 |
if ( ! empty( $element_data['settings'] ) && is_array( $element_data['settings'] ) ) { |
| 48 |
$element_data['settings'] = self::rewrite_variable_ids_recursive( $element_data['settings'], $id_map, $variable_types_map ); |
| 49 |
} |
| 50 |
|
| 51 |
if ( ! empty( $element_data['styles'] ) && is_array( $element_data['styles'] ) ) { |
| 52 |
$element_data['styles'] = self::rewrite_variable_ids_recursive( $element_data['styles'], $id_map, $variable_types_map ); |
| 53 |
} |
| 54 |
|
| 55 |
return $element_data; |
| 56 |
} |
| 57 |
|
| 58 |
private static function rewrite_variable_ids_recursive( $data, array $id_map, array $variable_types_map ) { |
| 59 |
if ( ! is_array( $data ) ) { |
| 60 |
return $data; |
| 61 |
} |
| 62 |
|
| 63 |
if ( isset( $data['$$type'], $variable_types_map[ $data['$$type'] ] ) ) { |
| 64 |
if ( isset( $data['value'] ) && is_string( $data['value'] ) && isset( $id_map[ $data['value'] ] ) ) { |
| 65 |
$data['value'] = $id_map[ $data['value'] ]; |
| 66 |
} |
| 67 |
return $data; |
| 68 |
} |
| 69 |
|
| 70 |
foreach ( $data as $key => $value ) { |
| 71 |
if ( is_array( $value ) ) { |
| 72 |
$data[ $key ] = self::rewrite_variable_ids_recursive( $value, $id_map, $variable_types_map ); |
| 73 |
} |
| 74 |
} |
| 75 |
|
| 76 |
return $data; |
| 77 |
} |
| 78 |
|
| 79 |
private static function flatten_variable_refs_in_element( array $element_data, array $variable_data, array $variable_types_map, ?array $ids_to_flatten ): array { |
| 80 |
if ( ! empty( $element_data['settings'] ) && is_array( $element_data['settings'] ) ) { |
| 81 |
$element_data['settings'] = self::flatten_variable_refs_recursive( $element_data['settings'], $variable_data, $variable_types_map, $ids_to_flatten ); |
| 82 |
} |
| 83 |
|
| 84 |
if ( ! empty( $element_data['styles'] ) && is_array( $element_data['styles'] ) ) { |
| 85 |
$element_data['styles'] = self::flatten_variable_refs_recursive( $element_data['styles'], $variable_data, $variable_types_map, $ids_to_flatten ); |
| 86 |
} |
| 87 |
|
| 88 |
return $element_data; |
| 89 |
} |
| 90 |
|
| 91 |
private static function flatten_variable_refs_recursive( $data, array $variable_data, array $variable_types_map, ?array $ids_to_flatten = null ) { |
| 92 |
if ( ! is_array( $data ) ) { |
| 93 |
return $data; |
| 94 |
} |
| 95 |
|
| 96 |
if ( isset( $data['$$type'], $variable_types_map[ $data['$$type'] ] ) ) { |
| 97 |
$var_id = $data['value'] ?? null; |
| 98 |
|
| 99 |
if ( is_string( $var_id ) && isset( $variable_data[ $var_id ] ) ) { |
| 100 |
if ( null !== $ids_to_flatten && ! isset( $ids_to_flatten[ $var_id ] ) ) { |
| 101 |
return $data; |
| 102 |
} |
| 103 |
|
| 104 |
$variable = $variable_data[ $var_id ]; |
| 105 |
$resolved_value = $variable['value'] ?? null; |
| 106 |
$resolved_type = Variable_Type_Keys::get_resolved_type( $data['$$type'] ); |
| 107 |
|
| 108 |
if ( null !== $resolved_value && null !== $resolved_type ) { |
| 109 |
return [ |
| 110 |
'$$type' => $resolved_type, |
| 111 |
'value' => Variable_Type_Keys::convert_value_for_resolved_type( $resolved_type, $resolved_value ), |
| 112 |
]; |
| 113 |
} |
| 114 |
} |
| 115 |
|
| 116 |
return $data; |
| 117 |
} |
| 118 |
|
| 119 |
foreach ( $data as $key => $value ) { |
| 120 |
if ( is_array( $value ) ) { |
| 121 |
$data[ $key ] = self::flatten_variable_refs_recursive( $value, $variable_data, $variable_types_map, $ids_to_flatten ); |
| 122 |
} |
| 123 |
} |
| 124 |
|
| 125 |
return $data; |
| 126 |
} |
| 127 |
} |
| 128 |
|