PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.5.2
ShopBuilder – WooCommerce Builder For Elementor v2.5.2
3.4.2 3.4.1 3.4.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 All 63 releases
shopbuilder / app / Elementor / Widgets / Controls / LayoutFields.php

LayoutFields.php in ShopBuilder – WooCommerce Builder For Elementor 2.5.2, at app/Elementor/Widgets/Controls/LayoutFields.php

1,039 lines 33.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Elementor Layout Fields Class.
4 *
5 * This class contains all the common fields for Layout tab.
6 *
7 * @package RadiusTheme\SB
8 */
9
10 namespace RadiusTheme\SB\Elementor\Widgets\Controls;
11
12 use RadiusTheme\SB\Helpers\Fns;
13 use RadiusTheme\SB\Elementor\Helper\ControlHelper;
14
15 // Do not allow directly accessing this file.
16 if ( ! defined( 'ABSPATH' ) ) {
17 exit( 'This script cannot be accessed directly.' );
18 }
19
20 /**
21 * Elementor Layout Fields Class.
22 */
23 class LayoutFields {
24 /**
25 * Tab name.
26 *
27 * @access private
28 * @static
29 *
30 * @var array
31 */
32 private static $tab = 'layout';
33
34 /**
35 * Grid Layout section
36 *
37 * @param object $obj Reference object.
38 *
39 * @return array
40 */
41 public static function grid_layout( $obj ) {
42 $fields['layout_section'] = $obj->start_section(
43 esc_html__( 'Presentation', 'shopbuilder' ),
44 self::$tab
45 );
46
47 $fields['layout_note'] = $obj->el_heading( esc_html__( 'Predefined Layouts', 'shopbuilder' ) );
48
49 $fields['layout'] = [
50 'type' => 'rtsb-image-selector',
51 'options' => ControlHelper::grid_layouts(),
52 'default' => 'grid-layout1',
53 ];
54
55 $fields = array_merge( $fields, self::structure( $obj ) );
56 $fields = array_merge( $fields, self::action_btn_presets( $obj ) );
57
58 $fields['layout_section_end'] = $obj->end_section();
59
60 return apply_filters( 'rtsb/elements/elementor/grid_layout_control', $fields, $obj );
61 }
62
63 /**
64 * List Layout section
65 *
66 * @param object $obj Reference object.
67 *
68 * @return array
69 */
70 public static function list_layout( $obj ) {
71 $fields['layout_section'] = $obj->start_section(
72 esc_html__( 'Layouts', 'shopbuilder' ),
73 self::$tab
74 );
75
76 $fields['layout_note'] = $obj->el_heading( esc_html__( 'Predefined Layouts', 'shopbuilder' ) );
77
78 $fields['layout'] = [
79 'type' => 'rtsb-image-selector',
80 'options' => ControlHelper::list_layouts(),
81 'default' => 'list-layout1',
82 ];
83
84 $fields = array_merge( $fields, self::structure( $obj ) );
85 $fields = array_merge( $fields, self::action_btn_presets( $obj ) );
86
87 unset( $fields['action_btn_preset'] );
88 unset( $fields['action_btn_position'] );
89
90 $fields['layout_section_end'] = $obj->end_section();
91
92 return apply_filters( 'rtsb/elements/elementor/list_layout_control', $fields, $obj );
93 }
94
95 /**
96 * Slider Layout section
97 *
98 * @param object $obj Reference object.
99 *
100 * @return array
101 */
102 public static function slider_layout( $obj ) {
103 $fields['layout_section'] = $obj->start_section(
104 esc_html__( 'Slider Layouts', 'shopbuilder' ),
105 self::$tab
106 );
107
108 $fields['layout_note'] = $obj->el_heading( esc_html__( 'Predefined Layouts', 'shopbuilder' ) );
109
110 $fields['layout'] = [
111 'type' => 'rtsb-image-selector',
112 'options' => ControlHelper::slider_layouts(),
113 'default' => 'slider-layout1',
114 ];
115
116 $fields = array_merge( $fields, self::structure_slider( $obj ) );
117 $fields = array_merge( $fields, self::action_btn_presets( $obj ) );
118
119 $fields['layout_section_end'] = $obj->end_section();
120
121 return apply_filters( 'rtsb/elements/elementor/slider_layout_control', $fields, $obj );
122 }
123
124 /**
125 * Category Layout section
126 *
127 * @param object $obj Reference object.
128 *
129 * @return array
130 */
131 public static function category_layout( $obj ) {
132 $fields['layout_section'] = $obj->start_section(
133 esc_html__( 'Layouts', 'shopbuilder' ),
134 self::$tab
135 );
136
137 $fields['layout'] = [
138 'type' => 'rtsb-image-selector',
139 'options' => ControlHelper::category_layouts(),
140 'default' => 'category-layout1',
141 ];
142
143 $fields = array_merge( $fields, self::structure( $obj ) );
144
145 if ( 'rtsb-product-categories-general' === $obj->rtsb_base ) {
146 $fields['cols']['render_type'] = 'template';
147 }
148
149 $fields['cat_height'] = [
150 'type' => 'slider',
151 'mode' => 'responsive',
152 'label' => esc_html__( 'Element Height', 'shopbuilder' ),
153 'size_units' => [ 'px', '%' ],
154 'range' => [
155 'px' => [
156 'min' => 0,
157 'max' => 1500,
158 'step' => 1,
159 ],
160 '%' => [
161 'min' => 0,
162 'max' => 100,
163 'step' => 1,
164 ],
165 ],
166 'description' => esc_html__( 'Please select the element height.', 'shopbuilder' ),
167 'selectors' => [
168 $obj->selectors['category_multi_layout']['cat_height'] => 'height: {{SIZE}}{{UNIT}};',
169 ],
170 ];
171
172 $fields['layout_section_end'] = $obj->end_section();
173
174 return apply_filters( 'rtsb/elements/elementor/cat_layout_control', $fields, $obj );
175 }
176
177 /**
178 * Category Layout section
179 *
180 * @param object $obj Reference object.
181 *
182 * @return array
183 */
184 public static function category_single_layout( $obj ) {
185 $fields['layout_section'] = $obj->start_section(
186 esc_html__( 'Layouts', 'shopbuilder' ),
187 self::$tab
188 );
189
190 $fields['layout'] = [
191 'type' => 'rtsb-image-selector',
192 'options' => ControlHelper::single_category_layouts(),
193 'default' => 'category-single-layout1',
194 ];
195
196 $fields['cat_alignment'] = [
197 'mode' => 'responsive',
198 'type' => 'choose',
199 'label' => esc_html__( 'Element Alignment', 'shopbuilder' ),
200 'options' => [
201 'left' => [
202 'title' => esc_html__( 'Left', 'shopbuilder' ),
203 'icon' => 'eicon-text-align-left',
204 ],
205 'center' => [
206 'title' => esc_html__( 'Center', 'shopbuilder' ),
207 'icon' => 'eicon-text-align-center',
208 ],
209 'right' => [
210 'title' => esc_html__( 'Right', 'shopbuilder' ),
211 'icon' => 'eicon-text-align-right',
212 ],
213 ],
214 'selectors' => [
215 $obj->selectors['category_single_layout']['cat_alignment']['text_align'] => 'text-align: {{VALUE}};',
216 $obj->selectors['category_single_layout']['cat_alignment']['justify_content'] => 'justify-content: {{VALUE}};',
217 ],
218 ];
219
220 $fields['cat_height'] = [
221 'type' => 'slider',
222 'mode' => 'responsive',
223 'label' => esc_html__( 'Element Height', 'shopbuilder' ),
224 'size_units' => [ 'px', '%' ],
225 'range' => [
226 'px' => [
227 'min' => 0,
228 'max' => 1500,
229 'step' => 1,
230 ],
231 '%' => [
232 'min' => 0,
233 'max' => 100,
234 'step' => 1,
235 ],
236 ],
237 'description' => esc_html__( 'Please select the element height.', 'shopbuilder' ),
238 'selectors' => [
239 $obj->selectors['category_single_layout']['cat_height'] => 'height: {{SIZE}}{{UNIT}};',
240 ],
241 ];
242
243 $fields['layout_section_end'] = $obj->end_section();
244
245 return apply_filters( 'rtsb/elements/elementor/cat_layout_control', $fields, $obj );
246 }
247
248 /**
249 * Action button preset section
250 *
251 * @param object $obj Reference object.
252 *
253 * @return array
254 */
255 public static function action_btn_presets( $obj ) {
256 $fields['action_btn_note'] = $obj->el_heading( esc_html__( 'Action Button Layouts', 'shopbuilder' ), 'before' );
257
258 $fields['action_btn_preset'] = [
259 'type' => 'rtsb-image-selector',
260 'description' => esc_html__( 'Please choose your preferred action buttons preset.', 'shopbuilder' ),
261 'options' => ControlHelper::action_btn_presets(),
262 'default' => 'preset1',
263 ];
264
265 $fields['action_btn_position'] = [
266 'type' => 'select2',
267 'label' => esc_html__( 'Action Buttons Position', 'shopbuilder' ),
268 'description' => esc_html__( 'Please select the action buttons position.', 'shopbuilder' ),
269 'options' => [
270 'above' => esc_html__( 'Floating Above Image', 'shopbuilder' ),
271 'after' => esc_html__( 'After Content', 'shopbuilder' ),
272 ],
273 'default' => 'above',
274 'label_block' => true,
275 'condition' => [
276 'action_btn_preset' => [ 'preset1', 'preset5' ],
277 'layout!' => [ 'grid-layout2', 'slider-layout2' ],
278 ],
279 ];
280
281 $fields['action_btn_gap'] = [
282 'type' => 'slider',
283 'mode' => 'responsive',
284 'label' => esc_html__( 'Action Buttons Gap / Spacing (px)', 'shopbuilder' ),
285 'size_units' => [ 'px' ],
286 'range' => [
287 'px' => [
288 'min' => 0,
289 'max' => 100,
290 'step' => 1,
291 ],
292 ],
293 'description' => esc_html__( 'Please select the action buttons gap in px.', 'shopbuilder' ),
294 'selectors' => [
295 $obj->selectors['action_buttons']['action_btn_gap'] => 'gap: {{SIZE}}{{UNIT}} !important;',
296 ],
297 ];
298
299 $fields['action_btn_alignment'] = [
300 'type' => 'choose',
301 'label' => esc_html__( 'Action Buttons Alignment', 'shopbuilder' ),
302 'description' => esc_html__( 'Please select the action buttons alignment.', 'shopbuilder' ),
303 'options' => [
304 'flex-start' => [
305 'title' => esc_html__( 'Left', 'shopbuilder' ),
306 'icon' => 'eicon-text-align-left',
307 ],
308 'center' => [
309 'title' => esc_html__( 'Center', 'shopbuilder' ),
310 'icon' => 'eicon-text-align-center',
311 ],
312 'flex-end' => [
313 'title' => esc_html__( 'Right', 'shopbuilder' ),
314 'icon' => 'eicon-text-align-right',
315 ],
316 ],
317 'toggle' => true,
318 'condition' => [
319 'action_btn_position' => [ 'after' ],
320 'action_btn_preset' => [ 'preset1' ],
321 ],
322 'selectors' => [
323 $obj->selectors['action_buttons']['action_btn_alignment'] => 'justify-content: {{VALUE}};',
324 ],
325 ];
326
327 $fields['action_btn_tooltip_position'] = [
328 'label' => esc_html__( 'Tooltip Position', 'shopbuilder' ),
329 'type' => 'choose',
330 'description' => esc_html__( 'Please choose the tooltip position', 'shopbuilder' ),
331 'options' => [
332 'top' => [
333 'title' => esc_html__( 'Top', 'shopbuilder' ),
334 'icon' => ' eicon-arrow-up',
335 ],
336 'right' => [
337 'title' => esc_html__( 'Right', 'shopbuilder' ),
338 'icon' => ' eicon-arrow-right',
339 ],
340 'bottom' => [
341 'title' => esc_html__( 'Bottom', 'shopbuilder' ),
342 'icon' => ' eicon-arrow-down',
343 ],
344 'left' => [
345 'title' => esc_html__( 'Left', 'shopbuilder' ),
346 'icon' => ' eicon-arrow-left',
347 ],
348 ],
349 'default' => 'top',
350 ];
351
352 return $fields;
353 }
354
355 /**
356 * Columns section
357 *
358 * @param object $obj Reference object.
359 *
360 * @return array
361 */
362 public static function structure( $obj ) {
363 $fields['cols'] = [
364 'type' => 'select2',
365 'mode' => 'responsive',
366 'label' => esc_html__( 'Number of Columns', 'shopbuilder' ),
367 'description' => esc_html__( 'Please select the number of columns to show per row.', 'shopbuilder' ),
368 'options' => ControlHelper::layout_columns(),
369 'label_block' => true,
370 'render_type' => 'template',
371 'default' => '0',
372 'tablet_default' => '2',
373 'mobile_default' => '1',
374 'required' => true,
375 'separator' => rtsb()->has_pro() ? 'default' : 'default elementor-control-separator-after',
376 'selectors' => [
377 $obj->selectors['columns']['cols'] => 'grid-template-columns: repeat({{VALUE}}, minmax(0, 1fr));',
378 $obj->selectors['columns']['masonry'] => '--rtsb-masonry-columns: {{VALUE}};',
379 $obj->selectors['columns']['list_masonry'] => '--rtsb-masonry-list-columns: {{VALUE}};',
380 ],
381 ];
382
383 $fields['grid_style'] = [
384 'type' => 'select2',
385 'label' => esc_html__( 'Layout Grid Style', 'shopbuilder' ),
386 'options' => [
387 'even' => esc_html__( 'Default', 'shopbuilder' ),
388 'masonry' => esc_html__( 'Masonry', 'shopbuilder' ),
389 'equal' => esc_html__( 'Equal Height', 'shopbuilder' ),
390 ],
391 'label_block' => true,
392 'default' => 'even',
393 'description' => esc_html__( 'Please select the layout grid style.', 'shopbuilder' ),
394 'classes' => $obj->pro_class(),
395 ];
396
397 $fields['image_width'] = [
398 'type' => 'slider',
399 'mode' => 'responsive',
400 'label' => esc_html__( 'Image Width', 'shopbuilder' ),
401 'size_units' => [ 'px','%' ],
402 'range' => [
403 '%' => [
404 'min' => 0,
405 'max' => 100,
406 'step' => 1,
407 ],
408 ],
409 'default' => [
410 'unit' => '%',
411 'size' => 32,
412 ],
413 'description' => esc_html__( 'Please select the image width in %.', 'shopbuilder' ),
414 'separator' => rtsb()->has_pro() ? 'default' : 'before',
415 'selectors' => [
416 $obj->selectors['columns']['image_width']['image'] => 'flex-basis: {{SIZE}}{{UNIT}}; max-width: {{SIZE}}{{UNIT}};',
417 // $obj->selectors['columns']['image_width']['content'] => 'flex-basis: calc(100% - {{SIZE}}{{UNIT}}); max-width: calc(100% - {{SIZE}}{{UNIT}});',
418 ],
419 'condition' => [ 'layout' => [ 'list-layout1', 'list-layout2', 'list-layout3', 'list-layout4','list-layout5','list-layout6','list-layout7' ] ],
420 ];
421
422 $fields['image_gap'] = [
423 'type' => 'slider',
424 'mode' => 'responsive',
425 'label' => esc_html__( 'Image Gap (px)', 'shopbuilder' ),
426 'size_units' => [ 'px' ],
427 'range' => [
428 'px' => [
429 'min' => 0,
430 'max' => 100,
431 'step' => 1,
432 ],
433 ],
434 'default' => [
435 'unit' => 'px',
436 'size' => 30,
437 ],
438 'description' => esc_html__( 'Please select the image gap in px.', 'shopbuilder' ),
439 'selectors' => [
440 $obj->selectors['columns']['image_gap'] => 'gap: {{SIZE}}{{UNIT}};',
441 ],
442 'condition' => [ 'layout' => [ 'list-layout1', 'list-layout2', 'list-layout3', 'list-layout4','list-layout5','list-layout6','list-layout7' ] ],
443 ];
444
445 $fields['v_action_btn_width'] = [
446 'type' => 'slider',
447 'mode' => 'responsive',
448 'label' => esc_html__( 'Vertical Action Buttons Width (px)', 'shopbuilder' ),
449 'size_units' => [ 'px' ],
450 'range' => [
451 'px' => [
452 'min' => 0,
453 'max' => 500,
454 'step' => 1,
455 ],
456 ],
457 'description' => esc_html__( 'Please select the vertical action buttons width in px.', 'shopbuilder' ),
458 'selectors' => [
459 $obj->selectors['columns']['v_action_btn_width'] => 'flex-basis: {{SIZE}}{{UNIT}};',
460 ],
461 'condition' => [ 'layout' => [ 'list-layout3' ] ],
462 ];
463
464 return apply_filters( 'rtsb/elements/elementor/columns_control', $fields, $obj );
465 }
466
467 /**
468 * Columns section
469 *
470 * @param object $obj Reference object.
471 *
472 * @return array
473 */
474 public static function structure_slider( $obj ) {
475 $fields['cols'] = [
476 'type' => 'select2',
477 'mode' => 'responsive',
478 'label' => esc_html__( 'Number of Slides (Columns) Per View', 'shopbuilder' ),
479 'description' => esc_html__( 'Please select the number of slides to show per view.', 'shopbuilder' ),
480 'options' => ControlHelper::layout_columns(),
481 'label_block' => true,
482 'default' => '0',
483 'tablet_default' => '2',
484 'mobile_default' => '1',
485 'required' => true,
486 'separator' => 'default elementor-control-separator-after',
487 ];
488
489 $fields['rows'] = [
490 'type' => 'select2',
491 'label' => esc_html__( 'Number of Product Rows', 'shopbuilder' ),
492 'description' => rtsb()->has_pro() ? esc_html__( 'Please select the number of slide rows. Slide Rows represents how many rows of slides will be displayed at once.', 'shopbuilder' ) : esc_html__( 'Please select the number of slide rows.', 'shopbuilder' ),
493 'options' => [
494 1 => esc_html__( 'Layout Default (1 Row)', 'shopbuilder' ),
495 2 => esc_html__( '2 Rows', 'shopbuilder' ),
496 3 => esc_html__( '3 Rows', 'shopbuilder' ),
497 4 => esc_html__( '4 Rows', 'shopbuilder' ),
498 5 => esc_html__( '5 Rows', 'shopbuilder' ),
499 ],
500 'label_block' => true,
501 'default' => '1',
502 'tablet_default' => '1',
503 'mobile_default' => '1',
504 'required' => true,
505 'classes' => $obj->pro_class(),
506 ];
507
508 $fields['cols_group'] = [
509 'type' => 'select2',
510 'mode' => 'responsive',
511 'label' => esc_html__( 'Number of Slides Per Group', 'shopbuilder' ),
512 'description' => rtsb()->has_pro() ? esc_html__( 'Please select the number of slides to show per group. Slides Per Group indicates how many slides will be transitioned at a time.', 'shopbuilder' ) : esc_html__( 'Please select the number of slides to show per group.', 'shopbuilder' ),
513 'options' => ControlHelper::layout_columns(),
514 'label_block' => true,
515 'default' => '0',
516 'tablet_default' => '2',
517 'mobile_default' => '1',
518 'required' => true,
519 'classes' => $obj->pro_class(),
520 ];
521
522 $fields['image_width'] = [
523 'type' => 'slider',
524 'mode' => 'responsive',
525 'label' => esc_html__( 'Image Width', 'shopbuilder' ),
526 'size_units' => [ 'px','%' ],
527 'range' => [
528 '%' => [
529 'min' => 0,
530 'max' => 100,
531 'step' => 1,
532 ],
533 ],
534 'default' => [
535 'unit' => '%',
536 'size' => 32,
537 ],
538 'description' => esc_html__( 'Please select the image width in %.', 'shopbuilder' ),
539 'selectors' => [
540 $obj->selectors['columns']['image_width']['image'] => 'flex-basis: {{SIZE}}{{UNIT}}; max-width: {{SIZE}}{{UNIT}} !important;',
541 // $obj->selectors['columns']['image_width']['content'] => 'flex-basis: calc(100% - {{SIZE}}{{UNIT}}); max-width: calc(100% - {{SIZE}}{{UNIT}});',
542 ],
543 'condition' => [ 'layout' => [ 'slider-layout5' ] ],
544 ];
545
546 $fields['image_gap'] = [
547 'type' => 'slider',
548 'mode' => 'responsive',
549 'label' => esc_html__( 'Image Gap (px)', 'shopbuilder' ),
550 'size_units' => [ 'px' ],
551 'range' => [
552 'px' => [
553 'min' => 0,
554 'max' => 100,
555 'step' => 1,
556 ],
557 ],
558 'default' => [
559 'unit' => 'px',
560 'size' => 30,
561 ],
562 'description' => esc_html__( 'Please select the image gap in px.', 'shopbuilder' ),
563 'selectors' => [
564 $obj->selectors['columns']['image_gap'] => 'gap: {{SIZE}}{{UNIT}};',
565 ],
566 'condition' => [ 'layout' => [ 'slider-layout5' ] ],
567 ];
568
569 return apply_filters( 'rtsb/elements/elementor/columns_control', $fields, $obj );
570 }
571
572 /**
573 * Query section
574 *
575 * @param object $obj Reference object.
576 *
577 * @return array
578 */
579 public static function query( $obj ) {
580 $fields['query_section'] = $obj->start_section(
581 esc_html__( 'Query', 'shopbuilder' ),
582 self::$tab
583 );
584
585 $fields['query_note'] = $obj->el_heading( esc_html__( 'Common Filters', 'shopbuilder' ) );
586
587 $fields['include_posts'] = [
588 'type' => 'rt-select2',
589 'label' => esc_html__( 'Include Products', 'shopbuilder' ),
590 'description' => esc_html__( 'Please select the products to show. Leave it blank to include all products.', 'shopbuilder' ),
591 'source_name' => 'post_type',
592 'source_type' => 'product',
593 'multiple' => true,
594 'label_block' => true,
595 ];
596
597 $fields['exclude_posts'] = [
598 'type' => 'rt-select2',
599 'label' => esc_html__( 'Exclude Products', 'shopbuilder' ),
600 'description' => esc_html__( 'Please select the products to show. Leave it blank to exclude none.', 'shopbuilder' ),
601 'source_name' => 'post_type',
602 'source_type' => 'product',
603 'multiple' => true,
604 'label_block' => true,
605 ];
606
607 $fields['posts_limit'] = [
608 'type' => 'number',
609 'label' => esc_html__( 'Products Limit', 'shopbuilder' ),
610 'description' => esc_html__( 'The number of products to show. Set empty to show all products.', 'shopbuilder' ),
611 'default' => 12,
612 ];
613
614 $fields['posts_offset'] = [
615 'type' => 'number',
616 'label' => esc_html__( 'Products Offset', 'shopbuilder' ),
617 'description' => esc_html__( 'Number of products to skip.', 'shopbuilder' ),
618 ];
619
620 $fields['category_note'] = $obj->el_heading( esc_html__( 'Taxonomy Filters', 'shopbuilder' ), 'before' );
621
622 $fields['filter_categories'] = [
623 'type' => 'rt-select2',
624 'label' => esc_html__( 'Filter By Categories', 'shopbuilder' ),
625 'description' => esc_html__( 'Select the categories you want to filter, Leave it blank for all categories.', 'shopbuilder' ),
626 'source_name' => 'taxonomy',
627 'source_type' => 'product_cat',
628 'multiple' => true,
629 'label_block' => true,
630 'minimum_input_length' => 1,
631 ];
632
633 $fields['filter_tags'] = [
634 'type' => 'rt-select2',
635 'label' => esc_html__( 'Filter By Tags', 'shopbuilder' ),
636 'description' => esc_html__( 'Select the tags you want to filter, Leave it blank for all tags.', 'shopbuilder' ),
637 'source_name' => 'taxonomy',
638 'source_type' => 'product_tag',
639 'multiple' => true,
640 'label_block' => true,
641 'minimum_input_length' => 1,
642 ];
643
644 $fields['filter_attributes'] = [
645 'type' => 'select2',
646 'label' => esc_html__( 'Filter By Attributes', 'shopbuilder' ),
647 'description' => esc_html__( 'Select the attributes you want to filter, Leave it blank for all attributes.', 'shopbuilder' ),
648 'options' => Fns::get_all_attributes(),
649 'multiple' => true,
650 'label_block' => true,
651 'condition' => [ 'tax_filter!' => [ 'yes' ] ],
652 ];
653
654 $fields['tax_relation'] = [
655 'type' => 'select2',
656 'label' => esc_html__( 'Taxonomy relation', 'shopbuilder' ),
657 'options' => [
658 'OR' => 'Show All Products (OR)',
659 'AND' => 'Show Common Products (AND)',
660 ],
661 'default' => 'AND',
662 'description' => esc_html__( 'Select the taxonomies relationship. It is applicable if you select more than one taxonomy.', 'shopbuilder' ),
663 'label_block' => true,
664 ];
665
666 $fields['advanced_note'] = $obj->el_heading( esc_html__( 'Advanced Filters', 'shopbuilder' ), 'before' );
667
668 $fields['filter_author'] = [
669 'type' => 'rt-select2',
670 'label' => esc_html__( 'Filter By Author', 'shopbuilder' ),
671 'description' => esc_html__( 'Select the author you want to filter, Leave it blank for all author.', 'shopbuilder' ),
672 'source_name' => 'user',
673 'multiple' => true,
674 'label_block' => true,
675 'minimum_input_length' => 1,
676 'separator' => rtsb()->has_pro() ? 'default' : 'default elementor-control-separator-after',
677 ];
678
679 $fields['products_filter'] = [
680 'type' => 'select2',
681 'label' => esc_html__( 'Display Products By:', 'shopbuilder' ),
682 'options' => ControlHelper::filter_products(),
683 'default' => rtsb()->has_pro() ? 'recent' : 'best-selling',
684 'description' => esc_html__( 'Please select the conditional display of products.', 'shopbuilder' ),
685 'label_block' => true,
686 'classes' => $obj->pro_class(),
687 ];
688
689 $fields['sorting_note'] = $obj->el_heading( esc_html__( 'Sorting', 'shopbuilder' ), 'before' );
690
691 $fields['posts_order_by'] = [
692 'type' => 'select2',
693 'label' => esc_html__( 'Order By', 'shopbuilder' ),
694 'options' => ControlHelper::posts_order_by(),
695 'default' => 'date',
696 ];
697
698 if ( rtsb()->has_pro() ) {
699 $fields['products_filter']['condition'] = [ 'ajax_filter_type' => [ 'taxonomy' ] ];
700 $fields['posts_order_by']['condition'] = [
701 'ajax_filter_type' => [ 'taxonomy' ],
702 'products_filter' => 'recent',
703 ];
704 }
705
706 $fields['posts_order'] = [
707 'type' => 'select2',
708 'label' => esc_html__( 'Order', 'shopbuilder' ),
709 'options' => ControlHelper::posts_order(),
710 'default' => 'DESC',
711 ];
712
713 $fields['query_section_end'] = $obj->end_section();
714
715 return apply_filters( 'rtsb/elements/elementor/query_control', $fields, $obj );
716 }
717
718 /**
719 * Query section
720 *
721 * @param object $obj Reference object.
722 *
723 * @return array
724 */
725 public static function additional_query( $obj ) {
726 $fields['query_section'] = $obj->start_section(
727 esc_html__( 'Query', 'shopbuilder' ),
728 self::$tab
729 );
730
731 $fields['query_note'] = $obj->el_heading( esc_html__( 'Common Filters', 'shopbuilder' ) );
732
733 $fields['posts_limit'] = [
734 'type' => 'number',
735 'label' => esc_html__( 'Products Limit', 'shopbuilder' ),
736 'description' => esc_html__( 'The number of products to show. Set empty to show all products.', 'shopbuilder' ),
737 'default' => 12,
738 ];
739
740 $fields['sorting_note'] = $obj->el_heading( esc_html__( 'Sorting', 'shopbuilder' ), 'before' );
741
742 $fields['posts_order_by'] = [
743 'type' => 'select2',
744 'label' => esc_html__( 'Order By', 'shopbuilder' ),
745 'description' => esc_html__( 'Please choose to reorder products.', 'shopbuilder' ),
746 'options' => ControlHelper::posts_order_by(),
747 'default' => 'date',
748 ];
749
750 $fields['posts_order'] = [
751 'type' => 'select2',
752 'label' => esc_html__( 'Order', 'shopbuilder' ),
753 'description' => esc_html__( 'Please choose to reorder products.', 'shopbuilder' ),
754 'options' => ControlHelper::posts_order(),
755 'default' => 'DESC',
756 ];
757
758 $fields['query_section_end'] = $obj->end_section();
759
760 return apply_filters( 'rtsb/elements/elementor/query_control', $fields, $obj );
761 }
762
763 /**
764 * Category Query section
765 *
766 * @param object $obj Reference object.
767 *
768 * @return array
769 */
770 public static function cat_single_query( $obj ) {
771 $fields['query_section'] = $obj->start_section(
772 esc_html__( 'Query', 'shopbuilder' ),
773 self::$tab
774 );
775
776 $fields['select_source'] = [
777 'type' => 'select2',
778 'label' => esc_html__( 'Select Taxonomy', 'shopbuilder' ),
779 'options' => Fns::get_tax_list(),
780 'description' => esc_html__( 'Please select the taxonomy.', 'shopbuilder' ),
781 'label_block' => true,
782 'default' => 'product_cat',
783 ];
784
785 $fields['select_cat'] = [
786 'type' => 'rt-select2',
787 'label' => esc_html__( 'Choose Category', 'shopbuilder' ),
788 'source_name' => 'taxonomy',
789 'source_type' => 'product_cat',
790 'description' => esc_html__( 'Please select the category to show.', 'shopbuilder' ),
791 'label_block' => true,
792 'minimum_input_length' => 1,
793 'condition' => [
794 'select_source' => [ 'product_cat' ],
795 ],
796 ];
797
798 $fields['select_tag'] = [
799 'type' => 'rt-select2',
800 'label' => esc_html__( 'Choose Tag', 'shopbuilder' ),
801 'source_name' => 'taxonomy',
802 'source_type' => 'product_tag',
803 'description' => esc_html__( 'Please select the tag to show.', 'shopbuilder' ),
804 'label_block' => true,
805 'minimum_input_length' => 1,
806 'condition' => [
807 'select_source' => [ 'product_tag' ],
808 ],
809 ];
810
811 $fields['query_section_end'] = $obj->end_section();
812
813 return apply_filters( 'rtsb/elements/elementor/cat_single_query_control', $fields, $obj );
814 }
815
816 /**
817 * Category Query section
818 *
819 * @param object $obj Reference object.
820 *
821 * @return array
822 */
823 public static function cat_query( $obj ) {
824 $fields['query_section'] = $obj->start_section(
825 esc_html__( 'Query', 'shopbuilder' ),
826 self::$tab
827 );
828
829 $fields['query_note'] = $obj->el_heading( esc_html__( 'Filter', 'shopbuilder' ) );
830
831 $fields['display_cat_by'] = [
832 'type' => 'select2',
833 'label' => esc_html__( 'Display Categories By:', 'shopbuilder' ),
834 'options' => Fns::get_cat_list(),
835 'description' => esc_html__( 'Please select what categories will be displayed.', 'shopbuilder' ),
836 'label_block' => true,
837 'default' => 'all',
838 ];
839
840 $fields['select_parent_cat'] = [
841 'type' => 'rt-select2',
842 'label' => esc_html__( 'Select Parent Category', 'shopbuilder' ),
843 'source_name' => 'taxonomy',
844 'source_type' => 'product_cat',
845 'minimum_input_length' => 1,
846 'description' => esc_html__( 'Please select the parent category to show.', 'shopbuilder' ),
847 'label_block' => true,
848 'default' => Fns::get_terms( 'product_cat', true, true ),
849 'condition' => [ 'display_cat_by' => [ 'specific_parent' ] ],
850 ];
851
852 $fields['include_cats'] = [
853 'type' => 'rt-select2',
854 'label' => esc_html__( 'Select Categories', 'shopbuilder' ),
855 'source_name' => 'taxonomy',
856 'source_type' => 'product_cat',
857 'description' => esc_html__( 'Please select the categories to show.', 'shopbuilder' ),
858 'label_block' => true,
859 'multiple' => true,
860 'minimum_input_length' => 1,
861 'condition' => [ 'display_cat_by' => [ 'selection' ] ],
862 ];
863
864 $fields['include_cat_ids'] = [
865 'type' => 'text',
866 'label' => esc_html__( 'Enter Category IDs', 'shopbuilder' ),
867 'description' => esc_html__( 'Please enter the category IDs separated by comma.', 'shopbuilder' ),
868 'label_block' => true,
869 'condition' => [ 'display_cat_by' => [ 'cat_ids' ] ],
870 ];
871
872 $fields['exclude_cats'] = [
873 'type' => 'rt-select2',
874 'label' => esc_html__( 'Exclude Categories', 'shopbuilder' ),
875 'source_name' => 'taxonomy',
876 'source_type' => 'product_cat',
877 'description' => esc_html__( 'Please select the categories to exclude. Leave it blank to exclude none.', 'shopbuilder' ),
878 'multiple' => true,
879 'minimum_input_length' => 1,
880 'label_block' => true,
881 'condition' => [ 'display_cat_by' => [ 'all' ] ],
882 ];
883
884 $fields['cats_limit'] = [
885 'type' => 'number',
886 'label' => esc_html__( 'Categories Limit', 'shopbuilder' ),
887 'description' => esc_html__( 'The number of categories to show. Set empty to show all categories.', 'shopbuilder' ),
888 'condition' => [ 'display_cat_by!' => [ 'selection' ] ],
889 ];
890
891 $fields['show_top_level_cats'] = [
892 'type' => 'switch',
893 'label' => __( 'Show only Top Level <br /> Sub-Categories?', 'shopbuilder' ),
894 'description' => esc_html__( 'Switch on to display only first level sub-categories.', 'shopbuilder' ),
895 'label_on' => esc_html__( 'On', 'shopbuilder' ),
896 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
897 'condition' => [ 'display_cat_by' => [ 'specific_parent' ] ],
898 ];
899
900 $fields['show_empty'] = [
901 'type' => 'switch',
902 'label' => esc_html__( 'Show Empty Categories?', 'shopbuilder' ),
903 'description' => esc_html__( 'Switch on to display empty categories.', 'shopbuilder' ),
904 'label_on' => esc_html__( 'On', 'shopbuilder' ),
905 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
906 'default' => 'yes',
907 ];
908
909 $fields['show_uncategorized'] = [
910 'type' => 'switch',
911 'label' => __( 'Show Uncategorized <br />(Or Default Category)?', 'shopbuilder' ),
912 'description' => esc_html__( 'Switch on to display uncategorized.', 'shopbuilder' ),
913 'label_on' => esc_html__( 'On', 'shopbuilder' ),
914 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
915 'default' => 'yes',
916 'condition' => [ 'display_cat_by' => [ 'all' ] ],
917 ];
918
919 $fields['show_subcats'] = [
920 'type' => 'switch',
921 'label' => esc_html__( 'Show Sub-Categories?', 'shopbuilder' ),
922 'description' => esc_html__( 'Switch on to display subcategories.', 'shopbuilder' ),
923 'label_on' => esc_html__( 'On', 'shopbuilder' ),
924 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
925 'default' => 'yes',
926 'condition' => [ 'display_cat_by' => [ 'all' ] ],
927 ];
928
929 $fields['sorting_note'] = $obj->el_heading( esc_html__( 'Sorting', 'shopbuilder' ), 'before' );
930
931 $fields['cats_order_by'] = [
932 'type' => 'select2',
933 'label' => esc_html__( 'Order By', 'shopbuilder' ),
934 'description' => esc_html__( 'Please choose to reorder categories.', 'shopbuilder' ),
935 'options' => ControlHelper::cats_order_by(),
936 'default' => 'name',
937 ];
938
939 $fields['cats_order'] = [
940 'type' => 'select2',
941 'label' => esc_html__( 'Order', 'shopbuilder' ),
942 'description' => esc_html__( 'Please choose to reorder categories.', 'shopbuilder' ),
943 'options' => ControlHelper::posts_order(),
944 'default' => 'ASC',
945 ];
946
947 $fields['query_section_end'] = $obj->end_section();
948
949 return apply_filters( 'rtsb/elements/elementor/cat_query_control', $fields, $obj );
950 }
951
952 /**
953 * Pagination section
954 *
955 * @param object $obj Reference object.
956 *
957 * @return array
958 */
959 public static function pagination( $obj ) {
960 $fields['pagination_section'] = $obj->start_section(
961 esc_html__( 'Pagination', 'shopbuilder' ),
962 self::$tab,
963 [],
964 rtsb()->has_pro() ? [ 'tax_filter!' => [ 'yes' ] ] : []
965 );
966
967 $fields['show_pagination'] = [
968 'type' => 'switch',
969 'label' => esc_html__( 'Enable Pagination?', 'shopbuilder' ),
970 'description' => esc_html__( 'Switch on to enable pagination.', 'shopbuilder' ),
971 'label_on' => esc_html__( 'On', 'shopbuilder' ),
972 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
973 ];
974
975 $fields['pagination_per_page'] = [
976 'type' => 'number',
977 'label' => esc_html__( 'Number of Posts Per Page', 'shopbuilder' ),
978 'default' => 8,
979 'description' => esc_html__( 'Please enter the number of products per page to show.', 'shopbuilder' ),
980 'condition' => [ 'show_pagination' => [ 'yes' ] ],
981 ];
982
983 $pagination_description = esc_html__( 'Please choose the pagination type', 'shopbuilder' );
984
985 if ( ! rtsb()->has_pro() ) {
986 $upgrade_link = '<span class="elementor-pro-notice"><a target="_blank" href="' . esc_url( rtsb()->pro_version_link() ) . '">Upgrade to PRO</a> to unlock Load More and Ajax Pagination.</span>';
987 $pagination_description .= $upgrade_link;
988 }
989
990 $fields['pagination_type'] = [
991 'type' => 'select',
992 'label' => esc_html__( 'Pagination Type', 'shopbuilder' ),
993 'description' => $pagination_description,
994 'options' => ControlHelper::pagination_options(),
995 'default' => 'pagination',
996 'label_block' => true,
997 'condition' => [ 'show_pagination' => [ 'yes' ] ],
998 ];
999
1000 $fields['pagination_section_end'] = $obj->end_section();
1001
1002 return apply_filters( 'rtsb/elementor/pagination_control', $fields, $obj );
1003 }
1004
1005 /**
1006 * Filter section
1007 *
1008 * @param object $obj Reference object.
1009 *
1010 * @return array
1011 */
1012 public static function filter( $obj ) {
1013 $fields['filter_section'] = $obj->start_section(
1014 esc_html__( 'Ajax Tab Filters', 'shopbuilder' ),
1015 self::$tab,
1016 );
1017
1018 $fields['filter_note'] = [
1019 'type' => 'html',
1020 'raw' => '',
1021 'content_classes' => 'elementor-panel-heading-title',
1022 ];
1023
1024 $fields['tax_filter'] = [
1025 'type' => 'switch',
1026 'label' => esc_html__( 'Enable Ajax Tab Filter Buttons?', 'shopbuilder' ),
1027 'description' => esc_html__( 'Switch on to enable Ajax tab filter buttons.', 'shopbuilder' ),
1028 'label_on' => esc_html__( 'On', 'shopbuilder' ),
1029 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
1030 'separator' => $obj->pro_class(),
1031 'classes' => $obj->pro_class(),
1032 ];
1033
1034 $fields['filter_section_end'] = $obj->end_section();
1035
1036 return apply_filters( 'rtsb/elementor/filter_control', $fields, $obj );
1037 }
1038 }
1039