PluginProbe
Elementor Website Builder – more than just a page builder / 3.35.0-dev1
Elementor Website Builder – more than just a page builder v3.35.0-dev1
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 4.0.7 All 451 releases
elementor / modules / components / overridable-props / overridable-prop-parser.php

overridable-prop-parser.php in Elementor Website Builder – more than just a page builder 3.35.0-dev1, at modules/components/overridable-props/overridable-prop-parser.php

142 lines 3.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Elementor\Modules\Components\OverridableProps;
4
5 use Elementor\Modules\Components\PropTypes\Override_Prop_Type;
6 use Elementor\Modules\Components\Utils\Parsing_Utils;
7 use Elementor\Core\Utils\Api\Parse_Result;
8 use Elementor\Modules\Components\PropTypes\Overridable_Prop_Type;
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit;
12 }
13
14 class Overridable_Prop_Parser {
15 public static function make(): self {
16 return new static();
17 }
18
19 public function parse( array $prop ): Parse_Result {
20 $validation_result = $this->validate( $prop );
21
22 if ( ! $validation_result->is_valid() ) {
23 return $validation_result;
24 }
25
26 return $this->sanitize( $prop );
27 }
28
29 private function validate( array $prop ): Parse_Result {
30 $result = Parse_Result::make();
31
32 $required_fields = [
33 'overrideKey',
34 'label',
35 'elementId',
36 'elType',
37 'widgetType',
38 'propKey',
39 'groupId',
40 ];
41
42 foreach ( $required_fields as $field ) {
43 if ( ! isset( $prop[ $field ] ) ) {
44 $result->errors()->add( $field, 'missing_field' );
45 }
46 }
47
48 if ( ! $result->is_valid() ) {
49 return $result;
50 }
51
52 $origin_value = $this->get_final_origin_value( $prop );
53
54 if ( ! empty( $origin_value ) ) {
55 $origin_value_prop_type = $this->get_origin_prop_type( $prop );
56
57 if ( ! $origin_value_prop_type->validate( $origin_value ) ) {
58 $result->errors()->add( 'originValue', 'invalid' );
59
60 return $result;
61 }
62 }
63
64 return $result;
65 }
66
67 private function sanitize( array $prop ): Parse_Result {
68 $result = Parse_Result::make();
69
70 $sanitized_origin_value = $this->get_sanitized_origin_value( $prop );
71
72 $sanitized_prop = [
73 'overrideKey' => sanitize_key( $prop['overrideKey'] ),
74 'label' => sanitize_text_field( $prop['label'] ),
75 'elementId' => sanitize_key( $prop['elementId'] ),
76 'propKey' => sanitize_text_field( $prop['propKey'] ),
77 'widgetType' => sanitize_text_field( $prop['widgetType'] ),
78 'elType' => sanitize_text_field( $prop['elType'] ),
79 'originValue' => $sanitized_origin_value,
80 'groupId' => sanitize_key( $prop['groupId'] ),
81 'originPropFields' => isset( $prop['originPropFields'] ) ? [
82 'elType' => sanitize_text_field( $prop['originPropFields']['elType'] ),
83 'widgetType' => sanitize_text_field( $prop['originPropFields']['widgetType'] ),
84 'propKey' => sanitize_text_field( $prop['originPropFields']['propKey'] ),
85 'elementId' => sanitize_key( $prop['originPropFields']['elementId'] ),
86 ] : null,
87 ];
88
89 return $result->wrap( $sanitized_prop );
90 }
91
92 private function is_with_origin_prop_fields( array $prop ): bool {
93 return ! empty( $prop['originPropFields'] );
94 }
95
96 private function get_origin_prop_type( array $prop ) {
97 if ( $this->is_with_origin_prop_fields( $prop ) ) {
98 return $this->get_origin_prop_type( $prop['originPropFields'] );
99 }
100
101 return Parsing_Utils::get_prop_type(
102 $prop['elType'],
103 $prop['widgetType'],
104 $prop['propKey'],
105 );
106 }
107
108 private function get_final_origin_value( array $prop ) {
109 if ( empty( $prop ) || empty( $prop['originValue'] ) ) {
110 return null;
111 }
112
113 if (
114 isset( $prop['originValue']['$$type'] ) &&
115 Override_Prop_Type::get_key() === $prop['originValue']['$$type']
116 ) {
117 return $prop['originValue']['value']['override_value'];
118 }
119
120 return $prop['originValue'];
121 }
122
123 private function get_sanitized_origin_value( array $prop ) {
124 $origin_value = $this->get_final_origin_value( $prop );
125 $origin_prop_type = $this->get_origin_prop_type( $prop );
126
127 if ( ! empty( $origin_value ) ) {
128 $sanitized_value = $origin_prop_type->sanitize( $origin_value );
129
130 if ( Override_Prop_Type::get_key() === $prop['originValue']['$$type'] ) {
131 $raw_origin_value = $prop['originValue'];
132 $raw_origin_value['value']['override_value'] = $sanitized_value;
133 return $raw_origin_value;
134 }
135
136 return $sanitized_value;
137 }
138
139 return null;
140 }
141 }
142