PluginProbe
Elementor Website Builder – more than just a page builder / 4.3.0-beta2
Elementor Website Builder – more than just a page builder v4.3.0-beta2
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 / variants / component-variants-parser.php

component-variants-parser.php in Elementor Website Builder – more than just a page builder 4.3.0-beta2, at modules/components/variants/component-variants-parser.php

103 lines 2.2 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\Variants;
4
5 use Elementor\Core\Utils\Api\Parse_Result;
6
7 if ( ! defined( 'ABSPATH' ) ) {
8 exit;
9 }
10
11 /**
12 * Validates and sanitizes the component variants meta payload.
13 *
14 * Valid input example:
15 * ```
16 * [
17 * 'variants' => [
18 * [
19 * 'id' => 'v_g8k3nq00',
20 * 'label' => 'Green',
21 * 'widgets' => [
22 * 'e-button-123' => [
23 * 'settings' => [ 'classes' => [ 'add' => [ 'g_abc123' ] ] ],
24 * 'variant' => 'v_btnsucc0',
25 * ],
26 * ],
27 * ],
28 * ],
29 * ];
30 * ```
31 */
32 class Component_Variants_Parser {
33 private Component_Variant_Parser $variant_parser;
34
35 public function __construct( Component_Variant_Parser $variant_parser ) {
36 $this->variant_parser = $variant_parser;
37 }
38
39 public static function make(): self {
40 return new self( Component_Variant_Parser::make() );
41 }
42
43 public function parse( $data ): Parse_Result {
44 $result = Parse_Result::make();
45
46 if ( empty( $data ) ) {
47 return $result->wrap( [] );
48 }
49
50 if ( ! is_array( $data ) ) {
51 $result->errors()->add( 'variants', 'invalid_structure' );
52
53 return $result;
54 }
55
56 if ( ! isset( $data['variants'] ) ) {
57 return $result->wrap( [] );
58 }
59
60 if ( ! is_array( $data['variants'] ) ) {
61 $result->errors()->add( 'variants', 'invalid_structure' );
62
63 return $result;
64 }
65
66 $parsed_variants = [];
67 $seen_ids = [];
68
69 foreach ( $data['variants'] as $index => $variant ) {
70 if ( ! is_array( $variant ) ) {
71 $result->errors()->add( "variants.$index", 'invalid_structure' );
72 continue;
73 }
74
75 $variant_result = $this->variant_parser->parse( $variant );
76
77 if ( ! $variant_result->is_valid() ) {
78 $result->errors()->merge( $variant_result->errors(), "variants.$index" );
79 continue;
80 }
81
82 $parsed_variant = $variant_result->unwrap();
83 $id = $parsed_variant['id'];
84
85 if ( isset( $seen_ids[ $id ] ) ) {
86 $result->errors()->add( "variants.$index.id", 'duplicate_id' );
87 continue;
88 }
89
90 $seen_ids[ $id ] = true;
91 $parsed_variants[] = $parsed_variant;
92 }
93
94 if ( ! $result->is_valid() ) {
95 return $result;
96 }
97
98 return $result->wrap( [
99 'variants' => $parsed_variants,
100 ] );
101 }
102 }
103