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

383 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 * @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 return in_array( $this->get_user_type(), $who, true );
214 }
215
216 private function get_user_type() {
217 if ( ! FrmAppHelper::pro_is_installed() ) {
218 return 'free';
219 }
220
221 return FrmAddonsController::license_type();
222 }
223
224 /**
225 * @param string $key
226 *
227 * @return void
228 */
229 public function mark_read( $key ) {
230 if ( ! $key || ! isset( self::$messages[ $key ] ) ) {
231 return;
232 }
233
234 if ( ! isset( self::$messages[ $key ]['read'] ) ) {
235 self::$messages[ $key ]['read'] = array();
236 }
237 self::$messages[ $key ]['read'][ get_current_user_id() ] = time();
238
239 $this->update_list();
240 }
241
242 /**
243 * @param string $key
244 *
245 * @since 4.05.02
246 *
247 * @return void
248 */
249 public function mark_unread( $key ) {
250 $is_read = isset( self::$messages[ $key ] ) && isset( self::$messages[ $key ]['read'] ) && isset( self::$messages[ $key ]['read'][ get_current_user_id() ] );
251 if ( $is_read ) {
252 unset( self::$messages[ $key ]['read'][ get_current_user_id() ] );
253 $this->update_list();
254 }
255 }
256
257 /**
258 * @param string $key
259 *
260 * @return void
261 */
262 public function dismiss( $key ) {
263 if ( $key === 'all' ) {
264 $this->dismiss_all();
265 return;
266 }
267
268 if ( ! isset( self::$messages[ $key ] ) ) {
269 return;
270 }
271
272 if ( ! isset( self::$messages[ $key ]['dismissed'] ) ) {
273 self::$messages[ $key ]['dismissed'] = array();
274 }
275 self::$messages[ $key ]['dismissed'][ get_current_user_id() ] = time();
276
277 $this->update_list();
278 }
279
280 /**
281 * @since 4.06
282 *
283 * @return void
284 */
285 private function dismiss_all() {
286 $user_id = get_current_user_id();
287 foreach ( self::$messages as $key => $message ) {
288 if ( ! isset( $message['dismissed'] ) ) {
289 self::$messages[ $key ]['dismissed'] = array();
290 }
291
292 if ( ! isset( $message['dismissed'][ $user_id ] ) ) {
293 self::$messages[ $key ]['dismissed'][ $user_id ] = time();
294 }
295 }
296 $this->update_list();
297 }
298
299 public function unread() {
300 $messages = $this->get_messages( 'filter' );
301 $user_id = get_current_user_id();
302 foreach ( $messages as $t => $message ) {
303 if ( isset( $message['read'] ) && isset( $message['read'][ $user_id ] ) ) {
304 unset( $messages[ $t ] );
305 }
306 }
307 return $messages;
308 }
309
310 public function unread_html() {
311 $html = '';
312 $count = count( $this->unread() );
313 if ( $count ) {
314 $html = ' <span class="update-plugins frm_inbox_count"><span class="plugin-count">' . absint( $count ) . '</span></span>';
315
316 /**
317 * @since 4.06.01
318 */
319 $html = apply_filters( 'frm_inbox_badge', $html );
320 }
321 return $html;
322 }
323
324 /**
325 * @since 4.05.02
326 *
327 * @param string $key
328 *
329 * @return void
330 */
331 public function remove( $key ) {
332 if ( isset( self::$messages[ $key ] ) ) {
333 unset( self::$messages[ $key ] );
334 $this->update_list();
335 }
336 }
337
338 /**
339 * @return void
340 */
341 private function update_list() {
342 update_option( $this->option, self::$messages, 'no' );
343 }
344
345 /**
346 * Show a banner message if one is available.
347 *
348 * @return bool True if a banner is available and shown.
349 */
350 public static function maybe_show_banner() {
351 if ( empty( self::$banner_messages ) ) {
352 return false;
353 }
354 $message = end( self::$banner_messages );
355 require FrmAppHelper::plugin_path() . '/classes/views/inbox/banner.php';
356 return true;
357 }
358
359 /**
360 * @return void
361 */
362 public static function maybe_disable_screen_options() {
363 self::$banner_messages = self::get_banner_messages();
364 if ( self::$banner_messages ) {
365 // disable screen options tab when displaying banner messages because it gets in the way of the banner.
366 add_filter( 'screen_options_show_screen', '__return_false' );
367 }
368 }
369
370 /**
371 * @return array
372 */
373 private static function get_banner_messages() {
374 $inbox = new self();
375 return array_filter(
376 $inbox->get_messages( 'filter' ),
377 function( $message ) {
378 return ! empty( $message['banner'] );
379 }
380 );
381 }
382 }
383