PluginProbe
FireBox – WooCommerce Popup Builder, Exit Intent Popup, Email Optin & Cart Abandonment / 3.1.9
FireBox – WooCommerce Popup Builder, Exit Intent Popup, Email Optin & Cart Abandonment v3.1.9
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 / Controllers / BoxSettings.php

BoxSettings.php in FireBox – WooCommerce Popup Builder, Exit Intent Popup, Email Optin & Cart Abandonment 3.1.9, at Inc/Core/Controllers/BoxSettings.php

249 lines 6.4 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 3.1.9 Free
5 *
6 * @author FirePlugins <info@fireplugins.com>
7 * @link https://www.fireplugins.com
8 * @copyright Copyright © 2026 FirePlugins All Rights Reserved
9 * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
10 */
11
12 namespace FireBox\Core\Controllers;
13
14 if (!defined('ABSPATH'))
15 {
16 exit; // Exit if accessed directly.
17 }
18
19 use FPFramework\Base\Form;
20 use FPFramework\Base\FieldsParser;
21 use FPFramework\Base\Ui\Tabs;
22
23 class BoxSettings extends BaseController
24 {
25 protected $action = '';
26
27 /**
28 * The form settings name
29 *
30 * @var string
31 */
32 const settings_name = 'firebox_settings';
33
34 public function __construct()
35 {
36 add_action('update_option_firebox_settings', [$this, 'after_update_settings'], 10, 2);
37 }
38
39 /**
40 * Render the page content
41 *
42 * @return void
43 */
44 public function render()
45 {
46 // page content
47 add_action('firebox/settings_page', [$this, 'settingsPageContent']);
48
49 // render layout
50 firebox()->renderer->admin->render('pages/settings');
51 }
52
53 /**
54 * Stop the usage tracking if the user disables the tracking behavior.
55 *
56 * @param array $old_value
57 * @param array $new_value
58 *
59 * @return void
60 */
61 public function after_update_settings($old_value, $new_value)
62 {
63 if (isset($new_value['usage_tracking']) && !$new_value['usage_tracking'])
64 {
65 $tracking = new \FireBox\Core\UsageTracking\SendUsage();
66 $tracking->stop();
67 }
68 }
69
70 /**
71 * Load required media files
72 *
73 * @return void
74 */
75 public function addMedia()
76 {
77 // load geoip js
78 wp_register_script(
79 'fpf-geoip',
80 FPF_MEDIA_URL . 'admin/js/fpf_geoip.js',
81 [],
82 FPF_VERSION,
83 false
84 );
85 wp_enqueue_script('fpf-geoip');
86
87 wp_register_script(
88 'firebox-settings-integrations',
89 FBOX_MEDIA_ADMIN_URL . 'js/integrations_settings.js',
90 [],
91 FBOX_VERSION,
92 true
93 );
94 wp_enqueue_script('firebox-settings-integrations');
95
96 wp_register_style(
97 'firebox-settings-integrations',
98 FBOX_MEDIA_ADMIN_URL . 'css/integrations_settings.css',
99 [],
100 FBOX_VERSION
101 );
102 wp_enqueue_style('firebox-settings-integrations');
103
104 $integrations = [];
105 foreach (\FireBox\Core\Helpers\Integrations::getSettingsManagedIntegrations() as $integration)
106 {
107 $integrations[$integration['slug']] = [
108 'label' => $integration['label'],
109 'connected' => !empty($integration['connected']),
110 'locked' => !empty($integration['locked']),
111 'connection_type' => isset($integration['connection_type']) ? $integration['connection_type'] : 'api_key',
112 'docs_url' => isset($integration['docs_url']) ? $integration['docs_url'] : ''
113 ];
114 }
115
116 $data = [
117 'ajax_url' => admin_url('admin-ajax.php'),
118 'settings_url' => admin_url('admin.php?page=firebox-settings#integrations'),
119 'nonce' => wp_create_nonce('fpf_js_nonce'),
120 'i18n' => [
121 'connected' => firebox()->_('FB_INTEGRATION_CONNECTED'),
122 'disconnected' => firebox()->_('FB_INTEGRATION_DISCONNECTED'),
123 'could_not_connect' => firebox()->_('FB_INTEGRATION_ERROR_CONNECT'),
124 'could_not_disconnect' => firebox()->_('FB_INTEGRATION_ERROR_DISCONNECT'),
125 'please_enter_api_key' => fpframework()->_('FPF_PLEASE_ENTER_AN_API_KEY')
126 ],
127 'integrations' => $integrations
128 ];
129
130 wp_localize_script('firebox-settings-integrations', 'firebox_integrations_settings', $data);
131 }
132
133 /**
134 * Callback used to handle the processing of settings.
135 * Useful when using a Repeater field to remove the template from the list of submitted items.
136 *
137 * @param array $input
138 *
139 * @return void
140 */
141 public function processBoxSettings($input)
142 {
143 if ($this->isAllowedProgrammaticSettingsUpdate())
144 {
145 return is_array($input) ? $input : [];
146 }
147
148 $input = is_array($input) ? $input : [];
149 $is_settings_form_submit = isset($_POST['option_page']) && sanitize_text_field(wp_unslash($_POST['option_page'])) === self::settings_name;
150
151 // Allow programmatic updates (e.g. AJAX integration connect/disconnect) without settings form nonce.
152 if (!$is_settings_form_submit)
153 {
154 return $input;
155 }
156
157 // run a quick security check
158 if (!check_admin_referer('fpf_form_nonce_firebox_settings', 'fpf_form_nonce_firebox_settings'))
159 {
160 return; // get out if we didn't click the Activate button
161 }
162
163 // Disable usage tracking
164 if (!isset($input['usage_tracking']))
165 {
166 $tracking = new \FireBox\Core\UsageTracking\SendUsage();
167 $tracking->stop();
168 }
169
170
171
172 // Preserve integration keys managed through AJAX connect/disconnect.
173 $stored_settings = get_option('firebox_settings', []);
174 $stored_settings = is_array($stored_settings) ? $stored_settings : [];
175 foreach (\FireBox\Core\Helpers\Integrations::getSettingsKeys() as $key)
176 {
177 if (!array_key_exists($key, $input) && isset($stored_settings[$key]))
178 {
179 $input[$key] = $stored_settings[$key];
180 }
181 }
182
183 // Filters the fields value
184 \FPFramework\Helpers\FormHelper::filterFields($input, \FireBox\Core\Admin\Forms\Settings::getSettings());
185
186 \FPFramework\Libs\AdminNotice::displaySuccess(fpframework()->_('FPF_SETTINGS_SAVED'));
187
188 return $input;
189 }
190
191 /**
192 * Allow a small set of internal settings updates to bypass the settings-form nonce.
193 *
194 * @return bool
195 */
196 private function isAllowedProgrammaticSettingsUpdate()
197 {
198 $action = isset($_REQUEST['action']) ? sanitize_key(wp_unslash($_REQUEST['action'])) : '';
199
200 if ($action === '')
201 {
202 return false;
203 }
204
205 return in_array($action, [
206 'firebox_download_key_notice_activate',
207 'firebox_enable_usage_tracking',
208 ], true);
209 }
210
211
212
213 /**
214 * What the settings page will contain
215 *
216 * @return void
217 */
218 public function settingsPageContent()
219 {
220 $fieldsParser = new FieldsParser([
221 'fields_name_prefix' => 'firebox_settings',
222 'fields_path' => ['\\FireBox\\Core\\Fields\\']
223 ]);
224
225 $settings = \FireBox\Core\Admin\Forms\Settings::getSettings();
226 foreach ($settings['data'] as $key => $value)
227 {
228 ob_start();
229 $fieldsParser->renderContentFields($value);
230 $html = ob_get_contents();
231 ob_end_clean();
232
233 $settings['data'][$key]['title'] = $value['title'];
234 $settings['data'][$key]['content'] = $html;
235 }
236
237 // render settings as tabs
238 $tabs = new Tabs($settings);
239
240 // render form
241 $form = new Form($tabs->render(), [
242 'section_name' => self::settings_name
243 ]);
244
245 echo $form->render(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
246 }
247
248 }
249