PluginProbe
FireBox – WooCommerce Popup Builder, Exit Intent Popup, Email Optin & Cart Abandonment / 1.0.12
FireBox – WooCommerce Popup Builder, Exit Intent Popup, Email Optin & Cart Abandonment v1.0.12
3.1.13 3.1.12 3.1.11 3.1.10 3.1.9 3.1.8 3.1.7 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 All 122 releases
firebox / Inc / Core / FB / Box.php

Box.php in FireBox – WooCommerce Popup Builder, Exit Intent Popup, Email Optin & Cart Abandonment 1.0.12, at Inc/Core/FB/Box.php

962 lines 23.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package FireBox
4 * @version 1.0.12 Free
5 *
6 * @author FirePlugins <info@fireplugins.com>
7 * @link https://www.fireplugins.com
8 * @copyright Copyright © 2022 FirePlugins All Rights Reserved
9 * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
10 */
11
12 namespace FireBox\Core\FB;
13
14 if (!defined('ABSPATH'))
15 {
16 exit; // Exit if accessed directly.
17 }
18
19 use FireBox\Core\Helpers\BoxHelper;
20 use FPFramework\Libs\Registry;
21 use FPFramework\Helpers\Fields\DimensionsHelper;
22
23 class Box
24 {
25 /**
26 * Send useful JS snippet once in first box
27 *
28 * @var boolean
29 */
30 static $loadedLocalizedScript = false;
31
32 /**
33 * The box settings
34 */
35 private $boxSettings;
36
37 /**
38 * The factory
39 *
40 * @var Factory
41 */
42 protected $factory;
43
44 public function __construct($boxSettings = null, $factory = null)
45 {
46 $this->init($boxSettings, $factory);
47 }
48
49 public function init($boxSettings = null, $factory = null)
50 {
51 if (!$factory)
52 {
53 $factory = new \FPFramework\Base\Factory();
54 }
55
56 $this->boxSettings = $boxSettings;
57 $this->factory = $factory;
58 }
59
60 /**
61 * Gets published box.
62 *
63 * @param integer $id
64 * @param string $status
65 *
66 * @return array
67 */
68 public function get($id, $status = null)
69 {
70 $payload = [
71 'where' => [
72 'ID' => ' = ' . esc_sql($id),
73 'post_type' => " = 'firebox'"
74 ]
75 ];
76
77 // apply status if given
78 if ($status)
79 {
80 $payload['where']['post_status'] = ' = \'' . esc_sql($status) . '\'';
81 }
82
83 if (!$box = firebox()->tables->box->getResults($payload))
84 {
85 return [];
86 }
87
88 if (!isset($box[0]))
89 {
90 return [];
91 }
92
93 $box = $box[0];
94
95 // get meta options for box
96 $meta = self::getMeta($id);
97 $box->params = new Registry($meta);
98
99 return $box;
100 }
101
102 /**
103 * Get box meta
104 *
105 * @param int $id
106 *
107 * @return array
108 */
109 public static function getMeta($id)
110 {
111 return get_post_meta($id, 'fpframework_meta_settings', true);
112 }
113
114 /**
115 * Render box
116 *
117 * @return string
118 */
119 public function render($box = null)
120 {
121 // we do not have a passed box or box settings from constructor, abort
122 // as we cannot render a box without any box parameters
123 if (!$box && !$this->boxSettings)
124 {
125 return;
126 }
127
128 // if a box was given to the function, use these settings instead
129 if ($box)
130 {
131 $this->boxSettings = $box;
132 }
133
134 // if we have box settings, then set up our box with these settings
135 if ($this->boxSettings)
136 {
137 $box = $this->boxSettings;
138 }
139
140 // Check Publishing Assignments
141 if (!$this->pass($box))
142 {
143 return;
144 }
145
146 // get settings params
147 $params = BoxHelper::getParams();
148
149 if (!did_action('wp_enqueue_scripts'))
150 {
151 /**
152 * Loads all media files.
153 */
154 add_action('wp_enqueue_scripts', function() use ($box, $params) {
155 // load box media
156 $this->loadBoxMedia($box, $params);
157 });
158 }
159 else
160 {
161 // load box media
162 $this->loadBoxMedia($box, $params);
163 }
164
165 self::prepare($box);
166
167 if (!did_action('wp_head'))
168 {
169 /**
170 * Custom CSS
171 */
172 add_action('wp_head', function() use ($box) {
173 if ($css = $this->getCustomCSS($box))
174 {
175 echo '<style type="text/css" class="fb-' . esc_attr($box->ID) . '-style fb-responsive-style">' . $css . '</style>';
176 }
177 });
178 }
179 else
180 {
181 if ($css = $this->getCustomCSS($box))
182 {
183 echo '<style type="text/css" class="fb-' . esc_attr($box->ID) . '-style fb-responsive-style">' . $css . '</style>';
184 }
185 }
186
187 /**
188 * Runs before rendering the box.
189 */
190 do_action('firebox/box/before_render', $box);
191
192 // after we prepare it, update box settings
193 $this->boxSettings = $box;
194
195 // payload
196 $payload = [
197 'box' => $box,
198 'params' => $params,
199 ];
200
201 // return box template
202 add_action('wp_footer', function() use ($box, $payload) {
203 echo firebox()->renderer->public->render('box', $payload, true);
204 });
205 }
206
207 /**
208 * Gets the Custom CSS of the popup.
209 *
210 * @param object $box
211 *
212 * @return string
213 */
214 private function getCustomCSS($box)
215 {
216 $css = is_string($box->params->get('customcss')) ? $box->params->get('customcss') : '';
217
218 // add responsive CSS
219 if ($responsive_css = (array) $box->params->get('responsive_css', []))
220 {
221 if (isset($responsive_css['tablet']) && !empty($responsive_css['tablet']))
222 {
223 $css .= '
224 @media only screen and (max-width: 768px) {
225 .fb-' . esc_attr($box->ID) . ' .fb-dialog { ' . esc_html($responsive_css['tablet']) . ' }
226 }';
227 }
228 if (isset($responsive_css['mobile']) && !empty($responsive_css['mobile']))
229 {
230 $css .= '
231 @media only screen and (max-width: 468px) {
232 .fb-' . esc_attr($box->ID) . ' .fb-dialog { ' . esc_html($responsive_css['mobile']) . ' }
233 }';
234 }
235 }
236
237 return $css;
238 }
239
240 /**
241 * Send a helpful object to JavaScript files
242 *
243 * @return void
244 */
245 public static function setJSObject()
246 {
247 if (self::$loadedLocalizedScript)
248 {
249 return;
250 }
251 self::$loadedLocalizedScript = true;
252
253 $data = array(
254 'ajax_url' => admin_url('admin-ajax.php'),
255 'nonce' => wp_create_nonce('fbox_js_nonce'),
256 'site_url' => site_url('/'),
257 'referrer' => wp_get_referer()
258 );
259
260 wp_localize_script('firebox', 'fbox_js_object', $data);
261 }
262
263 /**
264 * Load Box Media
265 *
266 * @param array $box
267 * @param array $params
268 *
269 * @return void
270 */
271 public function loadBoxMedia($box, $params)
272 {
273 $box = new Registry($box);
274 $params = new Registry($params);
275
276 /**
277 * We require a CSS handle to register inline styles.
278 *
279 * For this case, we use this dummy style to add inline CSS for our popups
280 * even though the FireBox CSS file may not appear in the page.
281 */
282 wp_register_style('firebox-custom-styles', false);
283 wp_enqueue_style('firebox-custom-styles');
284
285 // Add polyfills for Internet Explorer
286 $browser = $this->factory->getBrowser();
287 if ($browser && is_array($browser) && array_key_exists('name', $browser) && $browser['name'] == 'ie')
288 {
289 wp_enqueue_script(
290 'firebox-ie11-polyfill',
291 'https://polyfill.io/v3/polyfill.min.js?features=NodeList.prototype.forEach%2CElement.prototype.closest%2CArray.prototype.forEach%2CArray.prototype.find%2CIntersectionObserver%2CIntersectionObserverEntry',
292 [],
293 FBOX_VERSION,
294 false
295 );
296 }
297
298 /**
299 * Velocity
300 */
301 if ($params->get('loadVelocity', true))
302 {
303 wp_enqueue_script(
304 'firebox-velocity',
305 FBOX_MEDIA_PUBLIC_URL . 'js/vendor/velocity.js',
306 [],
307 FBOX_VERSION,
308 false
309 );
310 wp_enqueue_script(
311 'firebox-velocity-ui',
312 FBOX_MEDIA_PUBLIC_URL . 'js/vendor/velocity.ui.js',
313 [],
314 FBOX_VERSION,
315 false
316 );
317
318 /**
319 * Animations
320 */
321 if (strpos($box->get('params.data.animationin'), 'firebox') !== false || strpos($box->get('params.data.animationout'), 'firebox') !== false)
322 {
323 wp_enqueue_script(
324 'firebox-animations',
325 FBOX_MEDIA_PUBLIC_URL . 'js/animations.js',
326 [],
327 FBOX_VERSION,
328 false
329 );
330 }
331 }
332
333 /**
334 * FireBox JS
335 */
336 wp_enqueue_script(
337 'firebox',
338 FBOX_MEDIA_PUBLIC_URL . 'js/firebox.js',
339 [],
340 FBOX_VERSION,
341 false
342 );
343
344 // run above the main JS script to run only once
345 self::setJSObject();
346
347 /**
348 * FireBox CSS
349 */
350 if ($params->get('loadCSS', true))
351 {
352 wp_enqueue_style(
353 'firebox',
354 FBOX_MEDIA_PUBLIC_URL . 'css/firebox.css',
355 [],
356 FBOX_VERSION,
357 false
358 );
359 }
360
361 /**
362 * Page Slide mode JS
363 */
364 if ($box->get('params.data.mode') == 'pageslide')
365 {
366 wp_enqueue_script(
367 'firebox-pageslide-mode',
368 FBOX_MEDIA_PUBLIC_URL . 'js/pageslide_mode.js',
369 [],
370 FBOX_VERSION,
371 false
372 );
373 }
374
375
376
377 $this->loadThemeCSSOverrides();
378 }
379
380 /**
381 * Some themes require overrides to preserve as much as we can the styling of the popups.
382 *
383 * @return void
384 */
385 private function loadThemeCSSOverrides()
386 {
387 $active_theme = wp_get_theme();
388 $theme = $active_theme->template;
389
390 /**
391 * This is the listed of the themes that we have created overrides
392 */
393 $themes = [
394 'twentytwentyone'
395 ];
396
397 if (!in_array($theme, $themes))
398 {
399 return;
400 }
401
402 wp_enqueue_style(
403 'firebox-theme-' . $theme . '-override',
404 FBOX_MEDIA_PUBLIC_URL . 'css/themes/' . $theme . '.css',
405 [],
406 FBOX_VERSION,
407 false
408 );
409 }
410
411 /**
412 * Prepares the box before rendering
413 *
414 * @param array $box
415 *
416 * @return void
417 */
418 public static function prepare(&$box)
419 {
420 global $post;
421 $original_post = $post;
422
423 $GLOBALS['post'] = $box;
424 setup_postdata($GLOBALS['post']);
425
426 $cParam = BoxHelper::getParams();
427 $cParam = new Registry($cParam);
428
429 $box->post_content = apply_filters('the_content', $box->post_content);
430
431 $css_class_prefix = 'fb-';
432
433 $position = $box->params->get('position', '');
434 $position = !is_string($position) ? '' : $position;
435
436 /* Classes */
437 $css_class = [
438 $box->ID,
439 $position
440 ];
441
442 $rtl = $box->params->get('rtl', '0');
443 if ($rtl == '1')
444 {
445 $css_class[] = 'rtl';
446 }
447
448 self::prefixCSSClasses($css_class);
449
450 // class suffix
451 $classSuffix = $box->params->get('classsuffix', '');
452 $classSuffix = is_string($classSuffix) ? $classSuffix : '';
453
454 $css_class[] = $classSuffix;
455
456 $box->classes = $css_class;
457
458 // box shadow
459 $boxshadow = (is_string($box->params->get('boxshadow', '1')) || is_int($box->params->get('boxshadow', '1'))) ? $box->params->get('boxshadow', '1') : '0';
460
461 $dialog_css_classes = [
462 $boxshadow != '0' ? 'shd' . $boxshadow : null
463 ];
464
465 // Align Content
466 $aligncontent = is_string($box->params->get('aligncontent')) ? explode(' ', $box->params->get('aligncontent')) : [];
467 $dialog_css_classes = array_merge($dialog_css_classes, $aligncontent);
468
469 self::prefixCSSClasses($dialog_css_classes);
470 $box->dialog_classes = $dialog_css_classes;
471
472 /* CSS */
473 // border
474 $border = is_string($box->params->get('bordertype', 'none')) ? $box->params->get('bordertype', 'none') : 'none';
475 $border_width = $box->params->get('borderwidth.value', 0) ? $box->params->get('borderwidth.value', 0) : 0;
476 $border_unit = is_string($box->params->get('borderwidth.unit', 'px')) ? $box->params->get('borderwidth.unit', 'px') : 0;
477 $border_color = is_string($box->params->get('bordercolor')) ? $box->params->get('bordercolor') : '';
478
479 $style = [
480 'background' => $box->params->get('backgroundcolor'),
481 'color' => $box->params->get('textcolor'),
482 'border' => $border == 'none' ? null : $border . ' ' . $border_width . $border_unit . ' ' . $border_color,
483 ];
484
485 // add shared properties
486 $shared_properties = [
487 'width' => [
488 'prefix_only' => true
489 ],
490 'height' => [
491 'prefix_only' => true
492 ],
493 'padding' => [],
494 'margin' => []
495 ];
496 foreach ($shared_properties as $prop => $prop_data)
497 {
498 // add dekstop property
499 $value = (array) $box->params->get($prop . '_control.' . $prop, []);
500 if (isset($value['desktop']))
501 {
502 $prefix_only = isset($prop_data['prefix_only']) ? (bool) $prop_data['prefix_only'] : false;
503
504 $desktop_value = DimensionsHelper::parseDimensionsData($value['desktop'], $prop, false, $prefix_only);
505 $style = array_merge($style, $desktop_value);
506 }
507 }
508
509 // add dekstop border_radius
510 $border_radius = (array) $box->params->get('borderradius_control.borderradius', []);
511 if (isset($border_radius['desktop']))
512 {
513 $desktop_border_radius = DimensionsHelper::parseDimensionsBorderRadiusData($border_radius['desktop']);
514 $style = array_merge($style, $desktop_border_radius);
515 }
516
517 // Background Image
518 if ($box->params->get('bgimage', false))
519 {
520 $bgrepeat = is_string($box->params->get('bgrepeat')) ? $box->params->get('bgrepeat') : '';
521 $bgsize = is_string($box->params->get('bgsize')) ? $box->params->get('bgsize') : '';
522 $bgposition = is_string($box->params->get('bgposition')) ? $box->params->get('bgposition') : '';
523
524 $style['background-image'] = 'url(\'' . esc_url($box->params->get('bgimagefile')) . '\')';
525 $style['background-repeat'] = strtolower($bgrepeat);
526 $style['background-size'] = strtolower($bgsize);
527 $style['background-position'] = strtolower($bgposition);
528 }
529
530 $box->style = BoxHelper::arrayToCSSS($style);
531
532 $trigger_point_methods = [
533 'pageheight' => 'onScrollDepth',
534 'element' => 'onElementVisibility',
535 'pageready' => 'onPageReady',
536 'pageload' => 'onPageLoad',
537 'userleave' => 'onExit',
538 'onclick' => 'onClick',
539 'elementHover' => 'onHover',
540 'ondemand' => 'onDemand'
541 ];
542
543 /* Other Settings */
544 $scroll_depth = $box->params->get('scroll_depth', 'percentage');
545 $scroll_depth = is_string($scroll_depth) ? $scroll_depth : '';
546
547 $animation_duration = $box->params->get('duration') ? (float) $box->params->get('duration') : 0;
548
549 // Use Namespaced classes for each trigger point and let them manipulate the settings dynamicaly.
550 $box->settings = [
551 'trigger' => (is_string($box->params->get('triggermethod'))) && array_key_exists($box->params->get('triggermethod'), $trigger_point_methods) ? $trigger_point_methods[$box->params->get('triggermethod')] : $box->params->get('triggermethod'),
552 'trigger_selector' => $box->params->get('triggerelement'),
553 'delay' => (int) $box->params->get('triggerdelay') * 1000,
554 'scroll_depth' => $scroll_depth,
555 'scroll_depth_value' => $scroll_depth == 'percentage' ? (int) $box->params->get('triggerpercentage') : (int) $box->params->get('scroll_pixel'),
556 'firing_frequency' => (int) $box->params->get('firing_frequency', 1),
557 'reverse_scroll_close' => (bool) $box->params->get('autohide'),
558 'threshold' => (float) $box->params->get('threshold', 0) / 100,
559 'close_out_viewport' => (bool) $box->params->get('close_out_viewport', false),
560 'exit_timer' => (int) $box->params->get('exittimer') * 1000,
561 'idle_time' => (int) $box->params->get('idle_time') * 1000,
562 'animation_open' => $box->params->get('animationin'),
563 'animation_close' => $box->params->get('animationout'),
564 'animation_duration' => (float) $animation_duration * 1000,
565 'prevent_default' => (bool) $box->params->get('preventdefault', true),
566 'backdrop' => (bool) $box->params->get('overlay'),
567 'backdrop_color' => $box->params->get('overlay_color'),
568 'backdrop_click' => (bool) $box->params->get('overlayclick'),
569 'disable_page_scroll' => (bool) $box->params->get('preventpagescroll'),
570 'test_mode' => (bool) $box->params->get('testmode'),
571 'debug' => (bool) $cParam->get('debug', false),
572 'ga_tracking' => (bool) $cParam->get('gaTrack', 0),
573 'ga_tracking_id' => $cParam->get('gaID', 0),
574 'ga_tracking_label' => $cParam->get('gaCategory'),
575 'auto_focus' => (bool) $box->params->get('autofocus', false)
576 ];
577
578 $box->styles_container = BoxHelper::arrayToCSSS([
579 'z-index' => $box->params->get('zindex', 99999) != 99999 ? $box->params->get('zindex') : null
580 ]);
581
582 // Let's start using CSS vars for each box settings.
583 $cssVars = [
584 'animation_duration' => (float) $animation_duration . 's'
585 ];
586
587 // Enqueue firebox custom inline CSS
588 $cssVarsForm = self::cssVarsToString($cssVars, '.fb-' . $box->ID);
589 if (!did_action('wp_enqueue_scripts'))
590 {
591 add_action('wp_enqueue_scripts', function() use ($cssVarsForm) {
592 wp_add_inline_style('firebox-custom-styles', $cssVarsForm);
593 });
594 }
595 else
596 {
597 wp_add_inline_style('firebox-custom-styles', $cssVarsForm);
598 }
599
600 // set padding and margin for other devices as well
601 self::setResponsiveCSS($box);
602
603 self::replaceBoxSmartTags($box);
604
605 $GLOBALS['post'] = $original_post;
606 wp_reset_postdata();
607 }
608
609 /**
610 * Converts an array of CSS variables to its corresponding strings.
611 *
612 * @param array $cssVars
613 * @param string $namespace
614 *
615 * @return string
616 */
617 private static function cssVarsToString($cssVars, $namespace)
618 {
619 $output = '';
620
621 foreach ($cssVars as $key => $value)
622 {
623 $output .= '--' . $key . ': ' . $value . ';' . "\n";
624 }
625
626 return $namespace . ' {
627 ' . $output . '
628 }
629 ';
630 }
631
632 /**
633 * Sets all responsive CSS to use in box view
634 *
635 * @param object $box
636 *
637 * @return void
638 */
639 private static function setResponsiveCSS(&$box)
640 {
641 $tablet = '';
642 $mobile = '';
643
644 /**
645 * Handle width, height, padding, margin the same way.
646 */
647 $shared_properties = [
648 'width' => [
649 'prefix_only' => true
650 ],
651 'height' => [
652 'prefix_only' => true
653 ],
654 'padding' => [],
655 'margin' => []
656 ];
657
658 foreach ($shared_properties as $prop => $prop_settings)
659 {
660 $prop_data = (array) $box->params->get($prop . '_control.' . $prop, []);
661
662 $prefix_only = isset($prop_settings['prefix_only']) ? $prop_settings['prefix_only'] : false;
663
664 // assign each device CSS
665 if (isset($prop_data['tablet']))
666 {
667 $tablet .= BoxHelper::arrayToCSSS(DimensionsHelper::parseDimensionsData($prop_data['tablet'], $prop, true, $prefix_only));
668 }
669 if (isset($prop_data['mobile']))
670 {
671 $mobile .= BoxHelper::arrayToCSSS(DimensionsHelper::parseDimensionsData($prop_data['mobile'], $prop, true, $prefix_only));
672 }
673 }
674
675 // border radius requires a special method
676 $border_radius = (array) $box->params->get('borderradius_control.borderradius', []);
677 if (isset($border_radius['tablet']))
678 {
679 $tablet .= BoxHelper::arrayToCSSS(DimensionsHelper::parseDimensionsBorderRadiusData($border_radius['tablet'], true));
680 }
681 if (isset($border_radius['mobile']))
682 {
683 $mobile .= BoxHelper::arrayToCSSS(DimensionsHelper::parseDimensionsBorderRadiusData($border_radius['mobile'], true));
684 }
685
686 $responsive_css = [
687 'tablet' => $tablet,
688 'mobile' => $mobile
689 ];
690 $box->params->set('responsive_css', $responsive_css);
691 }
692
693 /**
694 * Replaces all box smart tags
695 *
696 * @param object $box
697 *
698 * @return object
699 */
700 public static function replaceBoxSmartTags(&$box)
701 {
702 $tags = new \FPFramework\Base\SmartTags\SmartTags();
703
704 // register FB Smart Tags
705 $tags->register('\FireBox\Core\SmartTags', FBOX_BASE_FOLDER . '/Inc/Core/SmartTags', $box);
706
707 $box = $tags->replace($box);
708 }
709
710 /**
711 * Checks if a box passes assignments
712 *
713 * @param object $box
714 *
715 * @return boolean
716 */
717 public function pass($box)
718 {
719 if (!$box || !is_object($box))
720 {
721 return false;
722 }
723
724 // set box settings if empty
725 if (empty($this->boxSettings))
726 {
727 $this->boxSettings = $box;
728 }
729
730 // Prepare boxes that mirror other boxes assignments
731 if ($box->params->get('mirror', false) && $mirror_box_id = $box->params->get('mirror_box'))
732 {
733 $box->params->merge(self::getAssignmentsForMirroring($mirror_box_id));
734 }
735
736 // Check first local assignments
737 if (!$this->passLocalAssignments($box))
738 {
739 return false;
740 }
741
742 // If testmode is enabled disable the User Groups assignment
743 if ($box->params->get('testmode'))
744 {
745 $box->params->set('assignments.assign_grouplevel.selection', '0');
746 }
747
748 $globalAssignments = $this->passGlobalAssignments($box);
749
750 // Check framework based assignments
751 return $globalAssignments;
752 }
753
754 /**
755 * Passes framework based global assignments
756 *
757 * @param object $box
758 *
759 * @return boolean
760 */
761 private function passGlobalAssignments($box)
762 {
763 $assignments = new \FPFramework\Base\Assignments($this->factory);
764 $pass = $assignments->passAll($box, $box->params->get('assignmentMatchingMethod', 'and'));
765 return $pass;
766 }
767
768 /**
769 * Check if a box passes local assignments
770 *
771 * @param object $box
772 *
773 * @return boolean
774 */
775 private function passLocalAssignments($box)
776 {
777 $localAssignments = new \FireBox\Core\FB\Assignments($this, $this->factory);
778 return $localAssignments->passAll();
779 }
780
781 /**
782 * Gets assignments of mirrored box
783 *
784 * @param int $box_id
785 *
786 * @return object
787 */
788 private static function getAssignmentsForMirroring($box_id)
789 {
790 $payload = [
791 'where' => [
792 'ID' => ' = ' . intval($box_id),
793 'post_status' => " = 'publish'",
794 'post_type' => " = 'firebox'"
795 ]
796 ];
797
798 // Load box
799 if (!$box = firebox()->tables->box->getResults($payload))
800 {
801 return;
802 }
803
804 $box = $box[0];
805
806 // get meta options for box
807 $meta = get_post_meta($box_id, 'fpframework_meta_settings', true);
808 $box->params = $meta;
809
810 // To prevent user frustration, we ignore the following assignments because they are not displayed in the Publishing Assignments.
811 $params_to_ignore = [
812 'assign_impressions'
813 ];
814
815 $assignments = [];
816
817 // Gather params to merge
818 foreach ($box->params as $param_key => $param_value)
819 {
820 if (strpos($param_key, 'assign') === false || in_array($param_key, $params_to_ignore))
821 {
822 continue;
823 }
824
825 $assignments[$param_key] = $param_value;
826 }
827
828 return new Registry($assignments);
829 }
830
831 /**
832 * Prefixes the CSS classes
833 *
834 * @param array $classes
835 * @param string $prefix
836 *
837 * @return void
838 */
839 private static function prefixCSSClasses(&$classes, $prefix = 'fb-')
840 {
841 $classes = array_filter($classes);
842
843 if (empty($classes))
844 {
845 return;
846 }
847
848 foreach ($classes as &$class)
849 {
850 $class = $prefix . $class;
851 }
852 }
853
854 /**
855 * Track box open
856 *
857 * @param integer $box_id
858 * @param string $page
859 * @param string $referrer
860 *
861 * @return void
862 */
863 public function logOpenEvent($box_id, $page = null, $referrer = null)
864 {
865 $box = $this->get($box_id);
866
867 // Do not track if statistics option is disabled
868 $track_open_event = (bool) (is_null($box->params->get('stats', null)) ? BoxHelper::getParams()->get('stats', 1) : $box->params->get('stats'));
869 if (!$track_open_event)
870 {
871 return;
872 }
873
874 return firebox()->log->track($box_id, 1, null, $page, $referrer);
875 }
876
877 /**
878 * Track box close
879 *
880 * @param integer $box_id
881 * @param integer $box_log_id
882 *
883 * @return void
884 */
885 public function logCloseEvent($box_id, $box_log_id)
886 {
887 $box = $this->get($box_id);
888
889 // Do not track if statistics option is disabled
890 $track_open_event = (bool) (is_null($box->params->get('stats', null)) ? BoxHelper::getParams()->get('stats', 1) : $box->params->get('stats'));
891 if (!$track_open_event)
892 {
893 return null;
894 }
895
896 firebox()->log->track($box_id, 2, $box_log_id);
897 }
898
899 /**
900 * Get box impressions
901 *
902 * @param array $payload
903 *
904 * @return array
905 */
906 public function getImpressions($payload)
907 {
908 return firebox()->tables->boxlog->getResults($payload);
909 }
910
911 /**
912 * Get total box impressions
913 *
914 * @param array $payload
915 *
916 * @return array
917 */
918 public function getTotalImpressions($payload)
919 {
920 return count($this->getImpressions($payload));
921 }
922
923 /**
924 * Return the box settings
925 *
926 * @return object
927 */
928 public function getBoxSettings()
929 {
930 return $this->boxSettings;
931 }
932
933 /**
934 * Sets the box settings
935 *
936 * @param object $settings
937 *
938 * @return object
939 */
940 public function setBoxSettings($settings)
941 {
942 $this->boxSettings = $settings;
943 }
944
945 /**
946 * Returns the box cookie
947 *
948 * @param string $cookie
949 *
950 * @return mixed
951 */
952 public function getCookie($cookie = null)
953 {
954 $cookie = $cookie ? $cookie : (isset($this->boxSettings->ID) ? $this->boxSettings->ID : null);
955 if (!isset($cookie))
956 {
957 return;
958 }
959
960 return new Cookie($cookie);
961 }
962 }