Completed
Push — develop ( 416d90...a150ff )
by Zack
17:37
created

modify_edit_field_input()   C

Complexity

Conditions 13
Paths 33

Size

Total Lines 56
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 182

Importance

Changes 0
Metric Value
cc 13
eloc 25
nc 33
nop 5
dl 0
loc 56
ccs 0
cts 19
cp 0
crap 182
rs 6.6843
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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 16 and the first side effect is on line 13.

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
 * GravityView Edit Entry - render frontend
4
 *
5
 * @package   GravityView
6
 * @license   GPL2+
7
 * @author    Katz Web Services, Inc.
8
 * @link      http://gravityview.co
9
 * @copyright Copyright 2014, Katz Web Services, Inc.
10
 */
11
12
if ( ! defined( 'WPINC' ) ) {
13
    die;
14
}
15
16
class GravityView_Edit_Entry_Render {
17
18
    /**
19
     * @var GravityView_Edit_Entry
20
     */
21
    protected $loader;
22
23
	/**
24
	 * @var string String used to generate unique nonce for the entry/form/view combination. Allows access to edit page.
25
	 */
26
    static $nonce_key;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $nonce_key.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

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

Loading history...
27
28
	/**
29
	 * @since 1.9
30
	 * @var string String used for check valid edit entry form submission. Allows saving edit form values.
31
	 */
32
	private static $nonce_field = 'is_gv_edit_entry';
33
34
	/**
35
	 * @since 1.9
36
	 * @var bool Whether to allow save and continue functionality
37
	 */
38
	private static $supports_save_and_continue = false;
39
40
    /**
41
     * Gravity Forms entry array
42
     *
43
     * @var array
44
     */
45
    public $entry;
46
47
	/**
48
	 * Gravity Forms entry array (it won't get changed during this class lifecycle)
49
	 * @since 1.17.2
50
	 * @var array
51
	 */
52
	private static $original_entry = array();
53
54
    /**
55
     * Gravity Forms form array (GravityView modifies the content through this class lifecycle)
56
     *
57
     * @var array
58
     */
59
	public $form;
60
61
    /**
62
     * Gravity Forms form array (it won't get changed during this class lifecycle)
63
     * @since 1.16.2.1
64
     * @var array
65
     */
66
    private static $original_form;
67
68
    /**
69
     * Gravity Forms form array after the form validation process
70
     * @since 1.13
71
     * @var array
72
     */
73
	public $form_after_validation = null;
74
75
    /**
76
     * Hold an array of GF field objects that have calculation rules
77
     * @var array
78
     */
79
	public $fields_with_calculation = array();
80
81
    /**
82
     * Gravity Forms form id
83
     *
84
     * @var int
85
     */
86
	public $form_id;
87
88
    /**
89
     * ID of the current view
90
     *
91
     * @var int
92
     */
93
	public $view_id;
94
95
    /**
96
     * Updated entry is valid (GF Validation object)
97
     *
98
     * @var array
99
     */
100
	public $is_valid = NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
101
102
    function __construct( GravityView_Edit_Entry $loader ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
103
        $this->loader = $loader;
104
    }
105
106
    function load() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
107
108
        /** @define "GRAVITYVIEW_DIR" "../../../" */
109
        include_once( GRAVITYVIEW_DIR .'includes/class-admin-approve-entries.php' );
110
111
        // Don't display an embedded form when editing an entry
112
        add_action( 'wp_head', array( $this, 'prevent_render_form' ) );
113
        add_action( 'wp_footer', array( $this, 'prevent_render_form' ) );
114
115
        // Stop Gravity Forms processing what is ours!
116
        add_filter( 'wp', array( $this, 'prevent_maybe_process_form'), 8 );
0 ignored issues
show
introduced by
No space before closing parenthesis of array is bad style
Loading history...
117
118
        add_filter( 'gravityview_is_edit_entry', array( $this, 'is_edit_entry') );
0 ignored issues
show
introduced by
No space before closing parenthesis of array is bad style
Loading history...
119
120
        add_action( 'gravityview_edit_entry', array( $this, 'init' ) );
121
122
        // Disable conditional logic if needed (since 1.9)
123
        add_filter( 'gform_has_conditional_logic', array( $this, 'manage_conditional_logic' ), 10, 2 );
124
125
        // Make sure GF doesn't validate max files (since 1.9)
126
        add_filter( 'gform_plupload_settings', array( $this, 'modify_fileupload_settings' ), 10, 3 );
127
128
        // Add fields expected by GFFormDisplay::validate()
129
        add_filter( 'gform_pre_validation', array( $this, 'gform_pre_validation') );
0 ignored issues
show
introduced by
No space before closing parenthesis of array is bad style
Loading history...
130
131
    }
132
133
    /**
134
     * Don't show any forms embedded on a page when GravityView is in Edit Entry mode
135
     *
136
     * Adds a `__return_empty_string` filter on the Gravity Forms shortcode on the `wp_head` action
137
     * And then removes it on the `wp_footer` action
138
     *
139
     * @since 1.16.1
140
     *
141
     * @return void
142
     */
143
    public function prevent_render_form() {
144
        if( $this->is_edit_entry() ) {
145
            if( 'wp_head' === current_filter() ) {
146
                add_filter( 'gform_shortcode_form', '__return_empty_string' );
147
            } else {
148
                remove_filter( 'gform_shortcode_form', '__return_empty_string' );
149
            }
150 1
        }
151 1
    }
152 1
153 1
    /**
154 1
     * Because we're mimicking being a front-end Gravity Forms form while using a Gravity Forms
155 1
     * backend form, we need to prevent them from saving twice.
156
     * @return void
157 1
     */
158 1
    public function prevent_maybe_process_form() {
159
160
        do_action('gravityview_log_debug', 'GravityView_Edit_Entry[prevent_maybe_process_form] $_POSTed data (sanitized): ', esc_html( print_r( $_POST, true ) ) );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
introduced by
The use of function print_r() is discouraged
Loading history...
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
161
162
        if( $this->is_edit_entry_submission() && $this->verify_nonce() ) {
163
            remove_action( 'wp',  array( 'RGForms', 'maybe_process_form'), 9 );
0 ignored issues
show
introduced by
No space before closing parenthesis of array is bad style
Loading history...
164
        }
165
    }
166
167
    /**
168
     * Is the current page an Edit Entry page?
169
     * @return boolean
170
     */
171
    public function is_edit_entry() {
172
173
        $is_edit_entry = GravityView_frontend::is_single_entry() && ! empty( $_GET['edit'] );
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
174
175
        return ( $is_edit_entry || $this->is_edit_entry_submission() );
176
    }
177
178 1
	/**
179
	 * Is the current page an Edit Entry page?
180 1
	 * @since 1.9
181
	 * @return boolean
182 1
	 */
183
	public function is_edit_entry_submission() {
184
		return !empty( $_POST[ self::$nonce_field ] );
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
185
	}
186
187
    /**
188
     * When Edit entry view is requested setup the vars
189
     */
190
    private function setup_vars() {
191
        $gravityview_view = GravityView_View::getInstance();
192
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
193
194
        $entries = $gravityview_view->getEntries();
195
	    self::$original_entry = $entries[0];
196
	    $this->entry = $entries[0];
197
198
        self::$original_form = $gravityview_view->getForm();
199
        $this->form = $gravityview_view->getForm();
200
        $this->form_id = $gravityview_view->getFormId();
201
        $this->view_id = $gravityview_view->getViewId();
202
203
        self::$nonce_key = GravityView_Edit_Entry::get_nonce_key( $this->view_id, $this->form_id, $this->entry['id'] );
204
    }
205
206
207
    /**
208
     * Load required files and trigger edit flow
209
     *
210
     * Run when the is_edit_entry returns true.
211
     *
212
     * @param GravityView_View_Data $gv_data GravityView Data object
213
     * @return void
214
     */
215
    public function init( $gv_data ) {
216
217
        require_once( GFCommon::get_base_path() . '/form_display.php' );
218
        require_once( GFCommon::get_base_path() . '/entry_detail.php' );
219
220
        $this->setup_vars();
221
222 1
        // Multiple Views embedded, don't proceed if nonce fails
223
        if( $gv_data->has_multiple_views() && ! wp_verify_nonce( $_GET['edit'], self::$nonce_key ) ) {
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-validated input variable: $_GET
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
224 1
            do_action('gravityview_log_error', __METHOD__ . ': Nonce validation failed for the Edit Entry request; returning' );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
225 1
            return;
226
        }
227 1
228
        // Sorry, you're not allowed here.
229
        if( false === $this->user_can_edit_entry( true ) ) {
230 1
            do_action('gravityview_log_error', __METHOD__ . ': User is not allowed to edit this entry; returning', $this->entry );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
231
            return;
232
        }
233
234
        $this->print_scripts();
235
236 1
        $this->process_save();
237 1
238 1
        $this->edit_entry_form();
239
240
    }
241 1
242
243 1
    /**
244
     * Force Gravity Forms to output scripts as if it were in the admin
245 1
     * @return void
246
     */
247 1
    private function print_scripts() {
248
        $gravityview_view = GravityView_View::getInstance();
249
250
        wp_register_script( 'gform_gravityforms', GFCommon::get_base_url().'/js/gravityforms.js', array( 'jquery', 'gform_json', 'gform_placeholder', 'sack', 'plupload-all', 'gravityview-fe-view' ) );
251
252
        GFFormDisplay::enqueue_form_scripts($gravityview_view->getForm(), false);
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...
253
254
        // Sack is required for images
255
        wp_print_scripts( array( 'sack', 'gform_gravityforms' ) );
256
    }
257
258
259
    /**
260
     * Process edit entry form save
261
     */
