PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.1.5
ShopBuilder – WooCommerce Builder For Elementor v2.1.5
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.1.5, at app/Elementor/Widgets/Controls/LayoutFields.php

1,032 lines 33.2 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 'default' => '0',
371 'tablet_default' => '2',
372 'mobile_default' => '1',
373 'required' => true,
374 'selectors' => [
375 $obj->selectors['columns']['cols'] => 'grid-template-columns: repeat({{VALUE}}, minmax(0, 1fr));',
376 ],
377 ];
378
379 $fields['image_width'] = [
380 'type' => 'slider',
381 'mode' => 'responsive',
382 'label' => esc_html__( 'Image Width', 'shopbuilder' ),
383 'size_units' => [ 'px','%' ],
384 'range' => [
385 '%' => [
386 'min' => 0,
387 'max' => 100,
388 'step' => 1,
389 ],
390 ],
391 'default' => [
392 'unit' => '%',
393 'size' => 32,
394 ],
395 'description' => esc_html__( 'Please select the image width in %.', 'shopbuilder' ),
396 'selectors' => [
397 $obj->selectors['columns']['image_width']['image'] => 'flex-basis: {{SIZE}}{{UNIT}}; max-width: {{SIZE}}{{UNIT}};',
398 // $obj->selectors['columns']['image_width']['content'] => 'flex-basis: calc(100% - {{SIZE}}{{UNIT}}); max-width: calc(100% - {{SIZE}}{{UNIT}});',
399 ],
400 'condition' => [ 'layout' => [ 'list-layout1', 'list-layout2', 'list-layout3', 'list-layout4','list-layout5','list-layout6','list-layout7' ] ],
401 ];
402
403 $fields['image_gap'] = [
404 'type' => 'slider',
405 'mode' => 'responsive',
406 'label' => esc_html__( 'Image Gap (px)', 'shopbuilder' ),
407 'size_units' => [ 'px' ],
408 'range' => [
409 'px' => [
410 'min' => 0,
411 'max' => 100,
412 'step' => 1,
413 ],
414 ],
415 'default' => [
416 'unit' => 'px',
417 'size' => 30,
418 ],
419 'description' => esc_html__( 'Please select the image gap in px.', 'shopbuilder' ),
420 'selectors' => [
421 $obj->selectors['columns']['image_gap'] => 'gap: {{SIZE}}{{UNIT}};',
422 ],
423 'condition' => [ 'layout' => [ 'list-layout1', 'list-layout2', 'list-layout3', 'list-layout4','list-layout5','list-layout6','list-layout7' ] ],
424 ];
425
426 $fields['v_action_btn_width'] = [
427 'type' => 'slider',
428 'mode' => 'responsive',
429 'label' => esc_html__( 'Vertical Action Buttons Width (px)', 'shopbuilder' ),
430 'size_units' => [ 'px' ],
431 'range' => [
432 'px' => [
433 'min' => 0,
434 'max' => 500,
435 'step' => 1,
436 ],
437 ],
438 'description' => esc_html__( 'Please select the vertical action buttons width in px.', 'shopbuilder' ),
439 'selectors' => [
440 $obj->selectors['columns']['v_action_btn_width'] => 'flex-basis: {{SIZE}}{{UNIT}};',
441 ],
442 'condition' => [ 'layout' => [ 'list-layout3' ] ],
443 ];
444
445 // Todo: Need to add later.
446 /*
447 $fields['grid_style'] = [
448 'type' => 'select2',
449 'label' => esc_html__( 'Grid Style', 'shopbuilder' ),
450 'options' => [
451 'even' => esc_html__( 'Even', 'shopbuilder' ),
452 'masonry' => esc_html__( 'Masonry', 'shopbuilder' ),
453 'equal' => esc_html__( 'Equal Height', 'shopbuilder' ),
454 ],
455 'label_block' => true,
456 'default' => 'even',
457 'description' => esc_html__( 'Please select the grid style.', 'shopbuilder' ),
458 'classes' => $obj->pro_class(),
459 ];
460 */
461
462 return apply_filters( 'rtsb/elements/elementor/columns_control', $fields, $obj );
463 }
464
465 /**
466 * Columns section
467 *
468 * @param object $obj Reference object.
469 *
470 * @return array
471 */
472 public static function structure_slider( $obj ) {
473 $fields['cols'] = [
474 'type' => 'select2',
475 'mode' => 'responsive',
476 'label' => esc_html__( 'Number of Slides (Columns) Per View', 'shopbuilder' ),
477 'description' => esc_html__( 'Please select the number of slides to show per view.', 'shopbuilder' ),
478 'options' => ControlHelper::layout_columns(),
479 'label_block' => true,
480 'default' => '0',
481 'tablet_default' => '2',
482 'mobile_default' => '1',
483 'required' => true,
484 'separator' => 'default elementor-control-separator-after',
485 ];
486
487 $fields['rows'] = [
488 'type' => 'select2',
489 'label' => esc_html__( 'Number of Product Rows', 'shopbuilder' ),
490 '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' ),
491 'options' => [
492 1 => esc_html__( 'Layout Default (1 Row)', 'shopbuilder' ),
493 2 => esc_html__( '2 Rows', 'shopbuilder' ),
494 3 => esc_html__( '3 Rows', 'shopbuilder' ),
495 4 => esc_html__( '4 Rows', 'shopbuilder' ),
496 5 => esc_html__( '5 Rows', 'shopbuilder' ),
497 ],
498 'label_block' => true,
499 'default' => '1',
500 'tablet_default' => '1',
501 'mobile_default' => '1',
502 'required' => true,
503 'classes' => $obj->pro_class(),
504 ];
505
506 $fields['cols_group'] = [
507 'type' => 'select2',
508 'mode' => 'responsive',
509 'label' => esc_html__( 'Number of Slides Per Group', 'shopbuilder' ),
510 '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' ),
511 'options' => ControlHelper::layout_columns(),
512 'label_block' => true,
513 'default' => '0',
514 'tablet_default' => '2',
515 'mobile_default' => '1',
516 'required' => true,
517 'classes' => $obj->pro_class(),
518 ];
519
520 $fields['image_width'] = [
521 'type' => 'slider',
522 'mode' => 'responsive',
523 'label' => esc_html__( 'Image Width', 'shopbuilder' ),
524 'size_units' => [ 'px','%' ],
525 'range' => [
526 '%' => [
527 'min' => 0,
528 'max' => 100,
529 'step' => 1,
530 ],
531 ],
532 'default' => [
533 'unit' => '%',
534 'size' => 32,
535 ],
536 'description' => esc_html__( 'Please select the image width in %.', 'shopbuilder' ),
537 'selectors' => [
538 $obj->selectors['columns']['image_width']['image'] => 'flex-basis: {{SIZE}}{{UNIT}}; max-width: {{SIZE}}{{UNIT}} !important;',
539 // $obj->selectors['columns']['image_width']['content'] => 'flex-basis: calc(100% - {{SIZE}}{{UNIT}}); max-width: calc(100% - {{SIZE}}{{UNIT}});',
540 ],
541 'condition' => [ 'layout' => [ 'slider-layout5' ] ],
542 ];
543
544 $fields['image_gap'] = [
545 'type' => 'slider',
546 'mode' => 'responsive',
547 'label' => esc_html__( 'Image Gap (px)', 'shopbuilder' ),
548 'size_units' => [ 'px' ],
549 'range' => [
550 'px' => [
551 'min' => 0,
552 'max' => 100,
553 'step' => 1,
554 ],
555 ],
556 'default' => [
557 'unit' => 'px',
558 'size' => 30,
559 ],
560 'description' => esc_html__( 'Please select the image gap in px.', 'shopbuilder' ),
561 'selectors' => [
562 $obj->selectors['columns']['image_gap'] => 'gap: {{SIZE}}{{UNIT}};',
563 ],
564 'condition' => [ 'layout' => [ 'slider-layout5' ] ],
565 ];
566
567 return apply_filters( 'rtsb/elements/elementor/columns_control', $fields, $obj );
568 }
569
570 /**
571 * Query section
572 *
573 * @param object $obj Reference object.
574 *
575 * @return array
576 */
577 public static function query( $obj ) {
578 $fields['query_section'] = $obj->start_section(
579 esc_html__( 'Query', 'shopbuilder' ),
580 self::$tab
581 );
582
583 $fields['query_note'] = $obj->el_heading( esc_html__( 'Common Filters', 'shopbuilder' ) );
584
585 $fields['include_posts'] = [
586 'type' => 'rt-select2',
587 'label' => esc_html__( 'Include Products', 'shopbuilder' ),
588 'description' => esc_html__( 'Please select the products to show. Leave it blank to include all products.', 'shopbuilder' ),
589 'source_name' => 'post_type',
590 'source_type' => 'product',
591 'multiple' => true,
592 'label_block' => true,
593 ];
594
595 $fields['exclude_posts'] = [
596 'type' => 'rt-select2',
597 'label' => esc_html__( 'Exclude Products', 'shopbuilder' ),
598 'description' => esc_html__( 'Please select the products to show. Leave it blank to exclude none.', 'shopbuilder' ),
599 'source_name' => 'post_type',
600 'source_type' => 'product',
601 'multiple' => true,
602 'label_block' => true,
603 ];
604
605 $fields['posts_limit'] = [
606 'type' => 'number',
607 'label' => esc_html__( 'Products Limit', 'shopbuilder' ),
608 'description' => esc_html__( 'The number of products to show. Set empty to show all products.', 'shopbuilder' ),
609 'default' => 12,
610 ];
611
612 $fields['posts_offset'] = [
613 'type' => 'number',
614 'label' => esc_html__( 'Products Offset', 'shopbuilder' ),
615 'description' => esc_html__( 'Number of products to skip.', 'shopbuilder' ),
616 ];
617
618 $fields['category_note'] = $obj->el_heading( esc_html__( 'Taxonomy Filters', 'shopbuilder' ), 'before' );
619
620 $fields['filter_categories'] = [
621 'type' => 'rt-select2',
622 'label' => esc_html__( 'Filter By Categories', 'shopbuilder' ),
623 'description' => esc_html__( 'Select the categories you want to filter, Leave it blank for all categories.', 'shopbuilder' ),
624 'source_name' => 'taxonomy',
625 'source_type' => 'product_cat',
626 'multiple' => true,
627 'label_block' => true,
628 'minimum_input_length' => 1,
629 ];
630
631 $fields['filter_tags'] = [
632 'type' => 'rt-select2',
633 'label' => esc_html__( 'Filter By Tags', 'shopbuilder' ),
634 'description' => esc_html__( 'Select the tags you want to filter, Leave it blank for all tags.', 'shopbuilder' ),
635 'source_name' => 'taxonomy',
636 'source_type' => 'product_tag',
637 'multiple' => true,
638 'label_block' => true,
639 'minimum_input_length' => 1,
640 ];
641
642 $fields['filter_attributes'] = [
643 'type' => 'select2',
644 'label' => esc_html__( 'Filter By Attributes', 'shopbuilder' ),
645 'description' => esc_html__( 'Select the attributes you want to filter, Leave it blank for all attributes.', 'shopbuilder' ),
646 'options' => Fns::get_all_attributes(),
647 'multiple' => true,
648 'label_block' => true,
649 'condition' => [ 'tax_filter!' => [ 'yes' ] ],
650 ];
651
652 $fields['tax_relation'] = [
653 'type' => 'select2',
654 'label' => esc_html__( 'Taxonomy relation', 'shopbuilder' ),
655 'options' => [
656 'OR' => 'Show All Products (OR)',
657 'AND' => 'Show Common Products (AND)',
658 ],
659 'default' => 'AND',
660 'description' => esc_html__( 'Select the taxonomies relationship. It is applicable if you select more than one taxonomy.', 'shopbuilder' ),
661 'label_block' => true,
662 ];
663
664 $fields['advanced_note'] = $obj->el_heading( esc_html__( 'Advanced Filters', 'shopbuilder' ), 'before' );
665
666 $fields['filter_author'] = [
667 'type' => 'rt-select2',
668 'label' => esc_html__( 'Filter By Author', 'shopbuilder' ),
669 'description' => esc_html__( 'Select the author you want to filter, Leave it blank for all author.', 'shopbuilder' ),
670 'source_name' => 'user',
671 'multiple' => true,
672 'label_block' => true,
673 'minimum_input_length' => 1,
674 'separator' => rtsb()->has_pro() ? 'default' : 'default elementor-control-separator-after',
675 ];
676
677 $fields['products_filter'] = [
678 'type' => 'select2',
679 'label' => esc_html__( 'Display Products By:', 'shopbuilder' ),
680 'options' => ControlHelper::filter_products(),
681 'default' => rtsb()->has_pro() ? 'recent' : 'best-selling',
682 'description' => esc_html__( 'Please select the conditional display of products.', 'shopbuilder' ),
683 'label_block' => true,
684 'classes' => $obj->pro_class(),
685 ];
686
687 $fields['sorting_note'] = $obj->el_heading( esc_html__( 'Sorting', 'shopbuilder' ), 'before' );
688
689 $fields['posts_order_by'] = [
690 'type' => 'select2',
691 'label' => esc_html__( 'Order By', 'shopbuilder' ),
692 'options' => ControlHelper::posts_order_by(),
693 'default' => 'date',
694 ];
695
696 if ( rtsb()->has_pro() ) {
697 $fields['posts_order_by']['condition'] = [ 'products_filter' => 'recent' ];
698 }
699
700 $fields['posts_order'] = [
701 'type' => 'select2',
702 'label' => esc_html__( 'Order', 'shopbuilder' ),
703 'options' => ControlHelper::posts_order(),
704 'default' => 'DESC',
705 ];
706
707 $fields['query_section_end'] = $obj->end_section();
708
709 return apply_filters( 'rtsb/elements/elementor/query_control', $fields, $obj );
710 }
711
712 /**
713 * Query section
714 *
715 * @param object $obj Reference object.
716 *
717 * @return array
718 */
719 public static function additional_query( $obj ) {
720 $fields['query_section'] = $obj->start_section(
721 esc_html__( 'Query', 'shopbuilder' ),
722 self::$tab
723 );
724
725 $fields['query_note'] = $obj->el_heading( esc_html__( 'Common Filters', 'shopbuilder' ) );
726
727 $fields['posts_limit'] = [
728 'type' => 'number',
729 'label' => esc_html__( 'Products Limit', 'shopbuilder' ),
730 'description' => esc_html__( 'The number of products to show. Set empty to show all products.', 'shopbuilder' ),
731 'default' => 12,
732 ];
733
734 $fields['sorting_note'] = $obj->el_heading( esc_html__( 'Sorting', 'shopbuilder' ), 'before' );
735
736 $fields['posts_order_by'] = [
737 'type' => 'select2',
738 'label' => esc_html__( 'Order By', 'shopbuilder' ),
739 'description' => esc_html__( 'Please choose to reorder products.', 'shopbuilder' ),
740 'options' => ControlHelper::posts_order_by(),
741 'default' => 'date',
742 ];
743
744 $fields['posts_order'] = [
745 'type' => 'select2',
746 'label' => esc_html__( 'Order', 'shopbuilder' ),
747 'description' => esc_html__( 'Please choose to reorder products.', 'shopbuilder' ),
748 'options' => ControlHelper::posts_order(),
749 'default' => 'DESC',
750 ];
751
752 $fields['query_section_end'] = $obj->end_section();
753
754 return apply_filters( 'rtsb/elements/elementor/query_control', $fields, $obj );
755 }
756
757 /**
758 * Category Query section
759 *
760 * @param object $obj Reference object.
761 *
762 * @return array
763 */
764 public static function cat_single_query( $obj ) {
765 $fields['query_section'] = $obj->start_section(
766 esc_html__( 'Query', 'shopbuilder' ),
767 self::$tab
768 );
769
770 $fields['select_source'] = [
771 'type' => 'select2',
772 'label' => esc_html__( 'Select Taxonomy', 'shopbuilder' ),
773 'options' => Fns::get_tax_list(),
774 'description' => esc_html__( 'Please select the taxonomy.', 'shopbuilder' ),
775 'label_block' => true,
776 'default' => 'product_cat',
777 ];
778
779 $fields['select_cat'] = [
780 'type' => 'rt-select2',
781 'label' => esc_html__( 'Choose Category', 'shopbuilder' ),
782 'source_name' => 'taxonomy',
783 'source_type' => 'product_cat',
784 'description' => esc_html__( 'Please select the category to show.', 'shopbuilder' ),
785 'label_block' => true,
786 'minimum_input_length' => 1,
787 'condition' => [
788 'select_source' => [ 'product_cat' ],
789 ],
790 ];
791
792 $fields['select_tag'] = [
793 'type' => 'rt-select2',
794 'label' => esc_html__( 'Choose Tag', 'shopbuilder' ),
795 'source_name' => 'taxonomy',
796 'source_type' => 'product_tag',
797 'description' => esc_html__( 'Please select the tag to show.', 'shopbuilder' ),
798 'label_block' => true,
799 'minimum_input_length' => 1,
800 'condition' => [
801 'select_source' => [ 'product_tag' ],
802 ],
803 ];
804
805 $fields['query_section_end'] = $obj->end_section();
806
807 return apply_filters( 'rtsb/elements/elementor/cat_single_query_control', $fields, $obj );
808 }
809
810 /**
811 * Category Query section
812 *
813 * @param object $obj Reference object.
814 *
815 * @return array
816 */
817 public static function cat_query( $obj ) {
818 $fields['query_section'] = $obj->start_section(
819 esc_html__( 'Query', 'shopbuilder' ),
820 self::$tab
821 );
822
823 $fields['query_note'] = $obj->el_heading( esc_html__( 'Filter', 'shopbuilder' ) );
824
825 $fields['display_cat_by'] = [
826 'type' => 'select2',
827 'label' => esc_html__( 'Display Categories By:', 'shopbuilder' ),
828 'options' => Fns::get_cat_list(),
829 'description' => esc_html__( 'Please select what categories will be displayed.', 'shopbuilder' ),
830 'label_block' => true,
831 'default' => 'all',
832 ];
833
834 $fields['select_parent_cat'] = [
835 'type' => 'rt-select2',
836 'label' => esc_html__( 'Select Parent Category', 'shopbuilder' ),
837 'source_name' => 'taxonomy',
838 'source_type' => 'product_cat',
839 'minimum_input_length' => 1,
840 'description' => esc_html__( 'Please select the parent category to show.', 'shopbuilder' ),
841 'label_block' => true,
842 'default' => Fns::get_terms( 'product_cat', true, true ),
843 'condition' => [ 'display_cat_by' => [ 'specific_parent' ] ],
844 ];
845
846 $fields['include_cats'] = [
847 'type' => 'rt-select2',
848 'label' => esc_html__( 'Select Categories', 'shopbuilder' ),
849 'source_name' => 'taxonomy',
850 'source_type' => 'product_cat',
851 'description' => esc_html__( 'Please select the categories to show.', 'shopbuilder' ),
852 'label_block' => true,
853 'multiple' => true,
854 'minimum_input_length' => 1,
855 'condition' => [ 'display_cat_by' => [ 'selection' ] ],
856 ];
857
858 $fields['include_cat_ids'] = [
859 'type' => 'text',
860 'label' => esc_html__( 'Enter Category IDs', 'shopbuilder' ),
861 'description' => esc_html__( 'Please enter the category IDs separated by comma.', 'shopbuilder' ),
862 'label_block' => true,
863 'condition' => [ 'display_cat_by' => [ 'cat_ids' ] ],
864 ];
865
866 $fields['exclude_cats'] = [
867 'type' => 'rt-select2',
868 'label' => esc_html__( 'Exclude Categories', 'shopbuilder' ),
869 'source_name' => 'taxonomy',
870 'source_type' => 'product_cat',
871 'description' => esc_html__( 'Please select the categories to exclude. Leave it blank to exclude none.', 'shopbuilder' ),
872 'multiple' => true,
873 'minimum_input_length' => 1,
874 'label_block' => true,
875 'condition' => [ 'display_cat_by' => [ 'all' ] ],
876 ];
877
878 $fields['cats_limit'] = [
879 'type' => 'number',
880 'label' => esc_html__( 'Categories Limit', 'shopbuilder' ),
881 'description' => esc_html__( 'The number of categories to show. Set empty to show all categories.', 'shopbuilder' ),
882 'condition' => [ 'display_cat_by!' => [ 'selection' ] ],
883 ];
884
885 $fields['show_top_level_cats'] = [
886 'type' => 'switch',
887 'label' => __( 'Show only Top Level <br /> Sub-Categories?', 'shopbuilder' ),
888 'description' => esc_html__( 'Switch on to display only first level sub-categories.', 'shopbuilder' ),
889 'label_on' => esc_html__( 'On', 'shopbuilder' ),
890 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
891 'condition' => [ 'display_cat_by' => [ 'specific_parent' ] ],
892 ];
893
894 $fields['show_empty'] = [
895 'type' => 'switch',
896 'label' => esc_html__( 'Show Empty Categories?', 'shopbuilder' ),
897 'description' => esc_html__( 'Switch on to display empty categories.', 'shopbuilder' ),
898 'label_on' => esc_html__( 'On', 'shopbuilder' ),
899 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
900 'default' => 'yes',
901 ];
902
903 $fields['show_uncategorized'] = [
904 'type' => 'switch',
905 'label' => __( 'Show Uncategorized <br />(Or Default Category)?', 'shopbuilder' ),
906 'description' => esc_html__( 'Switch on to display uncategorized.', 'shopbuilder' ),
907 'label_on' => esc_html__( 'On', 'shopbuilder' ),
908 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
909 'default' => 'yes',
910 'condition' => [ 'display_cat_by' => [ 'all' ] ],
911 ];
912
913 $fields['show_subcats'] = [
914 'type' => 'switch',
915 'label' => esc_html__( 'Show Sub-Categories?', 'shopbuilder' ),
916 'description' => esc_html__( 'Switch on to display subcategories.', 'shopbuilder' ),
917 'label_on' => esc_html__( 'On', 'shopbuilder' ),
918 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
919 'default' => 'yes',
920 'condition' => [ 'display_cat_by' => [ 'all' ] ],
921 ];
922
923 $fields['sorting_note'] = $obj->el_heading( esc_html__( 'Sorting', 'shopbuilder' ), 'before' );
924
925 $fields['cats_order_by'] = [
926 'type' => 'select2',
927 'label' => esc_html__( 'Order By', 'shopbuilder' ),
928 'description' => esc_html__( 'Please choose to reorder categories.', 'shopbuilder' ),
929 'options' => ControlHelper::cats_order_by(),
930 'default' => 'name',
931 ];
932
933 $fields['cats_order'] = [
934 'type' => 'select2',
935 'label' => esc_html__( 'Order', 'shopbuilder' ),
936 'description' => esc_html__( 'Please choose to reorder categories.', 'shopbuilder' ),
937 'options' => ControlHelper::posts_order(),
938 'default' => 'ASC',
939 ];
940
941 $fields['query_section_end'] = $obj->end_section();
942
943 return apply_filters( 'rtsb/elements/elementor/cat_query_control', $fields, $obj );
944 }
945
946 /**
947 * Pagination section
948 *
949 * @param object $obj Reference object.
950 *
951 * @return array
952 */
953 public static function pagination( $obj ) {
954 $fields['pagination_section'] = $obj->start_section(
955 esc_html__( 'Pagination', 'shopbuilder' ),
956 self::$tab,
957 [],
958 rtsb()->has_pro() ? [ 'tax_filter!' => [ 'yes' ] ] : []
959 );
960
961 $fields['show_pagination'] = [
962 'type' => 'switch',
963 'label' => esc_html__( 'Enable Pagination?', 'shopbuilder' ),
964 'description' => esc_html__( 'Switch on to enable pagination.', 'shopbuilder' ),
965 'label_on' => esc_html__( 'On', 'shopbuilder' ),
966 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
967 ];
968
969 $fields['pagination_per_page'] = [
970 'type' => 'number',
971 'label' => esc_html__( 'Number of Posts Per Page', 'shopbuilder' ),
972 'default' => 8,
973 'description' => esc_html__( 'Please enter the number of team members per page to show.', 'shopbuilder' ),
974 'condition' => [ 'show_pagination' => [ 'yes' ] ],
975 ];
976
977 $pagination_description = esc_html__( 'Please choose the pagination type', 'shopbuilder' );
978
979 if ( ! rtsb()->has_pro() ) {
980 $pagination_description = __( 'Please choose the pagination type.<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>', 'shopbuilder' );
981 }
982
983 $fields['pagination_type'] = [
984 'type' => 'select',
985 'label' => esc_html__( 'Pagination Type', 'shopbuilder' ),
986 'description' => $pagination_description,
987 'options' => ControlHelper::pagination_options(),
988 'default' => 'pagination',
989 'label_block' => true,
990 'condition' => [ 'show_pagination' => [ 'yes' ] ],
991 ];
992
993 $fields['pagination_section_end'] = $obj->end_section();
994
995 return apply_filters( 'rtsb/elementor/pagination_control', $fields, $obj );
996 }
997
998 /**
999 * Filter section
1000 *
1001 * @param object $obj Reference object.
1002 *
1003 * @return array
1004 */
1005 public static function filter( $obj ) {
1006 $fields['filter_section'] = $obj->start_section(
1007 esc_html__( 'Ajax Tab Filters', 'shopbuilder' ),
1008 self::$tab,
1009 );
1010
1011 $fields['filter_note'] = [
1012 'type' => 'html',
1013 'raw' => '',
1014 'content_classes' => 'elementor-panel-heading-title',
1015 ];
1016
1017 $fields['tax_filter'] = [
1018 'type' => 'switch',
1019 'label' => esc_html__( 'Enable Taxonomy Filter Button?', 'shopbuilder' ),
1020 'description' => esc_html__( 'Switch on to enable taxonomy filter button.', 'shopbuilder' ),
1021 'label_on' => esc_html__( 'On', 'shopbuilder' ),
1022 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
1023 'separator' => $obj->pro_class(),
1024 'classes' => $obj->pro_class(),
1025 ];
1026
1027 $fields['filter_section_end'] = $obj->end_section();
1028
1029 return apply_filters( 'rtsb/elementor/filter_control', $fields, $obj );
1030 }
1031 }
1032