PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.8.2
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.8.2
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.8.2, at classes/models/FrmInbox.php

395 lines 8.7 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 * @var 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|array $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 // Use 'free', 'personal', 'business', 'elite', 'grandfathered'.
144 'who' => 'all',
145 'type' => '',
146 );
147
148 $message = array_merge( $defaults, $message );
149
150 $message['created'] = $message['time'];
151 unset( $message['time'] );
152 }
153
154 /**
155 * @return void
156 */
157 private function clean_messages() {
158 $removed = false;
159 foreach ( self::$messages as $t => $message ) {
160 $read = isset( $message['read'] ) && ! empty( $message['read'] ) && isset( $message['read'][ get_current_user_id() ] ) && $message['read'][ get_current_user_id() ] < strtotime( '-1 month' );
161 $dismissed = isset( $message['dismissed'] ) && ! empty( $message['dismissed'] ) && isset( $message['dismissed'][ get_current_user_id() ] ) && $message['dismissed'][ get_current_user_id() ] < strtotime( '-1 week' );
162 $expired = $this->is_expired( $message );
163 if ( $read || $expired || $dismissed ) {
164 unset( self::$messages[ $t ] );
165 $removed = true;
166 }
167 }
168
169 if ( $removed ) {
170 $this->update_list();
171 }
172 }
173
174 /**
175 * @return void
176 */
177 public function filter_messages( &$messages, $type = 'unread' ) {
178 $user_id = get_current_user_id();
179 foreach ( $messages as $k => $message ) {
180 $dismissed = isset( $message['dismissed'] ) && isset( $message['dismissed'][ $user_id ] );
181 if ( empty( $k ) || $this->is_expired( $message ) || ( $type === 'dismissed' ) !== $dismissed ) {
182 unset( $messages[ $k ] );
183 } elseif ( ! $this->is_for_user( $message ) ) {
184 unset( $messages[ $k ] );
185 }
186 }
187 $messages = apply_filters( 'frm_filter_inbox', $messages );
188 }
189
190 /**
191 * @param array $message
192 *
193 * @return bool
194 */
195 private function is_expired( $message ) {
196 return isset( $message['expires'] ) && ! empty( $message['expires'] ) && $message['expires'] < time();
197 }
198
199 /**
200 * Show different messages for different accounts.
201 *
202 * @param array $message
203 * @return bool
204 */
205 private function is_for_user( $message ) {
206 if ( ! isset( $message['who'] ) || $message['who'] === 'all' ) {
207 return true;
208 }
209 $who = (array) $message['who'];
210 if ( in_array( 'all', $who, true ) || in_array( 'everyone', $who, true ) ) {
211 return true;
212 }
213 if ( in_array( $this->get_user_type(), $who, true ) ) {
214 return true;
215 }
216 /**
217 * Allow for other special inbox cases in other add-ons.
218 *
219 * @since 6.8.1
220 *
221 * @param bool $is_for_user
222 * @param array $who
223 * @param array $message
224 */
225 return (bool) apply_filters( 'frm_inbox_message_is_for_user', false, $who, $message );
226 }
227
228 private function get_user_type() {
229 if ( ! FrmAppHelper::pro_is_installed() ) {
230 return 'free';
231 }
232
233 return FrmAddonsController::license_type();
234 }
235
236 /**
237 * @param string $key
238 *
239 * @return void
240 */
241 public function mark_read( $key ) {
242 if ( ! $key || ! isset( self::$messages[ $key ] ) ) {
243 return;
244 }
245
246 if ( ! isset( self::$messages[ $key ]['read'] ) ) {
247 self::$messages[ $key ]['read'] = array();
248 }
249 self::$messages[ $key ]['read'][ get_current_user_id() ] = time();
250
251 $this->update_list();
252 }
253
254 /**
255 * @param string $key
256 *
257 * @since 4.05.02
258 *
259 * @return void
260 */
261 public function mark_unread( $key ) {
262 $is_read = isset( self::$messages[ $key ] ) && isset( self::$messages[ $key ]['read'] ) && isset( self::$messages[ $key ]['read'][ get_current_user_id() ] );
263 if ( $is_read ) {
264 unset( self::$messages[ $key ]['read'][ get_current_user_id() ] );
265 $this->update_list();
266 }
267 }
268
269 /**
270 * @param string $key
271 *
272 * @return void
273 */
274 public function dismiss( $key ) {
275 if ( $key === 'all' ) {
276 $this->dismiss_all();
277 return;
278 }
279
280 if ( ! isset( self::$messages[ $key ] ) ) {
281 return;
282 }
283
284 if ( ! isset( self::$messages[ $key ]['dismissed'] ) ) {
285 self::$messages[ $key ]['dismissed'] = array();
286 }
287 self::$messages[ $key ]['dismissed'][ get_current_user_id() ] = time();
288
289 $this->update_list();
290 }
291
292 /**
293 * @since 4.06
294 *
295 * @return void
296 */
297 private function dismiss_all() {
298 $user_id = get_current_user_id();
299 foreach ( self::$messages as $key => $message ) {
300 if ( ! isset( $message['dismissed'] ) ) {
301 self::$messages[ $key ]['dismissed'] = array();
302 }
303
304 if ( ! isset( $message['dismissed'][ $user_id ] ) ) {
305 self::$messages[ $key ]['dismissed'][ $user_id ] = time();
306 }
307 }
308 $this->update_list();
309 }
310
311 public function unread() {
312 $messages = $this->get_messages( 'filter' );
313 $user_id = get_current_user_id();
314 foreach ( $messages as $t => $message ) {
315 if ( isset( $message['read'] ) && isset( $message['read'][ $user_id ] ) ) {
316 unset( $messages[ $t ] );
317 }
318 }
319 return $messages;
320 }
321
322 public function unread_html() {
323 $html = '';
324 $count = count( $this->unread() );
325 if ( $count ) {
326 $html = ' <span class="update-plugins frm_inbox_count"><span class="plugin-count">' . absint( $count ) . '</span></span>';
327
328 /**
329 * @since 4.06.01
330 */
331 $html = apply_filters( 'frm_inbox_badge', $html );
332 }
333 return $html;
334 }
335
336 /**
337 * @since 4.05.02
338 *
339 * @param string $key
340 *
341 * @return void
342 */
343 public function remove( $key ) {
344 if ( isset( self::$messages[ $key ] ) ) {
345 unset( self::$messages[ $key ] );
346 $this->update_list();
347 }
348 }
349
350 /**
351 * @return void
352 */
353 private function update_list() {
354 update_option( $this->option, self::$messages, 'no' );
355 }
356
357 /**
358 * Show a banner message if one is available.
359 *
360 * @return bool True if a banner is available and shown.
361 */
362 public static function maybe_show_banner() {
363 if ( empty( self::$banner_messages ) ) {
364 return false;
365 }
366 $message = end( self::$banner_messages );
367 require FrmAppHelper::plugin_path() . '/classes/views/inbox/banner.php';
368 return true;
369 }
370
371 /**
372 * @return void
373 */
374 public static function maybe_disable_screen_options() {
375 self::$banner_messages = self::get_banner_messages();
376 if ( self::$banner_messages ) {
377 // disable screen options tab when displaying banner messages because it gets in the way of the banner.
378 add_filter( 'screen_options_show_screen', '__return_false' );
379 }
380 }
381
382 /**
383 * @return array
384 */
385 private static function get_banner_messages() {
386 $inbox = new self();
387 return array_filter(
388 $inbox->get_messages( 'filter' ),
389 function( $message ) {
390 return ! empty( $message['banner'] );
391 }
392 );
393 }
394 }
395