262
    private function process_save() {
263
264
        if( empty( $_POST ) || ! isset( $_POST['lid'] ) ) {
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
265
            return;
266
        }
267
268
        // Make sure the entry, view, and form IDs are all correct
269 1
        $valid = $this->verify_nonce();
270
271 1
        if( !$valid ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
272 1
            do_action('gravityview_log_error', __METHOD__ . ' Nonce validation failed.' );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
273
            return;
274
        }
275
276 1
        if( $this->entry['id'] !== $_POST['lid'] ) {
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_POST
Loading history...
277
            do_action('gravityview_log_error', __METHOD__ . ' Entry ID did not match posted entry ID.' );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
278 1
            return;
279
        }
280
281
        do_action('gravityview_log_debug', __METHOD__ . ': $_POSTed data (sanitized): ', esc_html( print_r( $_POST, true ) ) );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
introduced by
The use of function print_r() is discouraged
Loading history...
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
282
283 1
        $this->process_save_process_files( $this->form_id );
284
285
        $this->validate();
286
287
        if( $this->is_valid ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->is_valid of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
288 1
289
            do_action('gravityview_log_debug', __METHOD__ . ': Submission is valid.' );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
290 1
291
            /**
292 1
             * @hack This step is needed to unset the adminOnly from form fields, to add the calculation fields
293
             */
294 1
            $form = $this->form_prepare_for_save();
295
296 1
            /**
297
             * @hack to avoid the capability validation of the method save_lead for GF 1.9+
298
             */
299
            unset( $_GET['page'] );
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
300
301 1
            $date_created = $this->entry['date_created'];
302
303
            /**
304
             * @hack to force Gravity Forms to use $read_value_from_post in GFFormsModel::save_lead()
305
             * @since 1.17.2
306 1
             */
307
            unset( $this->entry['date_created'] );
308 1
309
            GFFormsModel::save_lead( $form, $this->entry );
310
311
	        // Delete the values for hidden inputs
312
	        $this->unset_hidden_field_values();
313
            
314 1
            $this->entry['date_created'] = $date_created;
315
316 1
            // Process calculation fields
317
            $this->update_calculation_fields();
318
319 1
            // Perform actions normally performed after updating a lead
320
            $this->after_update();
321 1
322
	        /**
323
             * Must be AFTER after_update()!
324 1
             * @see https://github.com/gravityview/GravityView/issues/764
325
             */
326
            $this->maybe_update_post_fields( $form );
327 1
328
            /**
329
             * @action `gravityview/edit_entry/after_update` Perform an action after the entry has been updated using Edit Entry
330
             * @param array $form Gravity Forms form array
331
             * @param string $entry_id Numeric ID of the entry that was updated
332
             * @param GravityView_Edit_Entry_Render $this This object
333 1
             */
334
            do_action( 'gravityview/edit_entry/after_update', $this->form, $this->entry['id'], $this );
335
336
        } else {
337
            do_action('gravityview_log_error', __METHOD__ . ': Submission is NOT valid.', $this->entry );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
338
        }
339
340
    } // process_save
341 1
342
	/**
343 1
	 * Delete the value of fields hidden by conditional logic when the entry is edited
344
     *
345
     * @uses GFFormsModel::update_lead_field_value()
346
     *
347 1
     * @since 1.17.4
348
     *
349
     * @return void
350
	 */
351
    private function unset_hidden_field_values() {
352
	    global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
353
354
	    $lead_detail_table      = GFFormsModel::get_lead_details_table_name();
355
	    $current_fields   = $wpdb->get_results( $wpdb->prepare( "SELECT id, field_number FROM $lead_detail_table WHERE lead_id=%d", $this->entry['id'] ) );
0 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
introduced by
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
356
357
	    foreach ( $this->entry as $input_id => $field_value ) {
358
359
		    $field = RGFormsModel::get_field( $this->form, $input_id );
360
361
		    // Reset fields that are hidden
362
		    // Don't pass $entry as fourth parameter; force using $_POST values to calculate conditional logic
363
		    if ( GFFormsModel::is_field_hidden( $this->form, $field, array(), NULL ) ) {
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
364
365
		        // List fields are stored as empty arrays when empty
366
			    $empty_value = $this->is_field_json_encoded( $field ) ? '[]' : '';
367
368
			    $lead_detail_id = GFFormsModel::get_lead_detail_id( $current_fields, $input_id );
369
370
			    GFFormsModel::update_lead_field_value( $this->form, $this->entry, $field, $lead_detail_id, $input_id, $empty_value );
371
372
			    // Prevent the $_POST values of hidden fields from being used as default values when rendering the form
373
                // after submission
374
			    $post_input_id = 'input_' . str_replace( '.', '_', $input_id );
375
			    $_POST[ $post_input_id ] = '';
376
		    }
377
	    }
378
    }
379
380
    /**
381
     * Have GF handle file uploads
382
     *
383
     * Copy of code from GFFormDisplay::process_form()
384
     *
385
     * @param int $form_id
386
     */
387
    private function process_save_process_files( $form_id ) {
388
389
        //Loading files that have been uploaded to temp folder
390
        $files = GFCommon::json_decode( stripslashes( RGForms::post( 'gform_uploaded_files' ) ) );
391
        if ( ! is_array( $files ) ) {
392
            $files = array();
393
        }
394
395
        RGFormsModel::$uploaded_files[ $form_id ] = $files;
396
    }
397
398
    /**
399
     * Remove max_files validation (done on gravityforms.js) to avoid conflicts with GravityView
400
     * Late validation done on self::custom_validation
401
     *
402
     * @param $plupload_init array Plupload settings
403
     * @param $form_id
404
     * @param $instance
405
     * @return mixed
406
     */
407
    public function modify_fileupload_settings( $plupload_init, $form_id, $instance ) {
0 ignored issues
show
Unused Code introduced by
The parameter $form_id is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $instance is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
408
        if( ! $this->is_edit_entry() ) {
409
            return $plupload_init;
410
        }
411
412
        $plupload_init['gf_vars']['max_files'] = 0;
413
414
        return $plupload_init;
415
    }
416
417
418
    /**
419
     * Unset adminOnly and convert field input key to string
420
     * @return array $form
421
     */
422
    private function form_prepare_for_save() {
423
424
        $form = $this->form;
425
426
	    /** @var GF_Field $field */
427
        foreach( $form['fields'] as $k => &$field ) {
428
429
            /**
430
             * Remove the fields with calculation formulas before save to avoid conflicts with GF logic
431
             * @since 1.16.3
432
             * @var GF_Field $field
433
             */
434
            if( $field->has_calculation() ) {
435
                unset( $form['fields'][ $k ] );
436
            }
437
438
            $field->adminOnly = false;
439
440
            if( isset( $field->inputs ) && is_array( $field->inputs ) ) {
441
                foreach( $field->inputs as $key => $input ) {
442
                    $field->inputs[ $key ][ 'id' ] = (string)$input['id'];
0 ignored issues
show
introduced by
Array keys should NOT be surrounded by spaces if they only contain a string or an integer.
Loading history...
introduced by
No space after closing casting parenthesis is prohibited
Loading history...
443
                }
444
            }
445
        }
446
447
        return $form;
448
    }
