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