PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.3
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.3
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
formidable / classes / models / FrmInbox.php

FrmInbox.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 6.3, at classes/models/FrmInbox.php

382 lines 8.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 die( 'You are not allowed to call this page directly.' );
4 }
5
6 /**
7 * @since 4.05
8 */
9 class FrmInbox extends FrmFormApi {
10
11 protected $cache_key;
12
13 private $option = 'frm_inbox';
14
15 private static $messages = false;
16
17 /**
18 * @param array
19 */
20 private static $banner_messages;
21
22 public function __construct( $for_parent = null ) {
23 $this->set_cache_key();
24
25 if ( false === self::$messages ) {
26 $this->set_messages();
27 }
28 }
29
30 /**
31 * @since 4.05
32 *
33 * @return void
34 */
35 protected function set_cache_key() {
36 $this->cache_key = 'frm_inbox_cache';
37 }
38
39 /**
40 * @since 4.05
41 *
42 * @return string
43 */
44 protected function api_url() {
45 return 'https://formidableforms.com/wp-json/inbox/v1/message/';
46 }
47
48 /**
49 * @since 4.05
50 *
51 * @param false|string $filter
52 */
53 public function get_messages( $filter = false ) {
54 $messages = self::$messages;
55 if ( $filter === 'filter' ) {
56 $this->filter_messages( $messages );
57 }
58 return $messages;
59 }
60
61 /**
62 * @since 4.05
63 *
64 * @return void
65 */
66 public function set_messages() {
67 self::$messages = get_option( $this->option );
68 if ( ! is_array( self::$messages ) ) {
69 self::$messages = array();
70 }
71
72 $this->add_api_messages();
73
74 /**
75 * Messages are in an array.
76 */
77 self::$messages = apply_filters( 'frm_inbox', self::$messages );
78 }
79
80 /**
81 * @since 4.05
82 *
83 * @return void
84 */
85 private function add_api_messages() {
86 $api = $this->get_api_info();
87 if ( empty( $api ) ) {
88 return;
89 }
90
91 foreach ( $api as $message ) {
92 $this->add_message( $message );
93 }
94 }
95
96 /**
97 * @param array|string $message
98 *
99 * @return void
100 */
101 public function add_message( $message ) {
102 if ( ! is_array( $message ) || ! isset( $message['key'] ) ) {
103 // if the API response is invalid, $message may not be an array.
104 // if there are no messages from the API, it is returning a "No Entries Found" item with no key, so check for a key as well.
105 return;
106 }
107
108 if ( isset( self::$messages[ $message['key'] ] ) && ! isset( $message['force'] ) ) {
109 // Don't replace messages unless required.
110 return;
111 }
112
113 if ( $this->is_expired( $message ) ) {
114 return;
115 }
116
117 if ( isset( self::$messages[ $message['key'] ] ) ) {
118 // Move up and mark as new.
119 unset( self::$messages[ $message['key'] ] );
120 }
121
122 $this->fill_message( $message );
123 self::$messages[ $message['key'] ] = $message;
124
125 $this->update_list();
126
127 $this->clean_messages();
128 }
129
130 /**
131 * @param array $message
132 *
133 * @return void
134 */
135 private function fill_message( &$message ) {
136 $defaults = array(
137 'time' => time(),
138 'message' => '',
139 'subject' => '',
140 'icon' => 'frm_tooltip_icon',
141 'cta' => '',
142 'expires' => false,
143 'who' => 'all', // use 'free', 'personal', 'business', 'elite', 'grandfathered'
144 'type' => '',
145 );
146
147 $message = array_merge( $defaults, $message );
148
149 $message['created'] = $message['time'];
150 unset( $message['time'] );
151 }
152
153 /**
154 * @return void
155 */
156 private function clean_messages() {
157 $removed = false;
158 foreach ( self::$messages as $t => $message ) {
159 $read = isset( $message['read'] ) && ! empty( $message['read'] ) && isset( $message['read'][ get_current_user_id() ] ) && $message['read'][ get_current_user_id() ] < strtotime( '-1 month' );
160 $dismissed = isset( $message['dismissed'] ) && ! empty( $message['dismissed'] ) && isset( $message['dismissed'][ get_current_user_id() ] ) && $message['dismissed'][ get_current_user_id() ] < strtotime( '-1 week' );
161 $expired = $this->is_expired( $message );
162 if ( $read || $expired || $dismissed ) {
163 unset( self::$messages[ $t ] );
164 $removed = true;
165 }
166 }
167
168 if ( $removed ) {
169 $this->update_list();
170 }
171 }
172
173 /**
174 * @return void
175 */
176 private function filter_messages( &$messages ) {
177 $user_id = get_current_user_id();
178 foreach ( $messages as $k => $message ) {
179 $dismissed = isset( $message['dismissed'] ) && isset( $message['dismissed'][ $user_id ] );
180 if ( empty( $k ) || $this->is_expired( $message ) || $dismissed ) {
181 unset( $messages[ $k ] );
182 } elseif ( ! $this->is_for_user( $message ) ) {
183 unset( $messages[ $k ] );
184 }
185 }
186 $messages = apply_filters( 'frm_filter_inbox', $messages );
187 }
188
189 /**
190 * @param array $message
191 *
192 * @return bool
193 */
194 private function is_expired( $message ) {
195 return isset( $message['expires'] ) && ! empty( $message['expires'] ) && $message['expires'] < time();
196 }
197
198 /**
199 * Show different messages for different accounts.
200 *
201 * @param array $message
202 * @return bool
203 */
204 private function is_for_user( $message ) {
205 if ( ! isset( $message['who'] ) || $message['who'] === 'all' ) {
206 return true;
207 }
208 $who = (array) $message['who'];
209 if ( in_array( 'all', $who, true ) || in_array( 'everyone', $who, true ) ) {
210 return true;
211 }
212 return in_array( $this->get_user_type(), $who, true );
213 }
214
215 private function get_user_type() {
216 if ( ! FrmAppHelper::pro_is_installed() ) {
217 return 'free';
218 }
219
220 return FrmAddonsController::license_type();
221 }
222
223 /**
224 * @param string $key
225 *
226 * @return void
227 */
228 public function mark_read( $key ) {
229 if ( ! $key || ! isset( self::$messages[ $key ] ) ) {
230 return;
231 }
232
233 if ( ! isset( self::$messages[ $key ]['read'] ) ) {
234 self::$messages[ $key ]['read'] = array();
235 }
236 self::$messages[ $key ]['read'][ get_current_user_id() ] = time();
237
238 $this->update_list();
239 }
240
241 /**
242 * @param string $key
243 *
244 * @since 4.05.02
245 *
246 * @return void
247 */
248 public function mark_unread( $key ) {
249 $is_read = isset( self::$messages[ $key ] ) && isset( self::$messages[ $key ]['read'] ) && isset( self::$messages[ $key ]['read'][ get_current_user_id() ] );
250 if ( $is_read ) {
251 unset( self::$messages[ $key ]['read'][ get_current_user_id() ] );
252 $this->update_list();
253 }
254 }
255
256 /**
257 * @param string $key
258 *
259 * @return void
260 */
261 public function dismiss( $key ) {
262 if ( $key === 'all' ) {
263 $this->dismiss_all();
264 return;
265 }
266
267 if ( ! isset( self::$messages[ $key ] ) ) {
268 return;
269 }
270
271 if ( ! isset( self::$messages[ $key ]['dismissed'] ) ) {
272 self::$messages[ $key ]['dismissed'] = array();
273 }
274 self::$messages[ $key ]['dismissed'][ get_current_user_id() ] = time();
275
276 $this->update_list();
277 }
278
279 /**
280 * @since 4.06
281 *
282 * @return void
283 */
284 private function dismiss_all() {
285 $user_id = get_current_user_id();
286 foreach ( self::$messages as $key => $message ) {
287 if ( ! isset( $message['dismissed'] ) ) {
288 self::$messages[ $key ]['dismissed'] = array();
289 }
290
291 if ( ! isset( $message['dismissed'][ $user_id ] ) ) {
292 self::$messages[ $key ]['dismissed'][ $user_id ] = time();
293 }
294 }
295 $this->update_list();
296 }
297
298 public function unread() {
299 $messages = $this->get_messages( 'filter' );
300 $user_id = get_current_user_id();
301 foreach ( $messages as $t => $message ) {
302 if ( isset( $message['read'] ) && isset( $message['read'][ $user_id ] ) ) {
303 unset( $messages[ $t ] );
304 }
305 }
306 return $messages;
307 }
308
309 public function unread_html() {
310 $html = '';
311 $count = count( $this->unread() );
312 if ( $count ) {
313 $html = ' <span class="update-plugins frm_inbox_count"><span class="plugin-count">' . absint( $count ) . '</span></span>';
314
315 /**
316 * @since 4.06.01
317 */
318 $html = apply_filters( 'frm_inbox_badge', $html );
319 }
320 return $html;
321 }
322
323 /**
324 * @since 4.05.02
325 *
326 * @param string $key
327 *
328 * @return void
329 */
330 public function remove( $key ) {
331 if ( isset( self::$messages[ $key ] ) ) {
332 unset( self::$messages[ $key ] );
333 $this->update_list();
334 }
335 }
336
337 /**
338 * @return void
339 */
340 private function update_list() {
341 update_option( $this->option, self::$messages, 'no' );
342 }
343
344 /**
345 * Show a banner message if one is available.
346 *
347 * @return bool True if a banner is available and shown.
348 */
349 public static function maybe_show_banner() {
350 if ( empty( self::$banner_messages ) ) {
351 return false;
352 }
353 $message = end( self::$banner_messages );
354 require FrmAppHelper::plugin_path() . '/classes/views/inbox/banner.php';
355 return true;
356 }
357
358 /**
359 * @return void
360 */
361 public static function maybe_disable_screen_options() {
362 self::$banner_messages = self::get_banner_messages();
363 if ( self::$banner_messages ) {
364 // disable screen options tab when displaying banner messages because it gets in the way of the banner.
365 add_filter( 'screen_options_show_screen', '__return_false' );
366 }
367 }
368
369 /**
370 * @return array
371 */
372 private static function get_banner_messages() {
373 $inbox = new self();
374 return array_filter(
375 $inbox->get_messages( 'filter' ),
376 function( $message ) {
377 return ! empty( $message['banner'] );
378 }
379 );
380 }
381 }
382