449
450
    private function update_calculation_fields() {
451
452
        $form = self::$original_form;
453
        $update = false;
454
455
        // get the most up to date entry values
456
        $entry = GFAPI::get_entry( $this->entry['id'] );
457
458
        if( !empty( $this->fields_with_calculation ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
459
            $update = true;
460
            foreach ( $this->fields_with_calculation as $calc_field ) {
461
                $inputs = $calc_field->get_entry_inputs();
462
                if ( is_array( $inputs ) ) {
463
                    foreach ( $inputs as $input ) {
464
                        $input_name = 'input_' . str_replace( '.', '_', $input['id'] );
465
                        $entry[ strval( $input['id'] ) ] = RGFormsModel::prepare_value( $form, $calc_field, '', $input_name, $entry['id'], $entry );
466
                    }
467
                } else {
468
                    $input_name = 'input_' . str_replace( '.', '_', $calc_field->id);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
469
                    $entry[ strval( $calc_field->id ) ] = RGFormsModel::prepare_value( $form, $calc_field, '', $input_name, $entry['id'], $entry );
470
                }
471
            }
472
473
        }
474
475
        if( $update ) {
476
477
            $return_entry = GFAPI::update_entry( $entry );
478
479
            if( is_wp_error( $return_entry ) ) {
480
                do_action( 'gravityview_log_error', 'Updating the entry calculation fields failed', $return_entry );
481
            } else {
482
                do_action( 'gravityview_log_debug', 'Updating the entry calculation fields succeeded' );
483
            }
484
        }
485
    }
486
487
    /**
488
     * Handle updating the Post Image field
489
     *
490
     * Sets a new Featured Image if configured in Gravity Forms; otherwise uploads/updates media
491
     *
492
     * @since 1.17
493
     *
494
     * @uses GFFormsModel::media_handle_upload
495
     * @uses set_post_thumbnail
496
     * 
497
     * @param array $form GF Form array
498
     * @param GF_Field $field GF Field
499
     * @param string $field_id Numeric ID of the field
500
     * @param string $value
501
     * @param array $entry GF Entry currently being edited
502
     * @param int $post_id ID of the Post being edited
503
     *
504
     * @return mixed|string
505
     */
506
    private function update_post_image( $form, $field, $field_id, $value, $entry, $post_id ) {
507
508
        $input_name = 'input_' . $field_id;
509
510
        if ( !empty( $_FILES[ $input_name ]['name'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
511
512
            // We have a new image
513
514
            $value = RGFormsModel::prepare_value( $form, $field, $value, $input_name, $entry['id'] );
515
516
            $ary = ! empty( $value ) ? explode( '|:|', $value ) : array();
517
            $img_url = rgar( $ary, 0 );
518
519
            $img_title       = count( $ary ) > 1 ? $ary[1] : '';
520
            $img_caption     = count( $ary ) > 2 ? $ary[2] : '';
521
            $img_description = count( $ary ) > 3 ? $ary[3] : '';
522
523
            $image_meta = array(
524
                'post_excerpt' => $img_caption,
525
                'post_content' => $img_description,
526
            );
527
528
            //adding title only if it is not empty. It will default to the file name if it is not in the array
529
            if ( ! empty( $img_title ) ) {
530
                $image_meta['post_title'] = $img_title;
531
            }
532
533
            /**
534
             * todo: As soon as \GFFormsModel::media_handle_upload becomes a public method, move this call to \GFFormsModel::media_handle_upload and remove the hack from this class.
535
             * Note: the method became public in GF 1.9.17.7, but we don't require that version yet.
536
             */
537
            require_once GRAVITYVIEW_DIR . 'includes/class-gravityview-gfformsmodel.php';
538
            $media_id = GravityView_GFFormsModel::media_handle_upload( $img_url, $post_id, $image_meta );
539
540
            // is this field set as featured image?
541
            if ( $media_id && $field->postFeaturedImage ) {
542
                set_post_thumbnail( $post_id, $media_id );
543
            }
544
545
        } elseif ( !empty( $_POST[ $input_name ] ) && is_array( $value ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
546
547
            // Same image although the image title, caption or description might have changed
548
549
            $ary = array();
550
            if( ! empty( $entry[ $field_id ] ) ) {
551
                $ary = is_array( $entry[ $field_id ] ) ? $entry[ $field_id ] : explode( '|:|', $entry[ $field_id ] );
552
            }
553
            $img_url = rgar( $ary, 0 );
554
555
            // is this really the same image or something went wrong ?
556
            if( $img_url === $_POST[ $input_name ] ) {
557
558
                $img_title       = rgar( $value, $field_id .'.1' );
559
                $img_caption     = rgar( $value, $field_id .'.4' );
560
                $img_description = rgar( $value, $field_id .'.7' );
561
562
                $value = ! empty( $img_url ) ? $img_url . "|:|" . $img_title . "|:|" . $img_caption . "|:|" . $img_description : '';
0 ignored issues
show
Coding Style Comprehensibility introduced by
The string literal |:| does not require double quotes, as per coding-style, please use single quotes.

PHP provides two ways to mark string literals. Either with single quotes 'literal' or with double quotes "literal". The difference between these is that string literals in double quotes may contain variables with are evaluated at run-time as well as escape sequences.

String literals in single quotes on the other hand are evaluated very literally and the only two characters that needs escaping in the literal are the single quote itself (\') and the backslash (\\). Every other character is displayed as is.

Double quoted string literals may contain other variables or more complex escape sequences.

<?php

$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";

print $doubleQuoted;

will print an indented: Single is Value

If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear.

For more information on PHP string literals and available escape sequences see the PHP core documentation.

Loading history...
563
564
                if ( $field->postFeaturedImage ) {
565
566
                    $image_meta = array(
567
                        'ID' => get_post_thumbnail_id( $post_id ),
568
                        'post_title' => $img_title,
569
                        'post_excerpt' => $img_caption,
570
                        'post_content' => $img_description,
571
                    );
572
573
                    // update image title, caption or description
574
                    wp_update_post( $image_meta );
575
                }
576
            }
577
578
        } else {
579
580
            // if we get here, image was removed or not set.
581
            $value = '';
582
583
            if ( $field->postFeaturedImage ) {
584
                delete_post_thumbnail( $post_id );
585
            }
586
        }
587
588
        return $value;
589
    }
590
591
    /**
592
     * Loop through the fields being edited and if they include Post fields, update the Entry's post object
593
     *
594
     * @param array $form Gravity Forms form
595
     *
596
     * @return void
597
     */
598
    private function maybe_update_post_fields( $form ) {
599
600
        if( empty( $this->entry['post_id'] ) ) {
601
	        do_action( 'gravityview_log_debug', __METHOD__ . ': This entry has no post fields. Continuing...' );
602
            return;
603
        }
604
605
        $post_id = $this->entry['post_id'];
606
607
        // Security check
608
        if( false === GVCommon::has_cap( 'edit_post', $post_id ) ) {
609
            do_action( 'gravityview_log_error', 'The current user does not have the ability to edit Post #'.$post_id );
610
            return;
611
        }
612
613
        $update_entry = false;
614
615
        $updated_post = $original_post = get_post( $post_id );
616
617
        foreach ( $this->entry as $field_id => $value ) {
618
619
            $field = RGFormsModel::get_field( $form, $field_id );
620
621
            if( ! $field ) {
622
                continue;
623
            }
624
625
            if( GFCommon::is_post_field( $field ) && 'post_category' !== $field->type ) {
626
627
                // Get the value of the field, including $_POSTed value
628
                $value = RGFormsModel::get_field_value( $field );
629
630
                // Use temporary entry variable, to make values available to fill_post_template() and update_post_image()
631
                $entry_tmp = $this->entry;
632
                $entry_tmp["{$field_id}"] = $value;
0 ignored issues
show
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
633
634
                switch( $field->type ) {
635
636
                    case 'post_title':
637
                        $post_title = $value;
638
                        if( rgar( $form, 'postTitleTemplateEnabled' ) ) {
639
                            $post_title = $this->fill_post_template( $form['postTitleTemplate'], $form, $entry_tmp );
640
                        }
641
                        $updated_post->post_title = $post_title;
642
                        $updated_post->post_name  = $post_title;
643
                        unset( $post_title );
644
                        break;
645
646
                    case 'post_content':
647
                        $post_content = $value;
648
                        if( rgar( $form, 'postContentTemplateEnabled' ) ) {
649
                            $post_content = $this->fill_post_template( $form['postContentTemplate'], $form, $entry_tmp, true );
650
                        }
651
                        $updated_post->post_content = $post_content;
652
                        unset( $post_content );
653
                        break;
654
                    case 'post_excerpt':
655
                        $updated_post->post_excerpt = $value;
656
                        break;
657
                    case 'post_tags':
658
                        wp_set_post_tags( $post_id, $value, false );
659
                        break;
660
                    case 'post_category':
661
                        break;
662
                    case 'post_custom_field':
663
                        if( ! empty( $field->customFieldTemplateEnabled ) ) {
664
                            $value = $this->fill_post_template( $field->customFieldTemplate, $form, $entry_tmp, true );
665
                        }
666
667
	                    if ( $this->is_field_json_encoded( $field ) && ! is_string( $value ) ) {
668
		                    $value = function_exists('wp_json_encode') ? wp_json_encode( $value ) : json_encode( $value );
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...
669
	                    }
670
671
                        update_post_meta( $post_id, $field->postCustomFieldName, $value );
672
                        break;
673
674
                    case 'post_image':
675
                        $value = $this->update_post_image( $form, $field, $field_id, $value, $this->entry, $post_id );
676
                        break;
677
678
                }
679
680
                // update entry after
681
                $this->entry["{$field_id}"] = $value;
0 ignored issues
show
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
682
683
                $update_entry = true;
684
685
                unset( $entry_tmp );
686
            }
687
688
        }
689
690
        if( $update_entry ) {
691
692
            $return_entry = GFAPI::update_entry( $this->entry );
693
694
            if( is_wp_error( $return_entry ) ) {
695
               do_action( 'gravityview_log_error', 'Updating the entry post fields failed', array( '$this->entry' => $this->entry, '$return_entry' => $return_entry ) );
696
            } else {
697
                do_action( 'gravityview_log_debug', 'Updating the entry post fields for post #'.$post_id.' succeeded' );
698
            }
699
700
        }
701
702
        $return_post = wp_update_post( $updated_post, true );
703
704
        if( is_wp_error( $return_post ) ) {
705
            $return_post->add_data( $updated_post, '$updated_post' );
706
            do_action( 'gravityview_log_error', 'Updating the post content failed', compact( 'updated_post', 'return_post' ) );
707
        } else {
708
            do_action( 'gravityview_log_debug', 'Updating the post content for post #'.$post_id.' succeeded', $updated_post );
709
        }
710
    }
711
712
	/**
713
     * Is the field stored in a JSON-encoded manner?
714
     *
715
	 * @param GF_Field $field
716
	 *
717
	 * @return bool True: stored in DB json_encode()'d; False: not encoded
718
	 */
719
    private function is_field_json_encoded( $field ) {
720
721
	    $json_encoded = false;
722
723
        $input_type = RGFormsModel::get_input_type( $field );
724
725
	    // Only certain custom field types are supported
726
	    switch( $input_type ) {
727
		    case 'fileupload':
728
		    case 'list':
729
		    case 'multiselect':
730
			    $json_encoded = true;
731
			    break;
732
	    }
733
734
	    return $json_encoded;
735
    }
736
737
    /**
738
     * Convert a field content template into prepared output
739
     *
740
     * @uses GravityView_GFFormsModel::get_post_field_images()
741
     *
742
     * @since 1.17
743
     *
744
     * @param string $template The content template for the field
745
     * @param array $form Gravity Forms form
746
     * @param bool $do_shortcode Whether to process shortcode inside content. In GF, only run on Custom Field and Post Content fields
747
     *
748
     * @return mixed|string|void
749
     */
750
    private function fill_post_template( $template, $form, $entry, $do_shortcode = false ) {
751
752
        require_once GRAVITYVIEW_DIR . 'includes/class-gravityview-gfformsmodel.php';
753
754
        $post_images = GravityView_GFFormsModel::get_post_field_images( $form, $entry );
755
756
        //replacing post image variables
757
        $output = GFCommon::replace_variables_post_image( $template, $post_images, $entry );
758
759
        //replacing all other variables
760
        $output = GFCommon::replace_variables( $output, $form, $entry, false, false, false );
761
762
        // replace conditional shortcodes
763
        if( $do_shortcode ) {
764
            $output = do_shortcode( $output );
765
        }
766
767
        return $output;
768
    }
769
770
771
    /**
772
     * Perform actions normally performed after updating a lead
773
     *
774
     * @since 1.8
775
     *
776
     * @see GFEntryDetail::lead_detail_page()
777
     *
778
     * @return void
779
     */
780
    private function after_update() {
781
782
        do_action( 'gform_after_update_entry', $this->form, $this->entry['id'], self::$original_entry );
783
        do_action( "gform_after_update_entry_{$this->form['id']}", $this->form, $this->entry['id'], self::$original_entry );
784
785
        // Re-define the entry now that we've updated it.
786
        $entry = RGFormsModel::get_lead( $this->entry['id'] );
787
788
        $entry = GFFormsModel::set_entry_meta( $entry, $this->form );
789
790
        // We need to clear the cache because Gravity Forms caches the field values, which
791
        // we have just updated.
792
        foreach ($this->form['fields'] as $key => $field) {
0 ignored issues
show
introduced by
No space after opening parenthesis is prohibited
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
793
            GFFormsModel::refresh_lead_field_value( $entry['id'], $field->id );
794
        }
795
796
        $this->entry = $entry;
797
    }
798
799
800
    /**
801
     * Display the Edit Entry form
802
     *
803
     * @return void
804
     */
805
    public function edit_entry_form() {
806
807
        ?>
808
809
        <div class="gv-edit-entry-wrapper"><?php
810
811
            $javascript = gravityview_ob_include( GravityView_Edit_Entry::$file .'/partials/inline-javascript.php', $this );
0 ignored issues
show
Bug introduced by
The property file cannot be accessed from this context as it is declared private in class GravityView_Edit_Entry.

This check looks for access to properties that are not accessible from the current context.

If you need to make a property accessible to another context you can either raise its visibility level or provide an accessible getter in the defining class.

Loading history...
812
813
            /**
814
             * Fixes weird wpautop() issue
815
             * @see https://github.com/katzwebservices/GravityView/issues/451
816
             */
817
            echo gravityview_strip_whitespace( $javascript );
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'gravityview_strip_whitespace'
Loading history...
818
819
            ?><h2 class="gv-edit-entry-title">
820
                <span><?php
821
822
                    /**
823
                     * @filter `gravityview_edit_entry_title` Modify the edit entry title
824
                     * @param string $edit_entry_title Modify the "Edit Entry" title
825
                     * @param GravityView_Edit_Entry_Render $this This object
826
                     */
827
                    $edit_entry_title = apply_filters('gravityview_edit_entry_title', __('Edit Entry', 'gravityview'), $this );
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...
828
829
                    echo esc_attr( $edit_entry_title );
830
            ?></span>
831
            </h2>
832
833
            <?php $this->maybe_print_message(); ?>
834
835
            <?php // The ID of the form needs to be `gform_{form_id}` for the pluploader ?>
836
837
            <form method="post" id="gform_<?php echo $this->form_id; ?>" enctype="multipart/form-data">
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$this'
Loading history...
838
839
                <?php
840
841
                wp_nonce_field( self::$nonce_key, self::$nonce_key );
842
843
                wp_nonce_field( self::$nonce_field, self::$nonce_field, false );
844
845
                // Print the actual form HTML
846
                $this->render_edit_form();
847
848
                ?>
849
            </form>
850
851
            <script>
852
                gform.addFilter('gform_reset_pre_conditional_logic_field_action', function ( reset, formId, targetId, defaultValues, isInit ) {
853
                    return false;
854
                });
855
            </script>
856
857
        </div>
858
859
    <?php
860
    }
861
862
    /**
863
     * Display success or error message if the form has been submitted
864
     *
865
     * @uses GVCommon::generate_notice
866
     *
867
     * @since 1.16.2.2
868
     *
869
     * @return void
870
     */
871
    private function maybe_print_message() {
872
873
        if( rgpost('action') === 'update' ) {
0 ignored issues
show
introduced by
Found "=== '". 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...
874
875
            $back_link = esc_url( remove_query_arg( array( 'page', 'view', 'edit' ) ) );
876
877
            if( ! $this->is_valid ){
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->is_valid of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
878
879
                // Keeping this compatible with Gravity Forms.
880
                $validation_message = "<div class='validation_error'>" . __('There was a problem with your submission.', 'gravityview') . " " . __('Errors have been highlighted below.', 'gravityview') . "</div>";
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...
Coding Style Comprehensibility introduced by
The string literal does not require double quotes, as per coding-style, please use single quotes.

PHP provides two ways to mark string literals. Either with single quotes 'literal' or with double quotes "literal". The difference between these is that string literals in double quotes may contain variables with are evaluated at run-time as well as escape sequences.

String literals in single quotes on the other hand are evaluated very literally and the only two characters that needs escaping in the literal are the single quote itself (\') and the backslash (\\). Every other character is displayed as is.

Double quoted string literals may contain other variables or more complex escape sequences.

<?php

$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";

print $doubleQuoted;

will print an indented: Single is Value

If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear.

For more information on PHP string literals and available escape sequences see the PHP core documentation.

Loading history...
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw '__'
Loading history...
Coding Style Comprehensibility introduced by
The string literal </div> does not require double quotes, as per coding-style, please use single quotes.

PHP provides two ways to mark string literals. Either with single quotes 'literal' or with double quotes "literal". The difference between these is that string literals in double quotes may contain variables with are evaluated at run-time as well as escape sequences.

String literals in single quotes on the other hand are evaluated very literally and the only two characters that needs escaping in the literal are the single quote itself (\') and the backslash (\\). Every other character is displayed as is.

Double quoted string literals may contain other variables or more complex escape sequences.

<?php

$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";

print $doubleQuoted;

will print an indented: Single is Value

If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear.

For more information on PHP string literals and available escape sequences see the PHP core documentation.

Loading history...
881
                $message = apply_filters("gform_validation_message_{$this->form['id']}", apply_filters("gform_validation_message", $validation_message, $this->form), $this->form);
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...
Coding Style Comprehensibility introduced by
The string literal gform_validation_message does not require double quotes, as per coding-style, please use single quotes.

PHP provides two ways to mark string literals. Either with single quotes 'literal' or with double quotes "literal". The difference between these is that string literals in double quotes may contain variables with are evaluated at run-time as well as escape sequences.

String literals in single quotes on the other hand are evaluated very literally and the only two characters that needs escaping in the literal are the single quote itself (\') and the backslash (\\). Every other character is displayed as is.

Double quoted string literals may contain other variables or more complex escape sequences.

<?php

$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";

print $doubleQuoted;

will print an indented: Single is Value

If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear.

For more information on PHP string literals and available escape sequences see the PHP core documentation.

Loading history...
882
883
                echo GVCommon::generate_notice( $message , 'gv-error' );
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'GVCommon'
Loading history...
884
885
            } else {
886
                $entry_updated_message = sprintf( esc_attr__('Entry Updated. %sReturn to Entry%s', 'gravityview'), '<a href="'. $back_link .'">', '</a>' );
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...
887
888
                /**
889
                 * @filter `gravityview/edit_entry/success` Modify the edit entry success message (including the anchor link)
890
                 * @since 1.5.4
891
                 * @param string $entry_updated_message Existing message
892
                 * @param int $view_id View ID
893
                 * @param array $entry Gravity Forms entry array
894
                 * @param string $back_link URL to return to the original entry. @since 1.6
895
                 */
896
                $message = apply_filters( 'gravityview/edit_entry/success', $entry_updated_message , $this->view_id, $this->entry, $back_link );
897
898
                echo GVCommon::generate_notice( $message );
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'GVCommon'
Loading history...
899
            }
900
901
        }
902
    }
903
904
    /**
905
     * Display the Edit Entry form in the original Gravity Forms format
906
     *
907
     * @since 1.9
908
     *
909
     * @return void
910
     */
911
    private function render_edit_form() {
912
913
        /**
914
         * @action `gravityview/edit-entry/render/before` Before rendering the Edit Entry form
915
         * @since 1.17
916
         * @param GravityView_Edit_Entry_Render $this
917
         */
918
        do_action( 'gravityview/edit-entry/render/before', $this );
919
920
        add_filter( 'gform_pre_render', array( $this, 'filter_modify_form_fields'), 5000, 3 );
0 ignored issues
show
introduced by
No space before closing parenthesis of array is bad style
Loading history...
921
        add_filter( 'gform_submit_button', array( $this, 'render_form_buttons') );
0 ignored issues
show
introduced by
No space before closing parenthesis of array is bad style
Loading history...
922
        add_filter( 'gform_disable_view_counter', '__return_true' );
923
924
        add_filter( 'gform_field_input', array( $this, 'verify_user_can_edit_post' ), 5, 5 );
925
        add_filter( 'gform_field_input', array( $this, 'modify_edit_field_input' ), 10, 5 );
926
927
        // We need to remove the fake $_GET['page'] arg to avoid rendering form as if in admin.
928
        unset( $_GET['page'] );
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
929
930
        // TODO: Verify multiple-page forms
931
932
        ob_start(); // Prevent PHP warnings possibly caused by prefilling list fields for conditional logic
933
934
        $html = GFFormDisplay::get_form( $this->form['id'], false, false, true, $this->entry );
935
936
        ob_get_clean();
937
938
	    remove_filter( 'gform_pre_render', array( $this, 'filter_modify_form_fields' ), 5000 );
939
        remove_filter( 'gform_submit_button', array( $this, 'render_form_buttons' ) );
940
        remove_filter( 'gform_disable_view_counter', '__return_true' );
941
        remove_filter( 'gform_field_input', array( $this, 'verify_user_can_edit_post' ), 5 );
942
        remove_filter( 'gform_field_input', array( $this, 'modify_edit_field_input' ), 10 );
943
944
        echo $html;
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$html'
Loading history...
945
946
        /**
947
         * @action `gravityview/edit-entry/render/after` After rendering the Edit Entry form
948
         * @since 1.17
949
         * @param GravityView_Edit_Entry_Render $this
950
         */
951
        do_action( 'gravityview/edit-entry/render/after', $this );
952
    }
953
954
    /**
955
     * Display the Update/Cancel/Delete buttons for the Edit Entry form
956
     * @since 1.8
957
     * @return string
958
     */
959
    public function render_form_buttons() {
960
        return gravityview_ob_include( GravityView_Edit_Entry::$file .'/partials/form-buttons.php', $this );
0 ignored issues
show
Bug introduced by
The property file cannot be accessed from this context as it is declared private in class GravityView_Edit_Entry.

This check looks for access to properties that are not accessible from the current context.

If you need to make a property accessible to another context you can either raise its visibility level or provide an accessible getter in the defining class.

Loading history...
961
    }
962
963
964
    /**
965
     * Modify the form fields that are shown when using GFFormDisplay::get_form()
966
     *
967
     * By default, all fields will be shown. We only want the Edit Tab configured fields to be shown.
968
     *
969
     * @param array $form
970
     * @param boolean $ajax Whether in AJAX mode
971
     * @param array|string $field_values Passed parameters to the form
972
     *
973
     * @since 1.9
974
     *
975
     * @return array Modified form array
976
     */
977
    public function filter_modify_form_fields( $form, $ajax = false, $field_values = '' ) {
0 ignored issues
show
Unused Code introduced by
The parameter $ajax is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $field_values is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
978
979
        // In case we have validated the form, use it to inject the validation results into the form render
980
        if( isset( $this->form_after_validation ) ) {
981
            $form = $this->form_after_validation;
982
        } else {
983
            $form['fields'] = $this->get_configured_edit_fields( $form, $this->view_id );
984
        }
985
986
        $form = $this->filter_conditional_logic( $form );
987
988
        $form = $this->prefill_conditional_logic( $form );
989
990
        // for now we don't support Save and Continue feature.
991
        if( ! self::$supports_save_and_continue ) {
992
	        unset( $form['save'] );
993
        }
994
995
        return $form;
996
    }
997
998
    /**
999
     * When displaying a field, check if it's a Post Field, and if so, make sure the post exists and current user has edit rights.
1000
     *
1001
     * @since 1.16.2.2
1002
     *
1003
     * @param string $field_content Always empty. Returning not-empty overrides the input.
1004
     * @param GF_Field $field
1005
     * @param string|array $value If array, it's a field with multiple inputs. If string, single input.
1006
     * @param int $lead_id Lead ID. Always 0 for the `gform_field_input` filter.
1007
     * @param int $form_id Form ID
1008
     *
1009
     * @return string If error, the error message. If no error, blank string (modify_edit_field_input() runs next)
1010
     */
1011
    public function verify_user_can_edit_post( $field_content = '', $field, $value, $lead_id = 0, $form_id ) {
0 ignored issues
show
Unused Code introduced by
The parameter $value is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $lead_id is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $form_id is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1012
1013
        if( GFCommon::is_post_field( $field ) ) {
1014
1015
            $message = null;
1016
1017
            // First, make sure they have the capability to edit the post.
1018
            if( false === current_user_can( 'edit_post', $this->entry['post_id'] ) ) {
1019
1020
                /**
1021
                 * @filter `gravityview/edit_entry/unsupported_post_field_text` Modify the message when someone isn't able to edit a post
1022
                 * @param string $message The existing "You don't have permission..." text
1023
                 */
1024
                $message = apply_filters('gravityview/edit_entry/unsupported_post_field_text', __('You don&rsquo;t have permission to edit this post.', 'gravityview') );
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...
1025
1026
            } elseif( null === get_post( $this->entry['post_id'] ) ) {
1027
                /**
1028
                 * @filter `gravityview/edit_entry/no_post_text` Modify the message when someone is editing an entry attached to a post that no longer exists
1029
                 * @param string $message The existing "This field is not editable; the post no longer exists." text
1030
                 */
1031
                $message = apply_filters('gravityview/edit_entry/no_post_text', __('This field is not editable; the post no longer exists.', 'gravityview' ) );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
1032
            }
1033
1034
            if( $message ) {
1035
                $field_content = sprintf('<div class="ginput_container ginput_container_' . $field->type . '">%s</div>', wpautop( $message ) );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
1036
            }
1037
        }
1038
1039
        return $field_content;
1040
    }
1041
1042
    /**
1043
     *
1044
     * Fill-in the saved values into the form inputs
1045
     *
1046
     * @param string $field_content Always empty. Returning not-empty overrides the input.
1047
     * @param GF_Field $field
1048
     * @param string|array $value If array, it's a field with multiple inputs. If string, single input.
1049
     * @param int $lead_id Lead ID. Always 0 for the `gform_field_input` filter.
1050
     * @param int $form_id Form ID
1051
     *
1052
     * @return mixed
1053
     */
1054
    public function modify_edit_field_input( $field_content = '', $field, $value, $lead_id = 0, $form_id ) {
0 ignored issues
show
Unused Code introduced by
The parameter $lead_id is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $form_id is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1055
1056
        $gv_field = GravityView_Fields::get_associated_field( $field );
1057
1058
        // If the form has been submitted, then we don't need to pre-fill the values,
1059
        // Except for fileupload type and when a field input is overridden- run always!!
1060
        if(
1061
            ( $this->is_edit_entry_submission() && !in_array( $field->type, array( 'fileupload', 'post_image' ) ) )
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1062
            && false === ( $gv_field && is_callable( array( $gv_field, 'get_field_input' ) ) )
1063
            || ! empty( $field_content )
1064
            || in_array( $field->type, array( 'honeypot' ) )
1065
        ) {
1066
	        return $field_content;
1067
        }
1068
1069
        $_post_backup = isset( $_POST ) ? $_POST : array();
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_POST
Loading history...
1070
1071
	        // Prevent "Product Fields are not editable" message on submitted form
1072
            unset( $_POST );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
1073
1074
        // SET SOME FIELD DEFAULTS TO PREVENT ISSUES
1075
        $field->adminOnly = false; /** @see GFFormDisplay::get_counter_init_script() need to prevent adminOnly */
1076
1077
        // add categories as choices for Post Category field
1078
        if ( 'post_category' === $field->type ) {
1079
            $field = GFCommon::add_categories_as_choices( $field, $value );
1080
        }
1081
1082
        $field_value = $this->get_field_value( $field );
1083
1084
	    // Prevent any PHP warnings, like undefined index
1085
	    ob_start();
1086
1087
	    $return = null;
1088
1089
        /** @var GravityView_Field $gv_field */
1090
        if( $gv_field && is_callable( array( $gv_field, 'get_field_input' ) ) ) {
1091
            $return = $gv_field->get_field_input( $this->form, $field_value, $this->entry, $field );
1092
        }
1093
1094
	    if ( empty( $return ) ) {
1095
	        $return = $field->get_field_input( $this->form, $field_value, $this->entry );
1096
	    }
1097
1098
	    // If there was output, it's an error
1099
	    $warnings = ob_get_clean();
1100
1101
	    if( !empty( $warnings ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1102
		    do_action( 'gravityview_log_error', __METHOD__ . $warnings, $field_value );
1103
	    }
1104
1105
        // Re-define $_POST
1106
        $_POST = $_post_backup;
1107
1108
        return $return;
1109
    }
1110
1111
    /**
1112
     * Modify the value for the current field input
1113
     *
1114
     * @param GF_Field $field
1115
     *
1116
     * @return array|mixed|string
1117
     */
1118
    private function get_field_value( $field ) {
1119
1120
        /**
1121
         * @filter `gravityview/edit_entry/pre_populate/override` Allow the pre-populated value to override saved value in Edit Entry form. By default, pre-populate mechanism only kicks on empty fields.
1122
         * @param boolean True: override saved values; False: don't override (default)
1123
         * @param $field GF_Field object Gravity Forms field object
1124
         * @since 1.13
1125
         */
1126
        $override_saved_value = apply_filters( 'gravityview/edit_entry/pre_populate/override', false, $field );
1127
1128
        // We're dealing with multiple inputs (e.g. checkbox) but not time or date (as it doesn't store data in input IDs)
1129
        if( isset( $field->inputs ) && is_array( $field->inputs ) && !in_array( $field->type, array( 'time', 'date' ) ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1130
1131
            $field_value = array();
1132
1133
            // only accept pre-populated values if the field doesn't have any choice selected.
1134
            $allow_pre_populated = $field->allowsPrepopulate;
1135
1136
            foreach ( (array)$field->inputs as $input ) {
0 ignored issues
show
introduced by
No space after closing casting parenthesis is prohibited
Loading history...
1137
1138
                $input_id = strval( $input['id'] );
1139
                
1140
                if ( isset( $this->entry[ $input_id ] ) && ! gv_empty( $this->entry[ $input_id ], false, false ) ) {
1141
                    $field_value[ $input_id ] =  'post_category' === $field->type ? GFCommon::format_post_category( $this->entry[ $input_id ], true ) : $this->entry[ $input_id ];
0 ignored issues
show
introduced by
Expected 1 space after "="; 2 found
Loading history...
1142
                    $allow_pre_populated = false;
1143
                }
1144
1145
            }
1146
1147
            $pre_value = $field->get_value_submission( array(), false );
1148
1149
            $field_value = ! $allow_pre_populated && ! ( $override_saved_value && !gv_empty( $pre_value, false, false ) ) ? $field_value : $pre_value;
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1150
1151
        } else {
1152
1153
            $id = intval( $field->id );
1154
1155
            // get pre-populated value if exists
1156
            $pre_value = $field->allowsPrepopulate ? GFFormsModel::get_parameter_value( $field->inputName, array(), $field ) : '';
1157
1158
            // saved field entry value (if empty, fallback to the pre-populated value, if exists)
1159
            // or pre-populated value if not empty and set to override saved value
1160
            $field_value = !gv_empty( $this->entry[ $id ], false, false ) && ! ( $override_saved_value && !gv_empty( $pre_value, false, false ) ) ? $this->entry[ $id ] : $pre_value;
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1161
1162
            // in case field is post_category but inputType is select, multi-select or radio, convert value into array of category IDs.
1163
            if ( 'post_category' === $field->type && !gv_empty( $field_value, false, false ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1164
                $categories = array();
1165
                foreach ( explode( ',', $field_value ) as $cat_string ) {
1166
                    $categories[] = GFCommon::format_post_category( $cat_string, true );
1167
                }
1168
                $field_value = 'multiselect' === $field->get_input_type() ? $categories : implode( '', $categories );
1169
            }
1170
1171
        }
1172
1173
        // if value is empty get the default value if defined
1174
        $field_value = $field->get_value_default_if_empty( $field_value );
1175
1176
	    /**
1177
	     * @filter `gravityview/edit_entry/field_value` Change the value of an Edit Entry field, if needed
1178
	     * @since 1.11
1179
	     * @since 1.20 Added third param
1180
	     * @param mixed $field_value field value used to populate the input
1181
	     * @param object $field Gravity Forms field object ( Class GF_Field )
1182
	     * @param GravityView_Edit_Entry_Render $this Current object
1183
	     */
1184
	    $field_value = apply_filters( 'gravityview/edit_entry/field_value', $field_value, $field, $this );
1185
1186
	    /**
1187
	     * @filter `gravityview/edit_entry/field_value_{field_type}` Change the value of an Edit Entry field for a specific field type
1188
	     * @since 1.17
1189
	     * @since 1.20 Added third param
1190
	     * @param mixed $field_value field value used to populate the input
1191
	     * @param GF_Field $field Gravity Forms field object
1192
	     * @param GravityView_Edit_Entry_Render $this Current object
1193
	     */
1194
	    $field_value = apply_filters( 'gravityview/edit_entry/field_value_' . $field->type , $field_value, $field, $this );
1195
1196
        return $field_value;
1197
    }
1198
1199
1200
    // ---- Entry validation
1201
1202
    /**
1203
     * Add field keys that Gravity Forms expects.
1204
     *
1205
     * @see GFFormDisplay::validate()
1206
     * @param  array $form GF Form
1207
     * @return array       Modified GF Form
1208
     */
1209
    public function gform_pre_validation( $form ) {
1210
1211
        if( ! $this->verify_nonce() ) {
1212
            return $form;
1213
        }
1214
1215
        // Fix PHP warning regarding undefined index.
1216
        foreach ( $form['fields'] as &$field) {
0 ignored issues
show
introduced by
No space before closing parenthesis is prohibited
Loading history...
1217
1218
            // This is because we're doing admin form pretending to be front-end, so Gravity Forms
1219
            // expects certain field array items to be set.
1220
            foreach ( array( 'noDuplicates', 'adminOnly', 'inputType', 'isRequired', 'enablePrice', 'inputs', 'allowedExtensions' ) as $key ) {
1221
	            $field->{$key} = isset( $field->{$key} ) ? $field->{$key} : NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
1222
            }
1223
1224
            // unset emailConfirmEnabled for email type fields
1225
           /* if( 'email' === $field['type'] && !empty( $field['emailConfirmEnabled'] ) ) {
0 ignored issues
show
Unused Code Comprehensibility introduced by
61% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
1226
                $field['emailConfirmEnabled'] = '';
1227
            }*/
1228
1229
            switch( RGFormsModel::get_input_type( $field ) ) {
1230
1231
                /**
1232
                 * this whole fileupload hack is because in the admin, Gravity Forms simply doesn't update any fileupload field if it's empty, but it DOES in the frontend.
1233
                 *
1234
                 * What we have to do is set the value so that it doesn't get overwritten as empty on save and appears immediately in the Edit Entry screen again.
1235
                 *
1236
                 * @hack
1237
                 */
1238
                case 'fileupload':
1239
1240
                    // Set the previous value
1241
                    $entry = $this->get_entry();
1242
1243
                    $input_name = 'input_'.$field->id;
1244
                    $form_id = $form['id'];
1245
1246
                    $value = NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
1247
1248
                    // Use the previous entry value as the default.
1249
                    if( isset( $entry[ $field->id ] ) ) {
1250
                        $value = $entry[ $field->id ];
1251
                    }
1252
1253
                    // If this is a single upload file
1254
                    if( !empty( $_FILES[ $input_name ] ) && !empty( $_FILES[ $input_name ]['name'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1255
                        $file_path = GFFormsModel::get_file_upload_path( $form['id'], $_FILES[ $input_name ]['name'] );
1256
                        $value = $file_path['url'];
1257
1258
                    } else {
1259
1260
                        // Fix PHP warning on line 1498 of form_display.php for post_image fields
1261
                        // Fix PHP Notice:  Undefined index:  size in form_display.php on line 1511
1262
                        $_FILES[ $input_name ] = array('name' => '', 'size' => '' );
0 ignored issues
show
introduced by
No space after opening parenthesis of array is bad style
Loading history...
1263
1264
                    }
1265
1266
                    if( rgar($field, "multipleFiles") ) {
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...
Coding Style Comprehensibility introduced by
The string literal multipleFiles does not require double quotes, as per coding-style, please use single quotes.

PHP provides two ways to mark string literals. Either with single quotes 'literal' or with double quotes "literal". The difference between these is that string literals in double quotes may contain variables with are evaluated at run-time as well as escape sequences.

String literals in single quotes on the other hand are evaluated very literally and the only two characters that needs escaping in the literal are the single quote itself (\') and the backslash (\\). Every other character is displayed as is.

Double quoted string literals may contain other variables or more complex escape sequences.

<?php

$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";

print $doubleQuoted;

will print an indented: Single is Value

If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear.

For more information on PHP string literals and available escape sequences see the PHP core documentation.

Loading history...
1267
1268
                        // If there are fresh uploads, process and merge them.
1269
                        // Otherwise, use the passed values, which should be json-encoded array of URLs
1270
                        if( isset( GFFormsModel::$uploaded_files[$form_id][$input_name] ) ) {
0 ignored issues
show
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
1271
                            $value = empty( $value ) ? '[]' : $value;
1272
                            $value = stripslashes_deep( $value );
1273
                            $value = GFFormsModel::prepare_value( $form, $field, $value, $input_name, $entry['id'], array());
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
1274
                        }
1275
1276
                    } else {
1277
1278
                        // A file already exists when editing an entry
1279
                        // We set this to solve issue when file upload fields are required.
1280
                        GFFormsModel::$uploaded_files[ $form_id ][ $input_name ] = $value;
1281
1282
                    }
1283
1284
                    $this->entry[ $input_name ] = $value;
1285
                    $_POST[ $input_name ] = $value;
1286
1287
                    break;
1288
1289
                case 'number':
1290
                    // Fix "undefined index" issue at line 1286 in form_display.php
1291
                    if( !isset( $_POST['input_'.$field->id ] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
1292
                        $_POST['input_'.$field->id ] = NULL;
0 ignored issues
show
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
1293
                    }
1294
                    break;
1295
            }
1296
1297
        }
1298
1299
        return $form;
1300
    }
1301
1302
1303
    /**
1304
     * Process validation for a edit entry submission
1305
     *
1306
     * Sets the `is_valid` object var
1307
     *
1308
     * @return void
1309
     */
1310
    private function validate() {
1311
1312
        /**
1313
         * If using GF User Registration Add-on, remove the validation step, otherwise generates error when updating the entry
1314
         * GF User Registration Add-on version > 3.x has a different class name
1315
         * @since 1.16.2
1316
         */
1317
        if ( class_exists( 'GF_User_Registration' ) ) {
1318
            remove_filter( 'gform_validation', array( GF_User_Registration::get_instance(), 'validate' ) );
1319
        } else  if ( class_exists( 'GFUser' ) ) {
1320
            remove_filter( 'gform_validation', array( 'GFUser', 'user_registration_validation' ) );
1321
        }
1322
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
1323
1324
        /**
1325
         * For some crazy reason, Gravity Forms doesn't validate Edit Entry form submissions.
1326
         * You can enter whatever you want!
1327
         * We try validating, and customize the results using `self::custom_validation()`
1328
         */
1329
        add_filter( 'gform_validation_'. $this->form_id, array( $this, 'custom_validation' ), 10, 4);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
1330
1331
        // Needed by the validate funtion
1332
        $failed_validation_page = NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
1333
        $field_values = RGForms::post( 'gform_field_values' );
1334
1335
        // Prevent entry limit from running when editing an entry, also
1336
        // prevent form scheduling from preventing editing
1337
        unset( $this->form['limitEntries'], $this->form['scheduleForm'] );
1338
1339
        // Hide fields depending on Edit Entry settings
1340
        $this->form['fields'] = $this->get_configured_edit_fields( $this->form, $this->view_id );
1341
1342
        $this->is_valid = GFFormDisplay::validate( $this->form, $field_values, 1, $failed_validation_page );
1343
1344
        remove_filter( 'gform_validation_'. $this->form_id, array( $this, 'custom_validation' ), 10 );
1345
    }
1346
1347
1348
    /**
1349
     * Make validation work for Edit Entry
1350
     *
1351
     * Because we're calling the GFFormDisplay::validate() in an unusual way (as a front-end
1352
     * form pretending to be a back-end form), validate() doesn't know we _can't_ edit post
1353
     * fields. This goes through all the fields and if they're an invalid post field, we
1354
     * set them as valid. If there are still issues, we'll return false.
1355
     *
1356
     * @param  [type] $validation_results [description]
0 ignored issues
show
Documentation introduced by
The doc-type [type] could not be parsed: Unknown type name "" at position 0. [(view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
1357
     * @return [type]                     [description]
0 ignored issues
show
Documentation introduced by
The doc-type [type] could not be parsed: Unknown type name "" at position 0. [(view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
1358
     */
1359
    public function custom_validation( $validation_results ) {
1360
1361
        do_action('gravityview_log_debug', 'GravityView_Edit_Entry[custom_validation] Validation results: ', $validation_results );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
1362
1363
        do_action('gravityview_log_debug', 'GravityView_Edit_Entry[custom_validation] $_POSTed data (sanitized): ', esc_html( print_r( $_POST, true ) ) );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
introduced by
The use of function print_r() is discouraged
Loading history...
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
1364
1365
        $gv_valid = true;
1366
1367
        foreach ( $validation_results['form']['fields'] as $key => &$field ) {
1368
1369
            $value = RGFormsModel::get_field_value( $field );
1370
            $field_type = RGFormsModel::get_input_type( $field );
1371
1372
            // Validate always
1373
            switch ( $field_type ) {
1374
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
1375
1376
                case 'fileupload' :
1377
                case 'post_image':
1378
1379
                    // in case nothing is uploaded but there are already files saved
1380
                    if( !empty( $field->failed_validation ) && !empty( $field->isRequired ) && !empty( $value ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1381
                        $field->failed_validation = false;
1382
                        unset( $field->validation_message );
1383
                    }
1384
1385
                    // validate if multi file upload reached max number of files [maxFiles] => 2
1386
                    if( rgobj( $field, 'maxFiles') && rgobj( $field, 'multipleFiles') ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
1387
1388
                        $input_name = 'input_' . $field->id;
1389
                        //uploaded
1390
                        $file_names = isset( GFFormsModel::$uploaded_files[ $validation_results['form']['id'] ][ $input_name ] ) ? GFFormsModel::$uploaded_files[ $validation_results['form']['id'] ][ $input_name ] : array();
1391
1392
                        //existent
1393
                        $entry = $this->get_entry();
1394
                        $value = NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
1395
                        if( isset( $entry[ $field->id ] ) ) {
1396
                            $value = json_decode( $entry[ $field->id ], true );
1397
                        }
1398
1399
                        // count uploaded files and existent entry files
1400
                        $count_files = count( $file_names ) + count( $value );
1401
1402
                        if( $count_files > $field->maxFiles ) {
1403
                            $field->validation_message = __( 'Maximum number of files reached', 'gravityview' );
1404
                            $field->failed_validation = 1;
1405
                            $gv_valid = false;
1406
1407
                            // in case of error make sure the newest upload files are removed from the upload input
1408
                            GFFormsModel::$uploaded_files[ $validation_results['form']['id'] ] = null;
1409
                        }
1410
1411
                    }
1412
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
1413
1414
                    break;
1415
1416
            }
1417
1418
            // This field has failed validation.
1419
            if( !empty( $field->failed_validation ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1420
1421
                do_action( 'gravityview_log_debug', 'GravityView_Edit_Entry[custom_validation] Field is invalid.', array( 'field' => $field, 'value' => $value ) );
1422
1423
                switch ( $field_type ) {
1424
1425
                    // Captchas don't need to be re-entered.
1426
                    case 'captcha':
1427
1428
                        // Post Image fields aren't editable, so we un-fail them.
1429
                    case 'post_image':
1430
                        $field->failed_validation = false;
1431
                        unset( $field->validation_message );
1432
                        break;
1433
1434
                }
1435
1436
                // You can't continue inside a switch, so we do it after.
1437
                if( empty( $field->failed_validation ) ) {
1438
                    continue;
1439
                }
1440
1441
                // checks if the No Duplicates option is not validating entry against itself, since
1442
                // we're editing a stored entry, it would also assume it's a duplicate.
1443
                if( !empty( $field->noDuplicates ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1444
1445
                    $entry = $this->get_entry();
1446
1447
                    // If the value of the entry is the same as the stored value
1448
                    // Then we can assume it's not a duplicate, it's the same.
1449
                    if( !empty( $entry ) && $value == $entry[ $field->id ] ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1450
                        //if value submitted was not changed, then don't validate
1451
                        $field->failed_validation = false;
1452
1453
                        unset( $field->validation_message );
1454
1455
                        do_action('gravityview_log_debug', 'GravityView_Edit_Entry[custom_validation] Field not a duplicate; it is the same entry.', $entry );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
1456
1457
                        continue;
1458
                    }
1459
                }
1460
1461
                // if here then probably we are facing the validation 'At least one field must be filled out'
1462
                if( GFFormDisplay::is_empty( $field, $this->form_id  ) && empty( $field->isRequired ) ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 2 found
Loading history...
1463
                    unset( $field->validation_message );
1464
	                $field->validation_message = false;
1465
                    continue;
1466
                }
1467
1468
                $gv_valid = false;
1469
1470
            }
1471
1472
        }
1473
1474
        $validation_results['is_valid'] = $gv_valid;
1475
1476
        do_action('gravityview_log_debug', 'GravityView_Edit_Entry[custom_validation] Validation results.', $validation_results );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
1477
1478
        // We'll need this result when rendering the form ( on GFFormDisplay::get_form )
1479
        $this->form_after_validation = $validation_results['form'];
1480
1481
        return $validation_results;
1482
    }
1483
1484
1485
    /**
1486
     * TODO: This seems to be hacky... we should remove it. Entry is set when updating the form using setup_vars()!
1487
     * Get the current entry and set it if it's not yet set.
1488
     * @return array Gravity Forms entry array
1489
     */
1490
    public function get_entry() {
1491
1492
        if( empty( $this->entry ) ) {
1493
            // Get the database value of the entry that's being edited
1494
            $this->entry = gravityview_get_entry( GravityView_frontend::is_single_entry() );
1495
        }
1496
1497
        return $this->entry;
1498
    }
1499
1500
1501
1502
    // --- Filters
1503
1504
    /**
1505
     * Get the Edit Entry fields as configured in the View
1506
     *
1507
     * @since 1.8
1508
     *
1509
     * @param int $view_id
1510
     *
1511
     * @return array Array of fields that are configured in the Edit tab in the Admin
1512
     */
1513
    private function get_configured_edit_fields( $form, $view_id ) {
1514
1515
        // Get all fields for form
1516
        $properties = GravityView_View_Data::getInstance()->get_fields( $view_id );
1517
1518
        // If edit tab not yet configured, show all fields
1519
        $edit_fields = !empty( $properties['edit_edit-fields'] ) ? $properties['edit_edit-fields'] : NULL;
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
1520
1521
        // Hide fields depending on admin settings
1522
        $fields = $this->filter_fields( $form['fields'], $edit_fields );
1523
1524
	    // If Edit Entry fields are configured, remove adminOnly field settings. Otherwise, don't.
1525
	    $fields = $this->filter_admin_only_fields( $fields, $edit_fields, $form, $view_id );
1526
1527
        /**
1528
         * @filter `gravityview/edit_entry/form_fields` Modify the fields displayed in Edit Entry form
1529
         * @since 1.17
1530
         * @param GF_Field[] $fields Gravity Forms form fields
1531
         * @param array|null $edit_fields Fields for the Edit Entry tab configured in the View Configuration
1532
         * @param array $form GF Form array (`fields` key modified to have only fields configured to show in Edit Entry)
1533
         * @param int $view_id View ID
1534
         */
1535
        $fields = apply_filters( 'gravityview/edit_entry/form_fields', $fields, $edit_fields, $form, $view_id );
1536
1537
        return $fields;
1538
    }
1539
1540
1541
    /**
1542
     * Filter area fields based on specified conditions
1543
     *  - This filter removes the fields that have calculation configured
1544
     *
1545
     * @uses GravityView_Edit_Entry::user_can_edit_field() Check caps
1546
     * @access private
1547
     * @param GF_Field[] $fields
1548
     * @param array $configured_fields
1549
     * @since  1.5
1550
     * @return array $fields
1551
     */
1552
    private function filter_fields( $fields, $configured_fields ) {
1553
1554
        if( empty( $fields ) || !is_array( $fields ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1555
            return $fields;
1556
        }
1557
1558
        $edit_fields = array();
1559
1560
        $field_type_blacklist = $this->loader->get_field_blacklist( $this->entry );
1561
1562
        // First, remove blacklist or calculation fields
1563
        foreach ( $fields as $key => $field ) {
1564
1565
            // Remove the fields that have calculation properties and keep them to be used later
1566
            // @since 1.16.2
1567
            if( $field->has_calculation() ) {
1568
                $this->fields_with_calculation[] = $field;
1569
                // don't remove the calculation fields on form render.
1570
            }
1571
1572
            if( in_array( $field->type, $field_type_blacklist ) ) {
1573
                unset( $fields[ $key ] );
1574
            }
1575
        }
1576
1577
        // The Edit tab has not been configured, so we return all fields by default.
1578
        if( empty( $configured_fields ) ) {
1579
            return $fields;
1580
        }
1581
1582
        // The edit tab has been configured, so we loop through to configured settings
1583
        foreach ( $configured_fields as $configured_field ) {
1584
1585
	        /** @var GF_Field $field */
1586
	        foreach ( $fields as $field ) {
1587
1588
                if( intval( $configured_field['id'] ) === intval( $field->id ) && $this->user_can_edit_field( $configured_field, false ) ) {
1589
                    $edit_fields[] = $this->merge_field_properties( $field, $configured_field );
1590
                    break;
1591
                }
1592
1593
            }
1594
1595
        }
1596
1597
        return $edit_fields;
1598
1599
    }
1600
1601
    /**
1602
     * Override GF Form field properties with the ones defined on the View
1603
     * @param  GF_Field $field GF Form field object
1604
     * @param  array $field_setting  GV field options
1605
     * @since  1.5
1606
     * @return array|GF_Field
1607
     */
1608
    private function merge_field_properties( $field, $field_setting ) {
1609
1610
        $return_field = $field;
1611
1612
        if( empty( $field_setting['show_label'] ) ) {
1613
            $return_field->label = '';
1614
        } elseif ( !empty( $field_setting['custom_label'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1615
            $return_field->label = $field_setting['custom_label'];
1616
        }
1617
1618
        if( !empty( $field_setting['custom_class'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1619
            $return_field->cssClass .= ' '. gravityview_sanitize_html_class( $field_setting['custom_class'] );
1620
        }
1621
1622
        /**
1623
         * Normalize page numbers - avoid conflicts with page validation
1624
         * @since 1.6
1625
         */
1626
        $return_field->pageNumber = 1;
1627
1628
        return $return_field;
1629
1630
    }
1631
1632
    /**
1633
     * Remove fields that shouldn't be visible based on the Gravity Forms adminOnly field property
1634
     *
1635
     * @since 1.9.1
1636
     *
1637
     * @param array|GF_Field[] $fields Gravity Forms form fields
1638
     * @param array|null $edit_fields Fields for the Edit Entry tab configured in the View Configuration
1639
     * @param array $form GF Form array
1640
     * @param int $view_id View ID
1641
     *
1642
     * @return array Possibly modified form array
1643
     */
1644
    private function filter_admin_only_fields( $fields = array(), $edit_fields = null, $form = array(), $view_id = 0 ) {
1645
1646
	    /**
1647
         * @filter `gravityview/edit_entry/use_gf_admin_only_setting` When Edit tab isn't configured, should the Gravity Forms "Admin Only" field settings be used to control field display to non-admins? Default: true
1648
	     * If the Edit Entry tab is not configured, adminOnly fields will not be shown to non-administrators.
1649
	     * If the Edit Entry tab *is* configured, adminOnly fields will be shown to non-administrators, using the configured GV permissions
1650
	     * @since 1.9.1
1651
	     * @param boolean $use_gf_adminonly_setting True: Hide field if set to Admin Only in GF and the user is not an admin. False: show field based on GV permissions, ignoring GF permissions.
1652
	     * @param array $form GF Form array
1653
	     * @param int $view_id View ID
1654
	     */
1655
	    $use_gf_adminonly_setting = apply_filters( 'gravityview/edit_entry/use_gf_admin_only_setting', empty( $edit_fields ), $form, $view_id );
1656
1657
	    if( $use_gf_adminonly_setting && false === GVCommon::has_cap( 'gravityforms_edit_entries', $this->entry['id'] ) ) {
1658
            foreach( $fields as $k => $field ) {
1659
                if( $field->adminOnly ) {
1660
                    unset( $fields[ $k ] );
1661
                }
1662
            }
1663
            return $fields;
1664
        }
1665
1666
	    foreach( $fields as &$field ) {
1667
		    $field->adminOnly = false;
1668
        }
1669
1670
        return $fields;
1671
    }
1672
1673
    // --- Conditional Logic
1674
1675
    /**
1676
     * Conditional logic isn't designed to work with forms that already have content. When switching input values,
1677
     * the dependent fields will be blank.
1678
     *
1679
     * Note: This is because GF populates a JavaScript variable with the input values. This is tough to filter at the input level;
1680
     * via the `gform_field_value` filter; it requires lots of legwork. Doing it at the form level is easier.
1681
     *
1682
     * @since 1.17.4
1683
     *
1684
     * @param array $form Gravity Forms array object
1685
     *
1686
     * @return array $form, modified to fix conditional
1687
     */
1688
    function prefill_conditional_logic( $form ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
1689
1690
        if( ! GFFormDisplay::has_conditional_logic( $form ) ) {
1691
            return $form;
1692
        }
1693
1694
        // Have Conditional Logic pre-fill fields as if the data were default values
1695
        /** @var GF_Field $field */
1696
        foreach ( $form['fields'] as &$field ) {
1697
1698
            if( 'checkbox' === $field->type ) {
1699
                foreach ( $field->get_entry_inputs() as $key => $input ) {
1700
                    $input_id = $input['id'];
1701
                    $choice = $field->choices[ $key ];
1702
                    $value = rgar( $this->entry, $input_id );
1703
                    $match = RGFormsModel::choice_value_match( $field, $choice, $value );
1704
                    if( $match ) {
1705
                        $field->choices[ $key ]['isSelected'] = true;
1706
                    }
1707
                }
1708
            } else {
1709
1710
                // We need to run through each field to set the default values
1711
                foreach ( $this->entry as $field_id => $field_value ) {
1712
1713
                    if( floatval( $field_id ) === floatval( $field->id ) ) {
1714
1715
                        if( 'list' === $field->type ) {
1716
                            $list_rows = maybe_unserialize( $field_value );
1717
1718
                            $list_field_value = array();
1719
                            foreach ( (array) $list_rows as $row ) {
1720
                                foreach ( (array) $row as $column ) {
1721
                                    $list_field_value[] = $column;
1722
                                }
1723
                            }
1724
1725
                            $field->defaultValue = serialize( $list_field_value );
1726
                        } else {
1727
                            $field->defaultValue = $field_value;
1728
                        }
1729
                    }
1730
                }
1731
            }
1732
        }
1733
1734
        return $form;
1735
    }
1736
1737
    /**
1738
     * Remove the conditional logic rules from the form button and the form fields, if needed.
1739
     *
1740
     * @todo Merge with caller method
1741
     * @since 1.9
1742
     *
1743
     * @param array $form Gravity Forms form
1744
     * @return array Modified form, if not using Conditional Logic
1745
     */
1746
    private function filter_conditional_logic( $form ) {
1747
1748
        /**
1749
         * @filter `gravityview/edit_entry/conditional_logic` Should the Edit Entry form use Gravity Forms conditional logic showing/hiding of fields?
1750
         * @since 1.9
1751
         * @param bool $use_conditional_logic True: Gravity Forms will show/hide fields just like in the original form; False: conditional logic will be disabled and fields will be shown based on configuration. Default: true
1752
         * @param array $form Gravity Forms form
1753
         */
1754
        $use_conditional_logic = apply_filters( 'gravityview/edit_entry/conditional_logic', true, $form );
1755
1756
        if( $use_conditional_logic ) {
1757
            return $form;
1758
        }
1759
1760
        foreach( $form['fields'] as &$field ) {
1761
            /* @var GF_Field $field */
1762
            $field->conditionalLogic = null;
1763
        }
1764
1765
        unset( $form['button']['conditionalLogic'] );
1766
1767
        return $form;
1768
1769
    }
1770
1771
    /**
1772
     * Disable the Gravity Forms conditional logic script and features on the Edit Entry screen
1773
     *
1774
     * @since 1.9
1775
     *
1776
     * @param $has_conditional_logic
1777
     * @param $form
1778
     * @return mixed
1779
     */
1780
    public function manage_conditional_logic( $has_conditional_logic, $form ) {
1781
1782
        if( ! $this->is_edit_entry() ) {
1783
            return $has_conditional_logic;
1784
        }
1785
1786
	    /** @see GravityView_Edit_Entry_Render::filter_conditional_logic for filter documentation */
1787
        return apply_filters( 'gravityview/edit_entry/conditional_logic', $has_conditional_logic, $form );
1788
    }
1789
1790
1791
    // --- User checks and nonces
1792
1793
    /**
1794
     * Check if the user can edit the entry
1795
     *
1796
     * - Is the nonce valid?
1797
     * - Does the user have the right caps for the entry
1798
     * - Is the entry in the trash?
1799
     *
1800
     * @todo Move to GVCommon
1801
     *
1802
     * @param  boolean $echo Show error messages in the form?
1803
     * @return boolean        True: can edit form. False: nope.
1804
     */
1805
    private function user_can_edit_entry( $echo = false ) {
1806
1807
        $error = NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
1808
1809
        /**
1810
         *  1. Permalinks are turned off
1811
         *  2. There are two entries embedded using oEmbed
1812
         *  3. One of the entries has just been saved
1813
         */
1814
        if( !empty( $_POST['lid'] ) && !empty( $_GET['entry'] ) && ( $_POST['lid'] !== $_GET['entry'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1815
1816
            $error = true;
1817
1818
        }
1819
1820
        if( !empty( $_GET['entry'] ) && (string)$this->entry['id'] !== $_GET['entry'] ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
introduced by
No space after closing casting parenthesis is prohibited
Loading history...
1821
1822
            $error = true;
1823
1824
        } elseif( ! $this->verify_nonce() ) {
1825
1826
            /**
1827
             * If the Entry is embedded, there may be two entries on the same page.
1828
             * If that's the case, and one is being edited, the other should fail gracefully and not display an error.
1829
             */
1830
            if( GravityView_oEmbed::getInstance()->get_entry_id() ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression \GravityView_oEmbed::get...tance()->get_entry_id() of type integer|null is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
1831
                $error = true;
1832
            } else {
1833
                $error = __( 'The link to edit this entry is not valid; it may have expired.', 'gravityview');
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
1834
            }
1835
1836
        }
1837
1838
        if( ! GravityView_Edit_Entry::check_user_cap_edit_entry( $this->entry ) ) {
1839
            $error = __( '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...
1840
        }
1841
1842
        if( $this->entry['status'] === 'trash' ) {
0 ignored issues
show
introduced by
Found "=== '". Use Yoda Condition checks, you must
Loading history...
1843
            $error = __('You cannot edit the entry; it is in the trash.', 'gravityview' );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
1844
        }
1845
1846
        // No errors; everything's fine here!
1847
        if( empty( $error ) ) {
1848
            return true;
1849
        }
1850
1851
        if( $echo && $error !== true ) {
0 ignored issues
show
introduced by
Found "!== true". Use Yoda Condition checks, you must
Loading history...
1852
1853
	        $error = esc_html( $error );
1854
1855
	        /**
1856
	         * @since 1.9
1857
	         */
1858
	        if ( ! empty( $this->entry ) ) {
1859
		        $error .= ' ' . gravityview_get_link( '#', _x('Go back.', 'Link shown when invalid Edit Entry link is clicked', 'gravityview' ), array( 'onclick' => "window.history.go(-1); return false;" ) );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style Comprehensibility introduced by
The string literal window.history.go(-1); return false; does not require double quotes, as per coding-style, please use single quotes.

PHP provides two ways to mark string literals. Either with single quotes 'literal' or with double quotes "literal". The difference between these is that string literals in double quotes may contain variables with are evaluated at run-time as well as escape sequences.

String literals in single quotes on the other hand are evaluated very literally and the only two characters that needs escaping in the literal are the single quote itself (\') and the backslash (\\). Every other character is displayed as is.

Double quoted string literals may contain other variables or more complex escape sequences.

<?php

$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";

print $doubleQuoted;

will print an indented: Single is Value

If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear.

For more information on PHP string literals and available escape sequences see the PHP core documentation.

Loading history...
1860
	        }
1861
1862
            echo GVCommon::generate_notice( wpautop( $error ), 'gv-error error');
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'GVCommon'
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
1863
        }
1864
1865
        do_action('gravityview_log_error', 'GravityView_Edit_Entry[user_can_edit_entry]' . $error );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
1866
1867
        return false;
1868
    }
1869
1870
1871
    /**
1872
     * Check whether a field is editable by the current user, and optionally display an error message
1873
     * @uses  GravityView_Edit_Entry->check_user_cap_edit_field() Check user capabilities
1874
     * @param  array  $field Field or field settings array
1875
     * @param  boolean $echo  Whether to show error message telling user they aren't allowed
1876
     * @return boolean         True: user can edit the current field; False: nope, they can't.
1877
     */
1878
    private function user_can_edit_field( $field, $echo = false ) {
1879
1880
        $error = NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
1881
1882
        if( ! $this->check_user_cap_edit_field( $field ) ) {
1883
            $error = __( 'You do not have permission to edit this field.', 'gravityview');
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
1884
        }
1885
1886
        // No errors; everything's fine here!
1887
        if( empty( $error ) ) {
1888
            return true;
1889
        }
1890
1891
        if( $echo ) {
1892
            echo GVCommon::generate_notice( wpautop( esc_html( $error ) ), 'gv-error error');
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'GVCommon'
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
1893
        }
1894
1895
        do_action('gravityview_log_error', 'GravityView_Edit_Entry[user_can_edit_field]' . $error );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
1896
1897
        return false;
1898
1899
    }
1900
1901
1902
    /**
1903
     * checks if user has permissions to edit a specific field
1904
     *
1905
     * Needs to be used combined with GravityView_Edit_Entry::user_can_edit_field for maximum security!!
1906
     *
1907
     * @param  [type] $field [description]
0 ignored issues
show
Documentation introduced by
The doc-type [type] could not be parsed: Unknown type name "" at position 0. [(view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
1908
     * @return bool
1909
     */
1910
    private function check_user_cap_edit_field( $field ) {
1911
1912
        // If they can edit any entries (as defined in Gravity Forms), we're good.
1913
        if( GVCommon::has_cap( array( 'gravityforms_edit_entries', 'gravityview_edit_others_entries' ) ) ) {
1914
            return true;
1915
        }
1916
1917
        $field_cap = isset( $field['allow_edit_cap'] ) ? $field['allow_edit_cap'] : false;
1918
1919
        // If the field has custom editing capaibilities set, check those
1920
        if( $field_cap ) {
1921
            return GVCommon::has_cap( $field['allow_edit_cap'] );
1922
        }
1923
1924
        return false;
1925
    }
1926
1927
1928
    /**
1929
     * Is the current nonce valid for editing the entry?
1930
     * @return boolean
1931
     */
1932
    public function verify_nonce() {
1933
1934
        // Verify form submitted for editing single
1935
        if( $this->is_edit_entry_submission() ) {
1936
            $valid = wp_verify_nonce( $_POST[ self::$nonce_field ], self::$nonce_field );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-validated input variable: $_POST
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_POST
Loading history...
1937
        }
1938
1939
        // Verify
1940
        else if( ! $this->is_edit_entry() ) {
1941
            $valid = false;
1942
        }
1943
1944
        else {
1945
            $valid = wp_verify_nonce( $_GET['edit'], self::$nonce_key );
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-validated input variable: $_GET
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
1946
        }
1947
1948
        /**
1949
         * @filter `gravityview/edit_entry/verify_nonce` Override Edit Entry nonce validation. Return true to declare nonce valid.
1950
         * @since 1.13
1951
         * @param int|boolean $valid False if invalid; 1 or 2 when nonce was generated
1952
         * @param string $nonce_field Key used when validating submissions. Default: is_gv_edit_entry
1953
         */
1954
        $valid = apply_filters( 'gravityview/edit_entry/verify_nonce', $valid, self::$nonce_field );
1955
1956
        return $valid;
1957
    }
1958
1959
1960
1961
} //end class