Edit File by line
/home/zeestwma/ceyloniy.../wp-conte.../plugins/elemento.../modules/componen.../overrida...
File: overridable-groups-parser.php
<?php
[0] Fix | Delete
[1] Fix | Delete
namespace Elementor\Modules\Components\OverridableProps;
[2] Fix | Delete
[3] Fix | Delete
use Elementor\Core\Utils\Api\Parse_Result;
[4] Fix | Delete
use Elementor\Core\Utils\Collection;
[5] Fix | Delete
use Elementor\Modules\Components\Utils\Parsing_Utils;
[6] Fix | Delete
[7] Fix | Delete
if ( ! defined( 'ABSPATH' ) ) {
[8] Fix | Delete
exit;
[9] Fix | Delete
}
[10] Fix | Delete
[11] Fix | Delete
class Overridable_Groups_Parser {
[12] Fix | Delete
public static function make(): self {
[13] Fix | Delete
return new static();
[14] Fix | Delete
}
[15] Fix | Delete
[16] Fix | Delete
public function parse( array $groups ): Parse_Result {
[17] Fix | Delete
$result = Parse_Result::make();
[18] Fix | Delete
[19] Fix | Delete
$structure_validation_result = $this->validate_structure( $groups );
[20] Fix | Delete
[21] Fix | Delete
if ( ! $structure_validation_result->is_valid() ) {
[22] Fix | Delete
return $structure_validation_result;
[23] Fix | Delete
}
[24] Fix | Delete
[25] Fix | Delete
$parsed_groups = $this->parse_groups_items( $groups['items'] );
[26] Fix | Delete
if ( ! $parsed_groups->is_valid() ) {
[27] Fix | Delete
$result->errors()->merge( $parsed_groups->errors() );
[28] Fix | Delete
[29] Fix | Delete
return $result;
[30] Fix | Delete
}
[31] Fix | Delete
[32] Fix | Delete
$parsed_order = $this->parse_groups_order( $groups['order'] );
[33] Fix | Delete
if ( ! $parsed_order->is_valid() ) {
[34] Fix | Delete
$result->errors()->merge( $parsed_order->errors() );
[35] Fix | Delete
[36] Fix | Delete
return $result;
[37] Fix | Delete
}
[38] Fix | Delete
[39] Fix | Delete
$validation_result = $this->validate( $parsed_groups->unwrap(), $parsed_order->unwrap() );
[40] Fix | Delete
[41] Fix | Delete
if ( ! $validation_result->is_valid() ) {
[42] Fix | Delete
return $validation_result;
[43] Fix | Delete
}
[44] Fix | Delete
[45] Fix | Delete
$sanitized_groups = $this->sanitize( $parsed_groups->unwrap(), $parsed_order->unwrap() );
[46] Fix | Delete
[47] Fix | Delete
return Parse_Result::make()->wrap( $sanitized_groups );
[48] Fix | Delete
}
[49] Fix | Delete
[50] Fix | Delete
private function validate_structure( array $groups ): Parse_Result {
[51] Fix | Delete
$result = Parse_Result::make();
[52] Fix | Delete
[53] Fix | Delete
$inner_fields = [ 'items', 'order' ];
[54] Fix | Delete
[55] Fix | Delete
foreach ( $inner_fields as $inner_field ) {
[56] Fix | Delete
if ( ! isset( $groups[ $inner_field ] ) ) {
[57] Fix | Delete
$result->errors()->add( "groups.$inner_field", 'missing' );
[58] Fix | Delete
[59] Fix | Delete
return $result;
[60] Fix | Delete
}
[61] Fix | Delete
[62] Fix | Delete
if ( ! is_array( $groups[ $inner_field ] ) ) {
[63] Fix | Delete
$result->errors()->add( "groups.$inner_field", 'invalid_structure' );
[64] Fix | Delete
[65] Fix | Delete
return $result;
[66] Fix | Delete
}
[67] Fix | Delete
}
[68] Fix | Delete
[69] Fix | Delete
foreach ( $groups['items'] as $group_id => $group ) {
[70] Fix | Delete
if ( ! is_array( $group ) ) {
[71] Fix | Delete
$result->errors()->add( "groups.items.$group_id", 'invalid_structure' );
[72] Fix | Delete
[73] Fix | Delete
continue;
[74] Fix | Delete
}
[75] Fix | Delete
[76] Fix | Delete
$required_fields = [ 'id', 'label', 'props' ];
[77] Fix | Delete
[78] Fix | Delete
foreach ( $required_fields as $field ) {
[79] Fix | Delete
if ( ! isset( $group[ $field ] ) ) {
[80] Fix | Delete
$result->errors()->add( "groups.items.$group_id.$field", 'missing' );
[81] Fix | Delete
}
[82] Fix | Delete
}
[83] Fix | Delete
[84] Fix | Delete
if ( isset( $group['props'] ) && ! is_array( $group['props'] ) ) {
[85] Fix | Delete
$result->errors()->add( "groups.items.$group_id.props", 'invalid_structure' );
[86] Fix | Delete
}
[87] Fix | Delete
}
[88] Fix | Delete
[89] Fix | Delete
return $result;
[90] Fix | Delete
}
[91] Fix | Delete
[92] Fix | Delete
private function validate( array $items, array $order ): Parse_Result {
[93] Fix | Delete
$result = Parse_Result::make();
[94] Fix | Delete
[95] Fix | Delete
$items_ids_collection = Collection::make( $items )->keys();
[96] Fix | Delete
$order_collection = Collection::make( $order );
[97] Fix | Delete
[98] Fix | Delete
$excess_ids = $order_collection->diff( $items_ids_collection );
[99] Fix | Delete
$missing_ids = $items_ids_collection->diff( $order_collection );
[100] Fix | Delete
[101] Fix | Delete
$excess_ids->each( fn( $id ) => $result->errors()->add( "groups.order.$id", 'excess' ) );
[102] Fix | Delete
$missing_ids->each( fn( $id ) => $result->errors()->add( "groups.order.$id", 'missing' ) );
[103] Fix | Delete
[104] Fix | Delete
return $result;
[105] Fix | Delete
}
[106] Fix | Delete
[107] Fix | Delete
private function parse_groups_items( array $items ): Parse_Result {
[108] Fix | Delete
$result = Parse_Result::make();
[109] Fix | Delete
[110] Fix | Delete
$validate_groups_items_result = $this->validate_groups_items( $items );
[111] Fix | Delete
[112] Fix | Delete
if ( ! $validate_groups_items_result->is_valid() ) {
[113] Fix | Delete
$result->errors()->merge( $validate_groups_items_result->errors() );
[114] Fix | Delete
[115] Fix | Delete
return $result;
[116] Fix | Delete
}
[117] Fix | Delete
[118] Fix | Delete
return Parse_Result::make()->wrap( $this->sanitize_groups_items( $items ) );
[119] Fix | Delete
}
[120] Fix | Delete
[121] Fix | Delete
private function validate_groups_items( array $items ): Parse_Result {
[122] Fix | Delete
$result = Parse_Result::make();
[123] Fix | Delete
[124] Fix | Delete
$labels = [];
[125] Fix | Delete
[126] Fix | Delete
foreach ( $items as $group_id => $group ) {
[127] Fix | Delete
if ( $group_id !== $group['id'] ) {
[128] Fix | Delete
$result->errors()->add( "groups.items.$group_id.id", 'mismatching_value' );
[129] Fix | Delete
}
[130] Fix | Delete
[131] Fix | Delete
$duplicate_props = Parsing_Utils::get_duplicates( $group['props'] );
[132] Fix | Delete
[133] Fix | Delete
if ( ! empty( $duplicate_props ) ) {
[134] Fix | Delete
$result->errors()->add( "groups.items.$group_id.props", 'duplicate_props: ' . implode( ', ', $duplicate_props ) );
[135] Fix | Delete
}
[136] Fix | Delete
[137] Fix | Delete
$labels[] = $group['label'];
[138] Fix | Delete
}
[139] Fix | Delete
[140] Fix | Delete
$duplicate_labels = Parsing_Utils::get_duplicates( $labels );
[141] Fix | Delete
[142] Fix | Delete
if ( ! empty( $duplicate_labels ) ) {
[143] Fix | Delete
$result->errors()->add( 'groups.items', 'duplicate_labels: ' . implode( ', ', $duplicate_labels ) );
[144] Fix | Delete
}
[145] Fix | Delete
[146] Fix | Delete
return $result;
[147] Fix | Delete
}
[148] Fix | Delete
[149] Fix | Delete
private function parse_groups_order( array $order ): Parse_Result {
[150] Fix | Delete
$result = Parse_Result::make();
[151] Fix | Delete
[152] Fix | Delete
$validate_groups_order_result = $this->validate_groups_order( $order );
[153] Fix | Delete
[154] Fix | Delete
if ( ! $validate_groups_order_result->is_valid() ) {
[155] Fix | Delete
return $validate_groups_order_result;
[156] Fix | Delete
}
[157] Fix | Delete
[158] Fix | Delete
return Parse_Result::make()->wrap( $this->sanitize_groups_order( $order ) );
[159] Fix | Delete
}
[160] Fix | Delete
[161] Fix | Delete
private function validate_groups_order( array $order ): Parse_Result {
[162] Fix | Delete
$result = Parse_Result::make();
[163] Fix | Delete
[164] Fix | Delete
$order_collection = Collection::make( $order );
[165] Fix | Delete
$non_string_items = $order_collection->some( fn( $item ) => ! is_string( $item ) );
[166] Fix | Delete
[167] Fix | Delete
if ( $non_string_items ) {
[168] Fix | Delete
$result->errors()->add( 'groups.order', 'non_string_items' );
[169] Fix | Delete
[170] Fix | Delete
return $result;
[171] Fix | Delete
}
[172] Fix | Delete
[173] Fix | Delete
if ( Parsing_Utils::get_duplicates( $order ) ) {
[174] Fix | Delete
$result->errors()->add( 'groups.order', 'duplicate_ids' );
[175] Fix | Delete
[176] Fix | Delete
return $result;
[177] Fix | Delete
}
[178] Fix | Delete
[179] Fix | Delete
return $result;
[180] Fix | Delete
}
[181] Fix | Delete
[182] Fix | Delete
private function sanitize( array $items, array $order ): array {
[183] Fix | Delete
return [
[184] Fix | Delete
'items' => $items,
[185] Fix | Delete
'order' => $order,
[186] Fix | Delete
];
[187] Fix | Delete
}
[188] Fix | Delete
[189] Fix | Delete
private function sanitize_groups_items( array $items ): array {
[190] Fix | Delete
$sanitized_items = [];
[191] Fix | Delete
[192] Fix | Delete
foreach ( $items as $group_id => $group ) {
[193] Fix | Delete
$sanitized_group_id = sanitize_key( $group_id );
[194] Fix | Delete
$sanitized_items[ $sanitized_group_id ] = $this->sanitize_single_group( $group );
[195] Fix | Delete
}
[196] Fix | Delete
[197] Fix | Delete
return $sanitized_items;
[198] Fix | Delete
}
[199] Fix | Delete
[200] Fix | Delete
private function sanitize_single_group( array $group ): array {
[201] Fix | Delete
return [
[202] Fix | Delete
'id' => sanitize_key( $group['id'] ),
[203] Fix | Delete
'label' => sanitize_text_field( $group['label'] ),
[204] Fix | Delete
'props' => array_map( 'sanitize_key', $group['props'] ),
[205] Fix | Delete
];
[206] Fix | Delete
}
[207] Fix | Delete
[208] Fix | Delete
private function sanitize_groups_order( array $order ): array {
[209] Fix | Delete
return Collection::make( $order )
[210] Fix | Delete
->map( fn( $item ) => sanitize_key( $item ) )
[211] Fix | Delete
->values();
[212] Fix | Delete
}
[213] Fix | Delete
}
[214] Fix | Delete
[215] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function