Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/elementor/includes/controls/groups/base.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + <?php
2 + namespace Elementor;
3 +
4 + if ( ! defined( 'ABSPATH' ) ) {
5 + exit; // Exit if accessed directly.
6 + }
7 +
8 + /**
9 + * Elementor group control base.
10 + *
11 + * An abstract class for creating new group controls in the panel.
12 + *
13 + * @since 1.0.0
14 + * @abstract
15 + */
16 + abstract class Group_Control_Base implements Group_Control_Interface {
17 +
18 + /**
19 + * Arguments.
20 + *
21 + * Holds all the group control arguments.
22 + *
23 + * @access private
24 + *
25 + * @var array Group control arguments.
26 + */
27 + private $args = [];
28 +
29 + /**
30 + * Options.
31 + *
32 + * Holds all the group control options.
33 + *
34 + * Currently supports only the popover options.
35 + *
36 + * @access private
37 + *
38 + * @var array Group control options.
39 + */
40 + private $options;
41 +
42 + /**
43 + * Get options.
44 + *
45 + * Retrieve group control options. If options are not set, it will initialize default options.
46 + *
47 + * @since 1.9.0
48 + * @access public
49 + *
50 + * @param array $option Optional. Single option.
51 + *
52 + * @return mixed Group control options. If option parameter was not specified, it will
53 + * return an array of all the options. If single option specified, it will
54 + * return the option value or `null` if option does not exists.
55 + */
56 + final public function get_options( $option = null ) {
57 + if ( null === $this->options ) {
58 + $this->init_options();
59 + }
60 +
61 + if ( $option ) {
62 + if ( isset( $this->options[ $option ] ) ) {
63 + return $this->options[ $option ];
64 + }
65 +
66 + return null;
67 + }
68 +
69 + return $this->options;
70 + }
71 +
72 + /**
73 + * Add new controls to stack.
74 + *
75 + * Register multiple controls to allow the user to set/update data.
76 + *
77 + * @since 1.0.0
78 + * @access public
79 + *
80 + * @param Controls_Stack $element The element stack.
81 + * @param array $user_args The control arguments defined by the user.
82 + * @param array $options Optional. The element options. Default is
83 + * an empty array.
84 + */
85 + final public function add_controls( Controls_Stack $element, array $user_args, array $options = [] ) {
86 + $this->init_args( $user_args );
87 +
88 + // Filter which controls to display
89 + $filtered_fields = $this->filter_fields();
90 + $filtered_fields = $this->prepare_fields( $filtered_fields );
91 +
92 + // For php < 7
93 + reset( $filtered_fields );
94 +
95 + if ( isset( $this->args['separator'] ) ) {
96 + $filtered_fields[ key( $filtered_fields ) ]['separator'] = $this->args['separator'];
97 + }
98 +
99 + $has_injection = false;
100 +
101 + if ( ! empty( $options['position'] ) ) {
102 + $has_injection = true;
103 +
104 + $element->start_injection( $options['position'] );
105 +
106 + unset( $options['position'] );
107 + }
108 +
109 + if ( $this->get_options( 'popover' ) ) {
110 + $this->start_popover( $element );
111 + }
112 +
113 + foreach ( $filtered_fields as $field_id => $field_args ) {
114 + // Add the global group args to the control
115 + $field_args = $this->add_group_args_to_field( $field_id, $field_args );
116 +
117 + // Register the control
118 + $id = $this->get_controls_prefix() . $field_id;
119 +
120 + if ( ! empty( $field_args['responsive'] ) ) {
121 + unset( $field_args['responsive'] );
122 +
123 + $element->add_responsive_control( $id, $field_args, $options );
124 + } else {
125 + $element->add_control( $id, $field_args, $options );
126 + }
127 + }
128 +
129 + if ( $this->get_options( 'popover' ) ) {
130 + $element->end_popover();
131 + }
132 +
133 + if ( $has_injection ) {
134 + $element->end_injection();
135 + }
136 + }
137 +
138 + /**
139 + * Get arguments.
140 + *
141 + * Retrieve group control arguments.
142 + *
143 + * @since 1.0.0
144 + * @access public
145 + *
146 + * @return array Group control arguments.
147 + */
148 + final public function get_args() {
149 + return $this->args;
150 + }
151 +
152 + /**
153 + * Get fields.
154 + *
155 + * Retrieve group control fields.
156 + *
157 + * @since 1.2.2
158 + * @access public
159 + *
160 + * @return array Control fields.
161 + */
162 + final public function get_fields() {
163 + if ( null === static::$fields ) {
164 + static::$fields = $this->init_fields();
165 + }
166 +
167 + return static::$fields;
168 + }
169 +
170 + /**
171 + * Get controls prefix.
172 + *
173 + * Retrieve the prefix of the group control, which is `{{ControlName}}_`.
174 + *
175 + * @since 1.0.0
176 + * @access public
177 + *
178 + * @return string Control prefix.
179 + */
180 + public function get_controls_prefix() {
181 + return $this->args['name'] . '_';
182 + }
183 +
184 + /**
185 + * Get group control classes.
186 + *
187 + * Retrieve the classes of the group control.
188 + *
189 + * @since 1.0.0
190 + * @access public
191 + *
192 + * @return string Group control classes.
193 + */
194 + public function get_base_group_classes() {
195 + return 'elementor-group-control-' . static::get_type() . ' elementor-group-control';
196 + }
197 +
198 + /**
199 + * Init fields.
200 + *
201 + * Initialize group control fields.
202 + *
203 + * @abstract
204 + * @since 1.2.2
205 + * @access protected
206 + */
207 + abstract protected function init_fields();
208 +
209 + /**
210 + * Get default options.
211 + *
212 + * Retrieve the default options of the group control. Used to return the
213 + * default options while initializing the group control.
214 + *
215 + * @since 1.9.0
216 + * @access protected
217 + *
218 + * @return array Default group control options.
219 + */
220 + protected function get_default_options() {
221 + return [];
222 + }
223 +
224 + /**
225 + * Get child default arguments.
226 + *
227 + * Retrieve the default arguments for all the child controls for a specific group
228 + * control.
229 + *
230 + * @since 1.2.2
231 + * @access protected
232 + *
233 + * @return array Default arguments for all the child controls.
234 + */
235 + protected function get_child_default_args() {
236 + return [];
237 + }
238 +
239 + /**
240 + * Filter fields.
241 + *
242 + * Filter which controls to display, using `include`, `exclude` and the
243 + * `condition` arguments.
244 + *
245 + * @since 1.2.2
246 + * @access protected
247 + *
248 + * @return array Control fields.
249 + */
250 + protected function filter_fields() {
251 + $args = $this->get_args();
252 +
253 + $fields = $this->get_fields();
254 +
255 + if ( ! empty( $args['include'] ) ) {
256 + $fields = array_intersect_key( $fields, array_flip( $args['include'] ) );
257 + }
258 +
259 + if ( ! empty( $args['exclude'] ) ) {
260 + $fields = array_diff_key( $fields, array_flip( $args['exclude'] ) );
261 + }
262 +
263 + return $fields;
264 + }
265 +
266 + /**
267 + * Add group arguments to field.
268 + *
269 + * Register field arguments to group control.
270 + *
271 + * @since 1.2.2
272 + * @access protected
273 + *
274 + * @param string $control_id Group control id.
275 + * @param array $field_args Group control field arguments.
276 + *
277 + * @return array
278 + */
279 + protected function add_group_args_to_field( $control_id, $field_args ) {
280 + $args = $this->get_args();
281 +
282 + if ( ! empty( $args['tab'] ) ) {
283 + $field_args['tab'] = $args['tab'];
284 + }
285 +
286 + if ( ! empty( $args['section'] ) ) {
287 + $field_args['section'] = $args['section'];
288 + }
289 +
290 + $field_args['classes'] = $this->get_base_group_classes() . ' elementor-group-control-' . $control_id;
291 +
292 + foreach ( [ 'condition', 'conditions' ] as $condition_type ) {
293 + if ( ! empty( $args[ $condition_type ] ) ) {
294 + if ( empty( $field_args[ $condition_type ] ) ) {
295 + $field_args[ $condition_type ] = [];
296 + }
297 +
298 + $field_args[ $condition_type ] += $args[ $condition_type ];
299 + }
300 + }
301 +
302 + return $field_args;
303 + }
304 +
305 + /**
306 + * Prepare fields.
307 + *
308 + * Process group control fields before adding them to `add_control()`.
309 + *
310 + * @since 1.2.2
311 + * @access protected
312 + *
313 + * @param array $fields Group control fields.
314 + *
315 + * @return array Processed fields.
316 + */
317 + protected function prepare_fields( $fields ) {
318 + $popover_options = $this->get_options( 'popover' );
319 +
320 + $popover_name = ! $popover_options ? null : $popover_options['starter_name'];
321 +
322 + foreach ( $fields as $field_key => &$field ) {
323 + if ( $popover_name ) {
324 + $field['condition'][ $popover_name . '!' ] = '';
325 + }
326 +
327 + if ( isset( $this->args['fields_options']['__all'] ) ) {
328 + $field = array_merge( $field, $this->args['fields_options']['__all'] );
329 + }
330 +
331 + if ( isset( $this->args['fields_options'][ $field_key ] ) ) {
332 + $field = array_merge( $field, $this->args['fields_options'][ $field_key ] );
333 + }
334 +
335 + if ( ! empty( $field['condition'] ) ) {
336 + $field = $this->add_condition_prefix( $field );
337 + }
338 +
339 + if ( ! empty( $field['conditions'] ) ) {
340 + $field['conditions'] = $this->add_conditions_prefix( $field['conditions'] );
341 + }
342 +
343 + if ( ! empty( $field['selectors'] ) ) {
344 + $field['selectors'] = $this->handle_selectors( $field['selectors'] );
345 + }
346 +
347 + if ( ! empty( $field['device_args'] ) ) {
348 + foreach ( $field['device_args'] as $device => $device_arg ) {
349 + if ( ! empty( $field['device_args'][ $device ]['condition'] ) ) {
350 + $field['device_args'][ $device ] = $this->add_condition_prefix( $field['device_args'][ $device ] );
351 + }
352 +
353 + if ( ! empty( $field['device_args'][ $device ]['conditions'] ) ) {
354 + $field['device_args'][ $device ]['conditions'] = $this->add_conditions_prefix( $field['device_args'][ $device ]['conditions'] );
355 + }
356 +
357 + if ( ! empty( $device_arg['selectors'] ) ) {
358 + $field['device_args'][ $device ]['selectors'] = $this->handle_selectors( $device_arg['selectors'] );
359 + }
360 + }
361 + }
362 + }
363 +
364 + return $fields;
365 + }
366 +
367 + /**
368 + * Init options.
369 + *
370 + * Initializing group control options.
371 + *
372 + * @since 1.9.0
373 + * @access private
374 + */
375 + private function init_options() {
376 + $default_options = [
377 + 'popover' => [
378 + 'starter_name' => 'popover_toggle',
379 + 'starter_value' => 'custom',
380 + 'starter_title' => '',
381 + ],
382 + ];
383 +
384 + $this->options = array_replace_recursive( $default_options, $this->get_default_options() );
385 + }
386 +
387 + /**
388 + * Init arguments.
389 + *
390 + * Initializing group control base class.
391 + *
392 + * @since 1.2.2
393 + * @access protected
394 + *
395 + * @param array $args Group control settings value.
396 + */
397 + protected function init_args( $args ) {
398 + $this->args = array_merge( $this->get_default_args(), $this->get_child_default_args(), $args );
399 +
400 + if ( isset( $this->args['scheme'] ) ) {
401 + $this->args['global']['default'] = Plugin::$instance->kits_manager->convert_scheme_to_global( $this->args['scheme'] );
402 + }
403 + }
404 +
405 + /**
406 + * Get default arguments.
407 + *
408 + * Retrieve the default arguments of the group control. Used to return the
409 + * default arguments while initializing the group control.
410 + *
411 + * @since 1.2.2
412 + * @access private
413 + *
414 + * @return array Control default arguments.
415 + */
416 + private function get_default_args() {
417 + return [
418 + 'default' => '',
419 + 'selector' => '{{WRAPPER}}',
420 + 'fields_options' => [],
421 + ];
422 + }
423 +
424 + /**
425 + * Add condition prefix.
426 + *
427 + * Used to add the group prefix to controls with conditions, to
428 + * distinguish them from other controls with the same name.
429 + *
430 + * This way Elementor can apply condition logic to a specific control in a
431 + * group control.
432 + *
433 + * @since 1.2.0
434 + * @access private
435 + *
436 + * @param array $field Group control field.
437 + *
438 + * @return array Group control field.
439 + */
440 + private function add_condition_prefix( $field ) {
441 + $controls_prefix = $this->get_controls_prefix();
442 +
443 + $prefixed_condition_keys = array_map(
444 + function( $key ) use ( $controls_prefix ) {
445 + return $controls_prefix . $key;
446 + },
447 + array_keys( $field['condition'] )
448 + );
449 +
450 + $field['condition'] = array_combine(
451 + $prefixed_condition_keys,
452 + $field['condition']
453 + );
454 +
455 + return $field;
456 + }
457 +
458 + private function add_conditions_prefix( $conditions ) {
459 + $controls_prefix = $this->get_controls_prefix();
460 +
461 + foreach ( $conditions['terms'] as & $condition ) {
462 + if ( isset( $condition['terms'] ) ) {
463 + $condition = $this->add_conditions_prefix( $condition );
464 +
465 + continue;
466 + }
467 +
468 + $condition['name'] = $controls_prefix . $condition['name'];
469 + }
470 +
471 + return $conditions;
472 + }
473 +
474 + /**
475 + * Handle selectors.
476 + *
477 + * Used to process the CSS selector of group control fields. When using
478 + * group control, Elementor needs to apply the selector to different fields.
479 + * This method handles the process.
480 + *
481 + * In addition, it handles selector values from other fields and process the
482 + * css.
483 + *
484 + * @since 1.2.2
485 + * @access private
486 + *
487 + * @param array $selectors An array of selectors to process.
488 + *
489 + * @return array Processed selectors.
490 + */
491 + private function handle_selectors( $selectors ) {
492 + $args = $this->get_args();
493 +
494 + $selectors = array_combine(
495 + array_map(
496 + function( $key ) use ( $args ) {
497 + return str_replace( '{{SELECTOR}}', $args['selector'], $key );
498 + }, array_keys( $selectors )
499 + ),
500 + $selectors
501 + );
502 +
503 + if ( ! $selectors ) {
504 + return $selectors;
505 + }
506 +
507 + $controls_prefix = $this->get_controls_prefix();
508 +
509 + foreach ( $selectors as &$selector ) {
510 + $selector = preg_replace_callback( '/{{\K(.*?)(?=}})/', function( $matches ) use ( $controls_prefix ) {
511 + $is_external_reference = false;
512 +
513 + return preg_replace_callback( '/[^ ]+?(?=\.)\./', function( $sub_matches ) use ( $controls_prefix, &$is_external_reference ) {
514 + $placeholder = $sub_matches[0];
515 +
516 + if ( 'external.' === $placeholder ) {
517 + $is_external_reference = true;
518 +
519 + return '';
520 + }
521 +
522 + if ( $is_external_reference ) {
523 + $is_external_reference = false;
524 +
525 + return $placeholder;
526 + }
527 +
528 + return $controls_prefix . $placeholder;
529 + }, $matches[1] );
530 + }, $selector );
531 + }
532 +
533 + return $selectors;
534 + }
535 +
536 + /**
537 + * Start popover.
538 + *
539 + * Starts a group controls popover.
540 + *
541 + * @since 1.9.1
542 + * @access private
543 + * @param Controls_Stack $element Element.
544 + */
545 + private function start_popover( Controls_Stack $element ) {
546 + $popover_options = $this->get_options( 'popover' );
547 +
548 + $settings = $this->get_args();
549 +
550 + if ( isset( $settings['global'] ) ) {
551 + if ( ! isset( $popover_options['settings']['global'] ) ) {
552 + $popover_options['settings']['global'] = [];
553 + }
554 +
555 + $popover_options['settings']['global'] = array_replace_recursive( $popover_options['settings']['global'], $settings['global'] );
556 + }
557 +
558 + if ( isset( $settings['label'] ) ) {
559 + $label = $settings['label'];
560 + } else {
561 + $label = $popover_options['starter_title'];
562 + }
563 +
564 + $control_params = [
565 + 'type' => Controls_Manager::POPOVER_TOGGLE,
566 + 'label' => $label,
567 + 'return_value' => $popover_options['starter_value'],
568 + ];
569 +
570 + if ( ! empty( $popover_options['settings'] ) ) {
571 + $control_params = array_replace_recursive( $control_params, $popover_options['settings'] );
572 + }
573 +
574 + foreach ( [ 'condition', 'conditions' ] as $key ) {
575 + if ( ! empty( $settings[ $key ] ) ) {
576 + $control_params[ $key ] = $settings[ $key ];
577 + }
578 + }
579 +
580 + $starter_name = $popover_options['starter_name'];
581 +
582 + if ( isset( $this->args['fields_options'][ $starter_name ] ) ) {
583 + $control_params = array_merge( $control_params, $this->args['fields_options'][ $starter_name ] );
584 + }
585 +
586 + $control_params['groupPrefix'] = $this->get_controls_prefix();
587 +
588 + $element->add_control( $this->get_controls_prefix() . $starter_name, $control_params );
589 +
590 + $element->start_popover();
591 + }
592 + }
593 +