PluginProbe
Elementor Website Builder – more than just a page builder / 3.31.2
Elementor Website Builder – more than just a page builder v3.31.2
4.3.1 4.3.0 4.3.0-beta3 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 All 454 releases
← All changes | modules/global-classes/global-classes-rest-api.php +16 -126 4.0.73.31.2 View file →
@@ -2,10 +2,10 @@
2 2
3 3 namespace Elementor\Modules\GlobalClasses;
4 4
5 5 use Elementor\Modules\GlobalClasses\Usage\Applied_Global_Classes_Usage;
6 -use Elementor\Core\Utils\Api\Error_Builder;
7 -use Elementor\Core\Utils\Api\Response_Builder;
6 +use Elementor\Modules\GlobalClasses\Utils\Error_Builder;
7 +use Elementor\Modules\GlobalClasses\Utils\Response_Builder;
8 8 use Elementor\Modules\GlobalClasses\Database\Migrations\Add_Capabilities;
9 9
10 10 if ( ! defined( 'ABSPATH' ) ) {
11 11 exit; // Exit if accessed directly.
@@ -11,14 +11,14 @@
11 11 exit; // Exit if accessed directly.
12 12 }
13 13
14 14 class Global_Classes_REST_API {
15 +
15 16 const API_NAMESPACE = 'elementor/v1';
16 17 const API_BASE = 'global-classes';
17 18 const API_BASE_USAGE = self::API_BASE . '/usage';
18 - const MAX_ITEMS = 100;
19 - const LABEL_PREFIX = 'DUP_';
20 - const MAX_LABEL_LENGTH = 50;
19 + const MAX_ITEMS = 50;
20 +
21 21 private $repository = null;
22 22
23 23 public function register_hooks() {
24 24 add_action( 'rest_api_init', fn() => $this->register_routes() );
@@ -32,13 +32,13 @@
32 32 return $this->repository;
33 33 }
34 34
35 35 private function register_routes() {
36 - register_rest_route( self::API_NAMESPACE, '/' . self::API_BASE, [
36 + register_rest_route(self::API_NAMESPACE, '/' . self::API_BASE, [
37 37 [
38 38 'methods' => 'GET',
39 39 'callback' => fn( $request ) => $this->route_wrapper( fn() => $this->all( $request ) ),
40 - 'permission_callback' => fn() => is_user_logged_in(),
40 + 'permission_callback' => fn() => true,
41 41 'args' => [
42 42 'context' => [
43 43 'type' => 'string',
44 44 'required' => false,
@@ -49,11 +49,11 @@
49 49 ],
50 50 ],
51 51 ],
52 52 ],
53 - ] );
53 + ]);
54 54
55 - register_rest_route( self::API_NAMESPACE, '/' . self::API_BASE_USAGE, [
55 + register_rest_route(self::API_NAMESPACE, '/' . self::API_BASE_USAGE, [
56 56 [
57 57 'callback' => fn() => $this->route_wrapper( fn() => $this->get_usage() ),
58 58 'permission_callback' => fn() => current_user_can( 'manage_options' ),
59 59 'args' => [
@@ -67,11 +67,11 @@
67 67 ],
68 68 ],
69 69 ],
70 70 ],
71 - ] );
71 + ]);
72 72
73 - register_rest_route( self::API_NAMESPACE, '/' . self::API_BASE, [
73 + register_rest_route(self::API_NAMESPACE, '/' . self::API_BASE, [
74 74 [
75 75 'methods' => 'PUT',
76 76 'callback' => fn( $request ) => $this->route_wrapper( fn() => $this->put( $request ) ),
77 77 'permission_callback' => fn() => current_user_can( Add_Capabilities::UPDATE_CLASS ),
@@ -141,9 +141,9 @@
141 141 ],
142 142 ],
143 143 ],
144 144 ],
145 - ] );
145 + ]);
146 146 }
147 147
148 148 private function all( \WP_REST_Request $request ) {
149 149 $context = $request->get_param( 'context' );
@@ -161,20 +161,9 @@
161 161 return Response_Builder::make( (object) $classes_usage )->build();
162 162 }
163 163
164 164 private function put( \WP_REST_Request $request ) {
165 - $context = $request->get_param( 'context' );
166 - $changes = $request->get_param( 'changes' ) ?? [];
167 - $new_added_items_ids = $changes['added'] ?? [];
168 165 $parser = Global_Classes_Parser::make();
169 - $existing_labels = Global_Classes_Repository::make()
170 - ->context( $context )
171 - ->all()
172 - ->get_items()
173 - ->map( function ( $item ) {
174 - return $item['label'];
175 - } )
176 - ->all();
177 166
178 167 $items_result = $parser->parse_items(
179 168 $request->get_param( 'items' )
180 169 );
@@ -180,19 +169,14 @@
180 169 );
181 170
182 171 $items_count = count( $items_result->unwrap() );
183 172
184 - if ( $items_count > self::MAX_ITEMS ) {
173 + if ( $items_count >= static::MAX_ITEMS ) {
185 174 return Error_Builder::make( 'global_classes_limit_exceeded' )
186 175 ->set_status( 400 )
187 - ->set_meta([
188 - 'current_count' => $items_count,
189 - 'max_allowed' => self::MAX_ITEMS,
190 - ])
191 176 ->set_message(sprintf(
192 - /* translators: %d: Maximum allowed items. */
193 177 __( 'Global classes limit exceeded. Maximum allowed: %d', 'elementor' ),
194 - self::MAX_ITEMS
178 + static::MAX_ITEMS
195 179 ))
196 180 ->build();
197 181 }
198 182
@@ -219,41 +203,16 @@
219 203 ->context( $request->get_param( 'context' ) );
220 204
221 205 $changes_resolver = Global_Classes_Changes_Resolver::make(
222 206 $repository,
223 - $changes,
207 + $request->get_param( 'changes' ) ?? [],
224 208 );
225 209
226 - $duplicated_labels = Global_Classes_Parser::check_for_duplicate_labels(
227 - $existing_labels,
228 - $items_result->unwrap(),
229 - $new_added_items_ids
230 - );
231 -
232 - $final_items = $items_result->unwrap();
233 - $duplicate_validation_result = null;
234 -
235 - if ( ! empty( $duplicated_labels ) ) {
236 - $modified_labels = $this->handle_duplicates( $duplicated_labels, $existing_labels );
237 - $duplicate_validation_result = $modified_labels;
238 - foreach ( $modified_labels as $item_id => $labels ) {
239 - $final_items[ $item_id ]['label'] = $labels['modified'];
240 - }
241 - }
242 -
243 210 $repository->put(
244 - $changes_resolver->resolve_items( $final_items ),
211 + $changes_resolver->resolve_items( $items_result->unwrap() ),
245 212 $changes_resolver->resolve_order( $order_result->unwrap() ),
246 213 );
247 214
248 - if ( $duplicate_validation_result ) {
249 - $response_data = [
250 - 'code' => 'DUPLICATED_LABEL',
251 - 'modifiedLabels' => $duplicate_validation_result,
252 - ];
253 - return Response_Builder::make( $response_data )->build();
254 - }
255 -
256 215 return Response_Builder::make()->no_content()->build();
257 216 }
258 217
259 218 private function route_wrapper( callable $cb ) {
@@ -265,75 +224,6 @@
265 224 ->build();
266 225 }
267 226
268 227 return $response;
269 - }
270 -
271 - private function handle_duplicates( array $duplicate_labels, array $existing_labels ) {
272 -
273 - $modified_labels = [];
274 -
275 - foreach ( $duplicate_labels as $duplicate_label ) {
276 - $item_id = $duplicate_label['item_id'];
277 - $original_label = $duplicate_label['label'];
278 -
279 - $modified_label = $this->generate_unique_label( $original_label, $existing_labels );
280 -
281 - $modified_labels[ $item_id ] = [
282 - 'original' => $original_label,
283 - 'modified' => $modified_label,
284 - ];
285 - }
286 -
287 - return $modified_labels;
288 - }
289 -
290 -
291 - private function generate_unique_label( $original_label, $existing_labels ) {
292 - $prefix = self::LABEL_PREFIX;
293 - $max_length = self::MAX_LABEL_LENGTH;
294 -
295 - $has_prefix = strpos( $original_label, $prefix ) === 0;
296 -
297 - if ( $has_prefix ) {
298 - $base_label = substr( $original_label, strlen( $prefix ) );
299 -
300 - $counter = 1;
301 - $new_label = $prefix . $base_label . $counter;
302 -
303 - while ( in_array( $new_label, $existing_labels, true ) ) {
304 - ++$counter;
305 - $new_label = $prefix . $base_label . $counter;
306 - }
307 -
308 - if ( strlen( $new_label ) > $max_length ) {
309 - $available_length = $max_length - strlen( $prefix . $counter );
310 - $base_label = substr( $base_label, 0, $available_length );
311 - $new_label = $prefix . $base_label . $counter;
312 - }
313 - } else {
314 - $new_label = $prefix . $original_label;
315 -
316 - if ( strlen( $new_label ) > $max_length ) {
317 - $available_length = $max_length - strlen( $prefix );
318 - $new_label = $prefix . substr( $original_label, 0, $available_length );
319 - }
320 -
321 - $counter = 1;
322 - $base_label = substr( $original_label, 0, $available_length ?? strlen( $original_label ) );
323 -
324 - while ( in_array( $new_label, $existing_labels, true ) ) {
325 - $new_label = $prefix . $base_label . $counter;
326 -
327 - if ( strlen( $new_label ) > $max_length ) {
328 - $available_length = $max_length - strlen( $prefix . $counter );
329 - $base_label = substr( $original_label, 0, $available_length );
330 - $new_label = $prefix . $base_label . $counter;
331 - }
332 -
333 - ++$counter;
334 - }
335 - }
336 -
337 - return $new_label;
338 228 }
339 229 }