Completed
Pull Request — master (#1125)
by Zack
18:37 queued 14:22
created

GravityView_Entry_Approval::get_entry_status()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3.0261

Importance

Changes 0
Metric Value
cc 3
nc 4
nop 2
dl 0
loc 14
ccs 6
cts 7
cp 0.8571
crap 3.0261
rs 9.7998
c 0
b 0
f 0
1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 23 and the first side effect is on line 15.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
2
/**
3
 * @file class-gravityview-entry-approval.php
4
 * @package   GravityView
5
 * @license   GPL2+
6
 * @author    Katz Web Services, Inc.
7
 * @link      https://gravityview.co
8
 * @copyright Copyright 2016, Katz Web Services, Inc.
9
 *
10
 * @since 1.18
11
 */
12
13
/** If this file is called directly, abort. */
14
if ( ! defined( 'ABSPATH' ) ) {
15
	die;
16
}
17
18
/**
19
 * Generate linked list output for a list of entries.
20
 *
21
 * @since 1.18
22
 */
23
class GravityView_Entry_Approval {
24
25
	/**
26
	 * @var string Key used to store approval status in the Gravity Forms entry meta table
27
	 */
28
	const meta_key = 'is_approved';
29
30
	public function __construct() {
31
		$this->add_hooks();
32
	}
33
34
	/**
35
	 * Add actions and filters related to entry approval
36
	 *
37
	 * @return void
38
	 */
39
	private function add_hooks() {
40
41
		// in case entry is edited (on admin or frontend)
42
		add_action( 'gform_after_update_entry', array( $this, 'after_update_entry_update_approved_meta' ), 10, 2);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
43
44
		// when using the User opt-in field, check on entry submission
45
		add_action( 'gform_after_submission', array( $this, 'after_submission' ), 10, 2 );
46
47
		// process ajax approve entry requests
48
		add_action('wp_ajax_gv_update_approved', array( $this, 'ajax_update_approved'));
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
introduced by
No space before closing parenthesis of array is bad style
Loading history...
49
50
	}
51
52
	/**
53
	 * Get the approval status for an entry
54
	 *
55
	 * @since 1.18
56
	 * @uses GVCommon::get_entry_id() Accepts entry slug or entry ID
57
	 *
58
	 * @param array|int|string $entry Entry array, entry slug, or entry ID
59
	 * @param string $value_or_label "value" or "label" (default: "label")
60
	 *
61
	 * @return bool|string Return the label or value of entry approval
62
	 */
63 1
	public static function get_entry_status( $entry, $value_or_label = 'label' ) {
64
65 1
		$entry_id = is_array( $entry ) ? $entry['id'] : GVCommon::get_entry_id( $entry, true );
66
67 1
		$status = gform_get_meta( $entry_id, self::meta_key );
68
69 1
		$status = GravityView_Entry_Approval_Status::maybe_convert_status( $status );
70
71 1
		if( 'value' === $value_or_label ) {
72 1
			return $status;
73
		}
74
75
		return GravityView_Entry_Approval_Status::get_label( $status );
76
	}
77
78
	/**
79
	 * Approve/Disapprove entries using the × or ✓ icons in the GF Entries screen
80
	 *
81
	 * @uses wp_send_json_error()
82
	 * @uses wp_send_json_success()
83
	 *
84
	 * Expects a $_POST request with the following $_POST keys and values:
85
	 *
86
	 * @global array $_POST {
87
	 * @type int $form_id ID of the form connected to the entry being updated
88
	 * @type string|int $entry_slug The ID or slug of the entry being updated
89
	 * @type string $approved The value of the entry approval status {@see GravityView_Entry_Approval_Status::is_valid() }
90
	 * }
91
	 *
92
	 * @return void Prints result using wp_send_json_success() and wp_send_json_error()
93
	 */
94
	public function ajax_update_approved() {
95
		
96
		$form_id = intval( \GV\Utils::_POST( 'form_id' ) );
97
98
		// We always want requests from the admin to allow entry IDs, but not from the frontend
99
		// There's another nonce sent when approving entries in the admin that we check
100
		$force_entry_ids = \GV\Utils::_POST( 'admin_nonce' ) && wp_verify_nonce( \GV\Utils::_POST( 'admin_nonce' ), 'gravityview_admin_entry_approval' );
101
		
102
		$entry_id = GVCommon::get_entry_id( \GV\Utils::_POST( 'entry_slug' ), $force_entry_ids );
103
104
		$approval_status = \GV\Utils::_POST( 'approved' );
105
106
		$nonce = \GV\Utils::_POST( 'nonce' );
107
108
		// Valid status
109
		if( ! GravityView_Entry_Approval_Status::is_valid( $approval_status ) ) {
110
111
			gravityview()->log->error( 'Invalid approval status', array( 'data' => $_POST ) );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
112
113
			$result = new WP_Error( 'invalid_status', __( 'The request was invalid. Refresh the page and try again.', 'gravityview' ) );
114
115
		}
116
117
		// Valid values
118
		elseif ( empty( $entry_id ) || empty( $form_id ) ) {
119
120
			gravityview()->log->error( 'entry_id or form_id are empty.', array( 'data' => $_POST ) );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
121
122
			$result = new WP_Error( 'empty_details', __( 'The request was invalid. Refresh the page and try again.', 'gravityview' ) );
123
124
		}
125
126
		// Valid nonce
127
		else if ( empty( $nonce ) || ! wp_verify_nonce( $nonce, 'gravityview_entry_approval' ) ) {
128
129
			gravityview()->log->error( 'Security check failed.', array( 'data' => $_POST ) );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
130
131
			$result = new WP_Error( 'invalid_nonce', __( 'The request was invalid. Refresh the page and try again.', 'gravityview' ) );
132
133
		}
134
135
		// Has capability
136
		elseif ( ! GVCommon::has_cap( 'gravityview_moderate_entries', $entry_id ) ) {
137
138
			gravityview()->log->error( 'User does not have the `gravityview_moderate_entries` capability.' );
139
140
			$result = new WP_Error( 'Missing Cap: gravityview_moderate_entries', __( 'You do not have permission to edit this entry.', 'gravityview') );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
141
142
		}
143
144
		// All checks passed
145
		else {
146
147
			$result = self::update_approved( $entry_id, $approval_status, $form_id );
148
149
		}
150
151
		if ( is_wp_error( $result ) ) {
152
			gravityview()->log->error( 'Error updating approval: {error}', array( 'error' =>  $result->get_error_message() ) );
0 ignored issues
show
introduced by
Expected 1 space between double arrow and "$result"; 2 found
Loading history...
introduced by
Expected 1 space after "=>"; 2 found
Loading history...
153
154
			wp_send_json_error( $result );
155
		}
156
157
		$current_status = self::get_entry_status( $entry_id, 'value' );
158
159
		wp_send_json_success( array(
160
			'status' => $current_status
0 ignored issues
show
introduced by
Each line in an array declaration must end in a comma
Loading history...
161
		) );
162
	}
163
164
	/**
165
	 * Update the is_approved meta whenever the entry is submitted (and it contains a User Opt-in field)
166
	 *
167
	 * @since 1.16.6
168
	 * @since 2.0.14 Set the default approval `is_approved` value upon submission
169
	 *
170
	 * @param $entry array Gravity Forms entry object
171
	 * @param $form array Gravity Forms form object
172
	 */
173 1
	public function after_submission( $entry, $form ) {
174
175 1
		$default_status = GravityView_Entry_Approval_Status::UNAPPROVED;
176
177
		/**
178
		 * @filter `gravityview/approve_entries/after_submission/default_status` Modify the default approval status for newly submitted entries
179
		 * @since 2.0.14
180
		 * @param int $default_status See GravityView_Entry_Approval_Status() for valid statuses.
181
		 */
182 1
		$filtered_status = apply_filters( 'gravityview/approve_entries/after_submission/default_status', $default_status );
183
184 1
		if ( GravityView_Entry_Approval_Status::is_valid( $filtered_status ) ) {
185 1
			$default_status = $filtered_status;
186
		} else {
187 1
			gravityview()->log->error( 'Invalid approval status returned by `gravityview/approve_entries/after_submission/default_status` filter: {status}', array( 'status' => $filtered_status ) );
188
		}
189
190
		// Set default
191 1
		self::update_approved_meta( $entry['id'], $default_status, $entry['form_id'] );
192
193
		// Then check for if there is an approval column, and use that value instead
194 1
		$this->after_update_entry_update_approved_meta( $form , $entry['id'] );
195 1
	}
196
197
	/**
198
	 * Update the is_approved meta whenever the entry is updated
199
	 *
200
	 * @since 1.7.6.1 Was previously named `update_approved_meta`
201
	 *
202
	 * @param  array $form     Gravity Forms form array
203
	 * @param  int $entry_id ID of the Gravity Forms entry
204
	 * @return void
205
	 */
206 3
	public function after_update_entry_update_approved_meta( $form, $entry_id = NULL ) {
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
207
208 3
		$approved_column = self::get_approved_column( $form['id'] );
209
210
		/**
211
		 * If the form doesn't contain the approve field, don't assume anything.
212
		 */
213 3
		if( empty( $approved_column ) ) {
214 3
			return;
215
		}
216
217
		$entry = GFAPI::get_entry( $entry_id );
218
219
		// If the checkbox is blank, it's disapproved, regardless of the label
220
		if ( '' === \GV\Utils::get( $entry, $approved_column ) ) {
221
			$value = GravityView_Entry_Approval_Status::DISAPPROVED;
222
		} else {
223
			// If the checkbox is not blank, it's approved
224
			$value = GravityView_Entry_Approval_Status::APPROVED;
225
		}
226
227
		self::update_approved_meta( $entry_id, $value, $form['id'] );
228
	}
229
230
	/**
231
	 * Process a bulk of entries to update the approve field/property
232
	 *
233
	 * @since 1.18 Moved to GravityView_Entry_Approval
234
	 * @since 1.18 Made public
235
	 *
236
	 * @access public
237
	 * @static
238
	 * @param array|boolean $entries If array, array of entry IDs that are to be updated. If true: update all entries.
239
	 * @param int $approved Approved status. If `0`: unapproved, if not empty, `Approved`
240
	 * @param int $form_id The Gravity Forms Form ID
241
	 * @return boolean|null True: successfully updated all entries. False: there was an error updating at least one entry. NULL: an error occurred (see log)
242
	 */
243 1
	public static function update_bulk( $entries = array(), $approved, $form_id ) {
244
245 1
		if( empty($entries) || ( $entries !== true && !is_array($entries) ) ) {
0 ignored issues
show
introduced by
Found "!== true". Use Yoda Condition checks, you must
Loading history...
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
introduced by
Expected 1 space after "!"; 0 found
Loading history...
246
			gravityview()->log->error( 'Entries were empty or malformed.', array( 'data' => $entries ) );
247
			return NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
248
		}
249
250 1
		if( ! GVCommon::has_cap( 'gravityview_moderate_entries' ) ) {
251 1
			gravityview()->log->error( 'User does not have the `gravityview_moderate_entries` capability.' );
252 1
			return NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
253
		}
254
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
255
256 1
		if ( ! GravityView_Entry_Approval_Status::is_valid( $approved ) ) {
257
			gravityview()->log->error( 'Invalid approval status', array( 'data' => $approved ) );
258
			return NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
259
		}
260
261
		// calculate approved field id once instead of looping through in the update_approved() method
262 1
		$approved_column_id = self::get_approved_column( $form_id );
263
264 1
		$success = true;
265 1
		foreach( $entries as $entry_id ) {
0 ignored issues
show
Bug introduced by
The expression $entries of type boolean|array is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
266 1
			$update_success = self::update_approved( (int)$entry_id, $approved, $form_id, $approved_column_id );
0 ignored issues
show
introduced by
No space after closing casting parenthesis is prohibited
Loading history...
267
268 1
			if( ! $update_success ) {
269 1
				$success = false;
270
			}
271
		}
272
273 1
		return $success;
274
	}
275
276
	/**
277
	 * update_approved function.
278
	 *
279
	 * @since 1.18 Moved to GravityView_Entry_Approval class
280
	 *
281
	 * @access public
282
	 * @static
283
	 * @param int $entry_id (default: 0)
284
	 * @param int $approved (default: 2)
285
	 * @param int $form_id (default: 0)
286
	 * @param int $approvedcolumn (default: 0)
287
	 *
288
	 * @return boolean True: It worked; False: it failed
289
	 */
290 1
	public static function update_approved( $entry_id = 0, $approved = 2, $form_id = 0, $approvedcolumn = 0 ) {
291
292 1
		if( !class_exists( 'GFAPI' ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
293
			gravityview()->log->error( 'GFAPI does not exist' );
294
			return false;
295
		}
296
297 1
		if( ! GravityView_Entry_Approval_Status::is_valid( $approved ) ) {
298
			gravityview()->log->error( 'Not a valid approval value.' );
299
			return false;
300
		}
301
302 1
		$approved = GravityView_Entry_Approval_Status::maybe_convert_status( $approved );
303
304 1
		$entry = GFAPI::get_entry( $entry_id );
305
306 1
		if ( is_wp_error( $entry ) ) {
307 1
			gravityview()->log->error( 'Entry does not exist' );
308 1
			return false;
309
		}
310
311
		// If the form has an Approve/Reject field, update that value
312 1
		$result = self::update_approved_column( $entry_id, $approved, $form_id, $approvedcolumn );
313
314 1
		if( is_wp_error( $result ) ) {
315
			gravityview()->log->error( 'Entry approval not updated: {error}', array( 'error' => $result->get_error_message() ) );
316
			return false;
317
		}
318
319 1
		$form_id = intval( $form_id );
320
321
		// Update the entry meta
322 1
		self::update_approved_meta( $entry_id, $approved, $form_id );
323
324
		// add note to entry if approval field updating worked or there was no approved field
325
		// There's no validation for the meta
326 1
		if( true === $result ) {
327
328
			// Add an entry note
329 1
			self::add_approval_status_updated_note( $entry_id, $approved );
330
331
			/**
332
			 * Destroy the cache for this form
333
			 * @see class-cache.php
334
			 * @since 1.5.1
335
			 */
336 1
			do_action( 'gravityview_clear_form_cache', $form_id );
337
338
		}
339
340 1
		return $result;
341
	}
342
343
	/**
344
	 * Add a note when an entry is approved
345
	 *
346
	 * @see GravityView_Entry_Approval::update_approved
347
	 *
348
	 * @since 1.18
349
	 *
350
	 * @param int $entry_id Gravity Forms entry ID
351
	 * @param int $approved Approval status
352
	 *
353
	 * @return false|int|WP_Error Note ID if successful; WP_Error if error when adding note, FALSE if note not updated because of `gravityview/approve_entries/add-note` filter or `GravityView_Entry_Notes` class not existing
354
	 */
355 1
	private static function add_approval_status_updated_note( $entry_id, $approved = 0 ) {
356 1
		$note = '';
357
358 1
		switch ( $approved ) {
359
			case GravityView_Entry_Approval_Status::APPROVED:
360 1
				$note = __( 'Approved the Entry for GravityView', 'gravityview' );
361 1
				break;
362
			case GravityView_Entry_Approval_Status::UNAPPROVED:
363
				$note = __( 'Reset Entry approval for GravityView', 'gravityview' );
364
				break;
365
			case GravityView_Entry_Approval_Status::DISAPPROVED:
366
				$note = __( 'Disapproved the Entry for GravityView', 'gravityview' );
367
				break;
368
		}
369
370
		/**
371
		 * @filter `gravityview/approve_entries/add-note` Add a note when the entry has been approved or disapproved?
372
		 * @since 1.16.3
373
		 * @param bool $add_note True: Yep, add that note! False: Do not, under any circumstances, add that note!
374
		 */
375 1
		$add_note = apply_filters( 'gravityview/approve_entries/add-note', true );
376
377 1
		$note_id = false;
378
379 1
		if( $add_note && class_exists( 'GravityView_Entry_Notes' ) ) {
380
381 1
			$current_user = wp_get_current_user();
382
383 1
			$note_id = GravityView_Entry_Notes::add_note( $entry_id, $current_user->ID, $current_user->display_name, $note );
384
		}
385
386 1
		return $note_id;
387
	}
388
389
	/**
390
	 * Update the Approve/Disapproved field value
391
	 *
392
	 * @param  int $entry_id ID of the Gravity Forms entry
393
	 * @param  string $status String whether entry is approved or not. `0` for not approved, `Approved` for approved.
394
	 * @param int $form_id ID of the form of the entry being updated. Improves query performance.
395
	 * @param string $approvedcolumn Gravity Forms Field ID
396
	 *
397
	 * @return true|WP_Error
398
	 */
399
	private static function update_approved_column( $entry_id = 0, $status = '0', $form_id = 0, $approvedcolumn = 0 ) {
400
401
		if( empty( $approvedcolumn ) ) {
402
			$approvedcolumn = self::get_approved_column( $form_id );
403
		}
404
405
		if ( empty( $approvedcolumn ) ) {
406
			return true;
407
		}
408
409
		if ( ! GravityView_Entry_Approval_Status::is_valid( $status ) ) {
410
			return new WP_Error( 'invalid_status', 'Invalid entry approval status', $status );
411
		}
412
413
		//get the entry
414
		$entry = GFAPI::get_entry( $entry_id );
415
416
		// Entry doesn't exist
417
		if ( is_wp_error( $entry ) ) {
418
			return $entry;
419
		}
420
421
		$status = GravityView_Entry_Approval_Status::maybe_convert_status( $status );
422
423
		$new_value = '';
424
		if( GravityView_Entry_Approval_Status::APPROVED === $status ) {
425
			$new_value = self::get_approved_column_input_label( $form_id, $approvedcolumn );
426
		}
427
428
		//update entry
429
		$entry["{$approvedcolumn}"] = $new_value;
0 ignored issues
show
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
430
431
		/**
432
		 * Note: GFAPI::update_entry() doesn't trigger `gform_after_update_entry`, so we trigger updating the meta ourselves
433
		 * @see GravityView_Entry_Approval::after_update_entry_update_approved_meta
434
		 * @var true|WP_Error $result
435
		 */
436
		$result = GFAPI::update_entry( $entry );
437
		
438
		return $result;
439
	}
440
441
	/**
442
	 * Get the value for the approved field checkbox
443
	 *
444
	 * When approving a field via the entry meta, use the correct value for the new approved column input
445
	 *
446
	 * @since 1.19
447
	 *
448
	 * @param array|int $form Form ID or form array
449
	 * @param string $approved_column Approved column field ID
450
	 *
451
	 * @return string|null
452
	 */
453
	private static function get_approved_column_input_label( $form, $approved_column ) {
454
455
		$field = gravityview_get_field( $form, $approved_column );
456
457
		// If the user has enabled a different value than the label (for some reason), use it.
458
		// This is highly unlikely
459
		if ( is_array( $field->choices ) && ! empty( $field->choices ) ) {
460
			return isset( $field->choices[0]['value'] ) ? $field->choices[0]['value'] : $field->choices[0]['text'];
461
		}
462
463
		// Otherwise, fall back on the inputs array
464
		if ( is_array( $field->inputs ) && ! empty( $field->inputs ) ) {
465
			return $field->inputs[0]['label'];
466
		}
467
468
		return null;
469
	}
470
471
	/**
472
	 * Update the `is_approved` entry meta value
473
	 *
474
	 * @since 1.7.6.1 `after_update_entry_update_approved_meta` was previously to be named `update_approved_meta`
475
	 * @since 1.17.1 Added $form_id parameter
476
	 *
477
	 * @param  int $entry_id ID of the Gravity Forms entry
478
	 * @param  string $status String whether entry is approved or not. `0` for not approved, `Approved` for approved.
479
	 * @param int $form_id ID of the form of the entry being updated. Improves query performance.
480
	 *
481
	 * @return void
482
	 */
483
	private static function update_approved_meta( $entry_id, $status, $form_id = 0 ) {
484
485
		if ( ! GravityView_Entry_Approval_Status::is_valid( $status ) ) {
486
			gravityview()->log->error( '$is_approved not valid value', array( 'data' => $status ) );
487
			return;
488
		}
489
490
		if ( ! function_exists( 'gform_update_meta' ) ) {
491
			gravityview()->log->error( '`gform_update_meta` does not exist.' );
492
			return;
493
		}
494
495
		$status = GravityView_Entry_Approval_Status::maybe_convert_status( $status );
496
497
		// update entry meta
498
		gform_update_meta( $entry_id, self::meta_key, $status, $form_id );
499
500
		/**
501
		 * @action `gravityview/approve_entries/updated` Triggered when an entry approval is updated
502
		 * @since 1.7.6.1
503
		 * @param  int $entry_id ID of the Gravity Forms entry
504
		 * @param  string|int $status String whether entry is approved or not. See GravityView_Entry_Approval_Status for valid statuses.
505
		 */
506
		do_action( 'gravityview/approve_entries/updated', $entry_id, $status );
507
508
		$action = GravityView_Entry_Approval_Status::get_key( $status );
509
510
		/**
511
		 * @action `gravityview/approve_entries/{$action}` Triggered when an entry approval is reset.
512
		 * $action can be 'approved', 'unapproved', or 'disapproved'
513
		 * Note: If you want this to work with Bulk Actions, run in a plugin rather than a theme; the bulk updates hook runs before themes are loaded.
514
		 * @since 1.7.6.1
515
		 * @since 1.18 Added "unapproved"
516
		 * @param  int $entry_id ID of the Gravity Forms entry
517
		 */
518
		do_action( 'gravityview/approve_entries/' . $action , $entry_id );
519
	}
520
521
	/**
522
	 * Calculate the approve field.input id
523
	 *
524
	 * @access public
525
	 * @static
526
	 * @param mixed $form GF Form or Form ID
527
	 * @return false|null|string Returns the input ID of the approved field. Returns NULL if no approved fields were found. Returns false if $form_id wasn't set.
528
	 */
529 3
	static public function get_approved_column( $form ) {
0 ignored issues
show
Coding Style introduced by
As per PSR2, the static declaration should come after the visibility declaration.
Loading history...
530
531 3
		if( empty( $form ) ) {
532
			return null;
533
		}
534
535 3
		if( !is_array( $form ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
536 3
			$form = GVCommon::get_form( $form );
537
		}
538
539 3
		$approved_column_id = null;
540
541
		/**
542
		 * @var string $key
543
		 * @var GF_Field $field
544
		 */
545 3
		foreach( $form['fields'] as $key => $field ) {
546
547 3
			$inputs = $field->get_entry_inputs();
548
549 3
			if( !empty( $field->gravityview_approved ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
550
				if ( ! empty( $inputs ) && !empty( $inputs[0]['id'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
551
					$approved_column_id = $inputs[0]['id'];
552
					break;
553
				}
554
			}
555
556
			// Note: This is just for backward compatibility from GF Directory plugin and old GV versions - when using i18n it may not work..
557 3
			if( 'checkbox' === $field->type && ! empty( $inputs ) ) {
558
				foreach ( $inputs as $input ) {
559
					if ( 'approved' === strtolower( $input['label'] ) ) {
560
						$approved_column_id = $input['id'];
561 3
						break;
562
					}
563
				}
564
			}
565
		}
566
567 3
		return $approved_column_id;
568
	}
569
570
}
571
572
new GravityView_Entry_Approval;