Completed
Push — master ( 196a0a...af77e8 )
by Zack
11:10 queued 04:43
created

GravityView_Edit_Entry_Render::verify_nonce()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 26
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3.1406

Importance

Changes 0
Metric Value
cc 3
eloc 9
nc 3
nop 0
dl 0
loc 26
ccs 6
cts 8
cp 0.75
crap 3.1406
rs 8.8571
c 0
b 0
f 0
1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 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 2
    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 2
        $this->loader = $loader;
104 2
    }
105
106 2
    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 2
        include_once( GRAVITYVIEW_DIR .'includes/class-admin-approve-entries.php' );
110
111
        // Don't display an embedded form when editing an entry
112 2
        add_action( 'wp_head', array( $this, 'prevent_render_form' ) );
113 2
        add_action( 'wp_footer', array( $this, 'prevent_render_form' ) );
114
115
        // Stop Gravity Forms processing what is ours!
116 2
        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 2
        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 2
        add_action( 'gravityview_edit_entry', array( $this, 'init' ) );
121
122
        // Disable conditional logic if needed (since 1.9)
123 2
        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 2
        add_filter( 'gform_plupload_settings', array( $this, 'modify_fileupload_settings' ), 10, 3 );
127
128
        // Add fields expected by GFFormDisplay::validate()
129 2
        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 2
    }
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 1
    public function prevent_render_form() {
144 1
        if( $this->is_edit_entry() ) {
145 1
            if( 'wp_head' === current_filter() ) {
146 1
                add_filter( 'gform_shortcode_form', '__return_empty_string' );
147
            } else {
148 1
                remove_filter( 'gform_shortcode_form', '__return_empty_string' );
149
            }
150
        }
151 1
    }
152
153
    /**
154
     * Because we're mimicking being a front-end Gravity Forms form while using a Gravity Forms
155
     * backend form, we need to prevent them from saving twice.
156
     * @return void
157
     */
158
    public function prevent_maybe_process_form() {
159
160
        if( ! empty( $_POST ) ) {
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
161
	        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
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...
162
        }
163
164
        if( $this->is_edit_entry_submission() ) {
165
            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...
166
        }
167
    }
168
169
    /**
170
     * Is the current page an Edit Entry page?
171
     * @return boolean
172
     */
173 3
    public function is_edit_entry() {
174
175 3
        $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...
176
177 3
        return ( $is_edit_entry || $this->is_edit_entry_submission() );
178
    }
179
180
	/**
181
	 * Is the current page an Edit Entry page?
182
	 * @since 1.9
183
	 * @return boolean
184
	 */
185 2
	public function is_edit_entry_submission() {
186 2
		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...
187
	}
188
189
    /**
190
     * When Edit entry view is requested setup the vars
191
     */
192 2
    private function setup_vars() {
193 2
        $gravityview_view = GravityView_View::getInstance();
194
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
195
196 2
        $entries = $gravityview_view->getEntries();
197 2
	    self::$original_entry = $entries[0];
198 2
	    $this->entry = $entries[0];
199
200 2
        self::$original_form = $gravityview_view->getForm();
201 2
        $this->form = $gravityview_view->getForm();
202 2
        $this->form_id = $gravityview_view->getFormId();
203 2
        $this->view_id = $gravityview_view->getViewId();
204
205 2
        self::$nonce_key = GravityView_Edit_Entry::get_nonce_key( $this->view_id, $this->form_id, $this->entry['id'] );
206 2
    }
207
208
209
    /**
210
     * Load required files and trigger edit flow
211
     *
212
     * Run when the is_edit_entry returns true.
213
     *
214
     * @param GravityView_View_Data $gv_data GravityView Data object
215
     * @return void
216
     */
217 3
    public function init( $gv_data ) {
218
219 3
        require_once( GFCommon::get_base_path() . '/form_display.php' );
220 3
        require_once( GFCommon::get_base_path() . '/entry_detail.php' );
221
222 3
        $this->setup_vars();
223
224
        // Multiple Views embedded, don't proceed if nonce fails
225 3
        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...
226
            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...
227
            return;
228
        }
229
230
        // Sorry, you're not allowed here.
231 3
        if( false === $this->user_can_edit_entry( true ) ) {
232 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...
233 1
            return;
234
        }
235
236 3
        $this->print_scripts();
237
238 3
        $this->process_save();
239
240 3
        $this->edit_entry_form();
241
242 3
    }
243
244
245
    /**
246
     * Force Gravity Forms to output scripts as if it were in the admin
247
     * @return void
248
     */
249 2
    private function print_scripts() {
250 2
        $gravityview_view = GravityView_View::getInstance();
251
252 2
        wp_register_script( 'gform_gravityforms', GFCommon::get_base_url().'/js/gravityforms.js', array( 'jquery', 'gform_json', 'gform_placeholder', 'sack', 'plupload-all', 'gravityview-fe-view' ) );
253
254 2
        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...
255
256
        // Sack is required for images
257 2
        wp_print_scripts( array( 'sack', 'gform_gravityforms' ) );
258 2
    }
259
260
261
    /**
262
     * Process edit entry form save
263
     */
264 3
    private function process_save() {
265
266 3
        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...
267 3
            return;
268
        }
269
270
        // Make sure the entry, view, and form IDs are all correct
271 3
        $valid = $this->verify_nonce();
272
273 3
        if( !$valid ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
274
            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...
275
            return;
276
        }
277
278 3
        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...
279
            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...
280
            return;
281
        }
282
283 3
        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...
284
285 3
        $this->process_save_process_files( $this->form_id );
286
287 3
        $this->validate();
288
289 3
        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...
290
291 3
            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...
292
293
            /**
294
             * @hack This step is needed to unset the adminOnly from form fields, to add the calculation fields
295
             */
296 3
            $form = $this->form_prepare_for_save();
297
298
            /**
299
             * @hack to avoid the capability validation of the method save_lead for GF 1.9+
300
             */
301 3
            unset( $_GET['page'] );
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
302
303 3
            $date_created = $this->entry['date_created'];
304
305
            /**
306
             * @hack to force Gravity Forms to use $read_value_from_post in GFFormsModel::save_lead()
307
             * @since 1.17.2
308
             */
309 3
            unset( $this->entry['date_created'] );
310
311 3
            GFFormsModel::save_lead( $form, $this->entry );
312
313
	        // Delete the values for hidden inputs
314 3
	        $this->unset_hidden_field_values();
315
            
316 3
            $this->entry['date_created'] = $date_created;
317
318
            // Process calculation fields
319 3
            $this->update_calculation_fields();
320
321
            // Perform actions normally performed after updating a lead
322 3
            $this->after_update();
323
324
	        /**
325
             * Must be AFTER after_update()!
326
             * @see https://github.com/gravityview/GravityView/issues/764
327
             */
328 3
            $this->maybe_update_post_fields( $form );
329
330
            /**
331
             * @action `gravityview/edit_entry/after_update` Perform an action after the entry has been updated using Edit Entry
332
             * @param array $form Gravity Forms form array
333
             * @param string $entry_id Numeric ID of the entry that was updated
334
             * @param GravityView_Edit_Entry_Render $this This object
335
             */
336 3
            do_action( 'gravityview/edit_entry/after_update', $this->form, $this->entry['id'], $this );
337
338
        } else {
339
            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...
340
        }
341
342 3
    } // process_save
343
344
	/**
345
	 * Delete the value of fields hidden by conditional logic when the entry is edited
346
     *
347
     * @uses GFFormsModel::update_lead_field_value()
348
     *
349
     * @since 1.17.4
350
     *
351
     * @return void
352
	 */
353 2
    private function unset_hidden_field_values() {
354 2
	    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...
355
356 2
	    $lead_detail_table      = GFFormsModel::get_lead_details_table_name();
357 2
	    $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...
358
359 2
	    foreach ( $this->entry as $input_id => $field_value ) {
360
361 2
		    $field = RGFormsModel::get_field( $this->form, $input_id );
362
363
		    // Reset fields that are hidden
364
		    // Don't pass $entry as fourth parameter; force using $_POST values to calculate conditional logic
365 2
		    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...
366
367
		        // List fields are stored as empty arrays when empty
368
			    $empty_value = $this->is_field_json_encoded( $field ) ? '[]' : '';
369
370
			    $lead_detail_id = GFFormsModel::get_lead_detail_id( $current_fields, $input_id );
371
372
			    GFFormsModel::update_lead_field_value( $this->form, $this->entry, $field, $lead_detail_id, $input_id, $empty_value );
373
374
			    // Prevent the $_POST values of hidden fields from being used as default values when rendering the form
375
                // after submission
376
			    $post_input_id = 'input_' . str_replace( '.', '_', $input_id );
377 2
			    $_POST[ $post_input_id ] = '';
378
		    }
379
	    }
380 2
    }
381
382
    /**
383
     * Have GF handle file uploads
384
     *
385
     * Copy of code from GFFormDisplay::process_form()
386
     *
387
     * @param int $form_id
388
     */
389 2
    private function process_save_process_files( $form_id ) {
390
391
        //Loading files that have been uploaded to temp folder
392 2
        $files = GFCommon::json_decode( stripslashes( RGForms::post( 'gform_uploaded_files' ) ) );
393 2
        if ( ! is_array( $files ) ) {
394 2
            $files = array();
395
        }
396
397
		/**
398
		 * Make sure the fileuploads are not overwritten if no such request was done.
399
         * @since 1.20.1
400
		 */
401 2
		add_filter( "gform_save_field_value_$form_id", array( $this, 'save_field_value' ), 99, 5 );
402
403 2
        RGFormsModel::$uploaded_files[ $form_id ] = $files;
404 2
    }
405
406
	/**
407
	 * Make sure the fileuploads are not overwritten if no such request was done.
408
	 *
409
     * TO ONLY BE USED INTERNALLY; DO NOT DEVELOP ON; MAY BE REMOVED AT ANY TIME.
410
     *
411
	 * @since 1.20.1
412
	 *
413
	 * @param string $value Field value
414
	 * @param array $entry GF entry array
415
	 * @param GF_Field_FileUpload $field
416
	 * @param array $form GF form array
417
	 * @param string $input_id ID of the input being saved
418
	 *
419
	 * @return string
420
	 */
421 2
	public function save_field_value( $value = '', $entry = array(), $field = null, $form = array(), $input_id = '' ) {
422
423 2
		if ( ! $field || $field->type != 'fileupload' ) {
0 ignored issues
show
introduced by
Found "!= '". Use Yoda Condition checks, you must
Loading history...
424 2
			return $value;
425
		}
426
427 1
		$input_name = 'input_' . str_replace( '.', '_', $input_id );
428
429 1
		if ( $field->multipleFiles ) {
430
			if ( empty( $value ) ) {
431
				return json_decode( $entry[ $input_id ], true );
432
			}
433
			return $value;
434
		}
435
436
		/** No file is being uploaded. */
437 1
		if ( empty( $_FILES[ $input_name ]['name'] ) ) {
438
			/** So return the original upload */
439 1
			return $entry[ $input_id ];
440
		}
441
442 1
		return $value;
443
	}
444
445
    /**
446
     * Remove max_files validation (done on gravityforms.js) to avoid conflicts with GravityView
447
     * Late validation done on self::custom_validation
448
     *
449
     * @param $plupload_init array Plupload settings
450
     * @param $form_id
451
     * @param $instance
452
     * @return mixed
453
     */
454 1
    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...
455 1
        if( ! $this->is_edit_entry() ) {
456
            return $plupload_init;
457
        }
458
459 1
        $plupload_init['gf_vars']['max_files'] = 0;
460
461 1
        return $plupload_init;
462
    }
463
464
465
    /**
466
     * Unset adminOnly and convert field input key to string
467
     * @return array $form
468
     */
469 2
    private function form_prepare_for_save() {
470
471 2
        $form = $this->form;
472
473
	    /** @var GF_Field $field */
474 2
        foreach( $form['fields'] as $k => &$field ) {
475
476
            /**
477
             * Remove the fields with calculation formulas before save to avoid conflicts with GF logic
478
             * @since 1.16.3
479
             * @var GF_Field $field
480
             */
481 2
            if( $field->has_calculation() ) {
482
                unset( $form['fields'][ $k ] );
483
            }
484
485 2
            $field->adminOnly = false;
486
487 2
            if( isset( $field->inputs ) && is_array( $field->inputs ) ) {
488
                foreach( $field->inputs as $key => $input ) {
489 2
                    $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...
490
                }
491
            }
492
        }
493
494 2
        return $form;
495
    }
496
497 2
    private function update_calculation_fields() {
498
499 2
        $form = self::$original_form;
500 2
        $update = false;
501
502
        // get the most up to date entry values
503 2
        $entry = GFAPI::get_entry( $this->entry['id'] );
504
505 2
        if( !empty( $this->fields_with_calculation ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
506
            $update = true;
507
            foreach ( $this->fields_with_calculation as $calc_field ) {
508
                $inputs = $calc_field->get_entry_inputs();
509
                if ( is_array( $inputs ) ) {
510
                    foreach ( $inputs as $input ) {
511
                        $input_name = 'input_' . str_replace( '.', '_', $input['id'] );
512
                        $entry[ strval( $input['id'] ) ] = RGFormsModel::prepare_value( $form, $calc_field, '', $input_name, $entry['id'], $entry );
513
                    }
514
                } else {
515
                    $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...
516
                    $entry[ strval( $calc_field->id ) ] = RGFormsModel::prepare_value( $form, $calc_field, '', $input_name, $entry['id'], $entry );
517
                }
518
            }
519
520
        }
521
522 2
        if( $update ) {
523
524
            $return_entry = GFAPI::update_entry( $entry );
525
526
            if( is_wp_error( $return_entry ) ) {
527
                do_action( 'gravityview_log_error', 'Updating the entry calculation fields failed', $return_entry );
528
            } else {
529
                do_action( 'gravityview_log_debug', 'Updating the entry calculation fields succeeded' );
530
            }
531
        }
532 2
    }
533
534
    /**
535
     * Handle updating the Post Image field
536
     *
537
     * Sets a new Featured Image if configured in Gravity Forms; otherwise uploads/updates media
538
     *
539
     * @since 1.17
540
     *
541
     * @uses GFFormsModel::media_handle_upload
542
     * @uses set_post_thumbnail
543
     * 
544
     * @param array $form GF Form array
545
     * @param GF_Field $field GF Field
546
     * @param string $field_id Numeric ID of the field
547
     * @param string $value
548
     * @param array $entry GF Entry currently being edited
549
     * @param int $post_id ID of the Post being edited
550
     *
551
     * @return mixed|string
552
     */
553
    private function update_post_image( $form, $field, $field_id, $value, $entry, $post_id ) {
554
555
        $input_name = 'input_' . $field_id;
556
557
        if ( !empty( $_FILES[ $input_name ]['name'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
558
559
            // We have a new image
560
561
            $value = RGFormsModel::prepare_value( $form, $field, $value, $input_name, $entry['id'] );
562
563
            $ary = ! empty( $value ) ? explode( '|:|', $value ) : array();
564
            $img_url = rgar( $ary, 0 );
565
566
            $img_title       = count( $ary ) > 1 ? $ary[1] : '';
567
            $img_caption     = count( $ary ) > 2 ? $ary[2] : '';
568
            $img_description = count( $ary ) > 3 ? $ary[3] : '';
569
570
            $image_meta = array(
571
                'post_excerpt' => $img_caption,
572
                'post_content' => $img_description,
573
            );
574
575
            //adding title only if it is not empty. It will default to the file name if it is not in the array
576
            if ( ! empty( $img_title ) ) {
577
                $image_meta['post_title'] = $img_title;
578
            }
579
580
            /**
581
             * 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.
582
             * Note: the method became public in GF 1.9.17.7, but we don't require that version yet.
583
             */
584
            require_once GRAVITYVIEW_DIR . 'includes/class-gravityview-gfformsmodel.php';
585
            $media_id = GravityView_GFFormsModel::media_handle_upload( $img_url, $post_id, $image_meta );
586
587
            // is this field set as featured image?
588
            if ( $media_id && $field->postFeaturedImage ) {
589
                set_post_thumbnail( $post_id, $media_id );
590
            }
591
592
        } elseif ( !empty( $_POST[ $input_name ] ) && is_array( $value ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
593
594
            // Same image although the image title, caption or description might have changed
595
596
            $ary = array();
597
            if( ! empty( $entry[ $field_id ] ) ) {
598
                $ary = is_array( $entry[ $field_id ] ) ? $entry[ $field_id ] : explode( '|:|', $entry[ $field_id ] );
599
            }
600
            $img_url = rgar( $ary, 0 );
601
602
            // is this really the same image or something went wrong ?
603
            if( $img_url === $_POST[ $input_name ] ) {
604
605
                $img_title       = rgar( $value, $field_id .'.1' );
606
                $img_caption     = rgar( $value, $field_id .'.4' );
607
                $img_description = rgar( $value, $field_id .'.7' );
608
609
                $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...
610
611
                if ( $field->postFeaturedImage ) {
612
613
                    $image_meta = array(
614
                        'ID' => get_post_thumbnail_id( $post_id ),
615
                        'post_title' => $img_title,
616
                        'post_excerpt' => $img_caption,
617
                        'post_content' => $img_description,
618
                    );
619
620
                    // update image title, caption or description
621
                    wp_update_post( $image_meta );
622
                }
623
            }
624
625
        } else {
626
627
            // if we get here, image was removed or not set.
628
            $value = '';
629
630
            if ( $field->postFeaturedImage ) {
631
                delete_post_thumbnail( $post_id );
632
            }
633
        }
634
635
        return $value;
636
    }
637
638
    /**
639
     * Loop through the fields being edited and if they include Post fields, update the Entry's post object
640
     *
641
     * @param array $form Gravity Forms form
642
     *
643
     * @return void
644
     */
645 2
    private function maybe_update_post_fields( $form ) {
646
647 2
        if( empty( $this->entry['post_id'] ) ) {
648 2
	        do_action( 'gravityview_log_debug', __METHOD__ . ': This entry has no post fields. Continuing...' );
649 2
            return;
650
        }
651
652
        $post_id = $this->entry['post_id'];
653
654
        // Security check
655
        if( false === GVCommon::has_cap( 'edit_post', $post_id ) ) {
656
            do_action( 'gravityview_log_error', 'The current user does not have the ability to edit Post #'.$post_id );
657
            return;
658
        }
659
660
        $update_entry = false;
661
662
        $updated_post = $original_post = get_post( $post_id );
663
664
        foreach ( $this->entry as $field_id => $value ) {
665
666
            $field = RGFormsModel::get_field( $form, $field_id );
667
668
            if( ! $field ) {
669
                continue;
670
            }
671
672
            if( GFCommon::is_post_field( $field ) && 'post_category' !== $field->type ) {
673
674
                // Get the value of the field, including $_POSTed value
675
                $value = RGFormsModel::get_field_value( $field );
676
677
                // Use temporary entry variable, to make values available to fill_post_template() and update_post_image()
678
                $entry_tmp = $this->entry;
679
                $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...
680
681
                switch( $field->type ) {
682
683
                    case 'post_title':
684
                        $post_title = $value;
685
                        if( rgar( $form, 'postTitleTemplateEnabled' ) ) {
686
                            $post_title = $this->fill_post_template( $form['postTitleTemplate'], $form, $entry_tmp );
687
                        }
688
                        $updated_post->post_title = $post_title;
689
                        $updated_post->post_name  = $post_title;
690
                        unset( $post_title );
691
                        break;
692
693
                    case 'post_content':
694
                        $post_content = $value;
695
                        if( rgar( $form, 'postContentTemplateEnabled' ) ) {
696
                            $post_content = $this->fill_post_template( $form['postContentTemplate'], $form, $entry_tmp, true );
697
                        }
698
                        $updated_post->post_content = $post_content;
699
                        unset( $post_content );
700
                        break;
701
                    case 'post_excerpt':
702
                        $updated_post->post_excerpt = $value;
703
                        break;
704
                    case 'post_tags':
705
                        wp_set_post_tags( $post_id, $value, false );
706
                        break;
707
                    case 'post_category':
708
                        break;
709
                    case 'post_custom_field':
710
                        if( ! empty( $field->customFieldTemplateEnabled ) ) {
711
                            $value = $this->fill_post_template( $field->customFieldTemplate, $form, $entry_tmp, true );
712
                        }
713
714
	                    if ( $this->is_field_json_encoded( $field ) && ! is_string( $value ) ) {
715
		                    $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...
716
	                    }
717
718
                        update_post_meta( $post_id, $field->postCustomFieldName, $value );
719
                        break;
720
721
                    case 'post_image':
722
                        $value = $this->update_post_image( $form, $field, $field_id, $value, $this->entry, $post_id );
723
                        break;
724
725
                }
726
727
                // update entry after
728
                $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...
729
730
                $update_entry = true;
731
732
                unset( $entry_tmp );
733
            }
734
735
        }
736
737
        if( $update_entry ) {
738
739
            $return_entry = GFAPI::update_entry( $this->entry );
740
741
            if( is_wp_error( $return_entry ) ) {
742
               do_action( 'gravityview_log_error', 'Updating the entry post fields failed', array( '$this->entry' => $this->entry, '$return_entry' => $return_entry ) );
743
            } else {
744
                do_action( 'gravityview_log_debug', 'Updating the entry post fields for post #'.$post_id.' succeeded' );
745
            }
746
747
        }
748
749
        $return_post = wp_update_post( $updated_post, true );
750
751
        if( is_wp_error( $return_post ) ) {
752
            $return_post->add_data( $updated_post, '$updated_post' );
753
            do_action( 'gravityview_log_error', 'Updating the post content failed', compact( 'updated_post', 'return_post' ) );
754
        } else {
755
            do_action( 'gravityview_log_debug', 'Updating the post content for post #'.$post_id.' succeeded', $updated_post );
756
        }
757
    }
758
759
	/**
760
     * Is the field stored in a JSON-encoded manner?
761
     *
762
	 * @param GF_Field $field
763
	 *
764
	 * @return bool True: stored in DB json_encode()'d; False: not encoded
765
	 */
766
    private function is_field_json_encoded( $field ) {
767
768
	    $json_encoded = false;
769
770
        $input_type = RGFormsModel::get_input_type( $field );
771
772
	    // Only certain custom field types are supported
773
	    switch( $input_type ) {
774
		    case 'fileupload':
775
		    case 'list':
776
		    case 'multiselect':
777
			    $json_encoded = true;
778
			    break;
779
	    }
780
781
	    return $json_encoded;
782
    }
783
784
    /**
785
     * Convert a field content template into prepared output
786
     *
787
     * @uses GravityView_GFFormsModel::get_post_field_images()
788
     *
789
     * @since 1.17
790
     *
791
     * @param string $template The content template for the field
792
     * @param array $form Gravity Forms form
793
     * @param bool $do_shortcode Whether to process shortcode inside content. In GF, only run on Custom Field and Post Content fields
794
     *
795
     * @return string
796
     */
797
    private function fill_post_template( $template, $form, $entry, $do_shortcode = false ) {
798
799
        require_once GRAVITYVIEW_DIR . 'includes/class-gravityview-gfformsmodel.php';
800
801
        $post_images = GravityView_GFFormsModel::get_post_field_images( $form, $entry );
802
803
        //replacing post image variables
804
        $output = GFCommon::replace_variables_post_image( $template, $post_images, $entry );
805
806
        //replacing all other variables
807
        $output = GFCommon::replace_variables( $output, $form, $entry, false, false, false );
808
809
        // replace conditional shortcodes
810
        if( $do_shortcode ) {
811
            $output = do_shortcode( $output );
812
        }
813
814
        return $output;
815
    }
816
817
818
    /**
819
     * Perform actions normally performed after updating a lead
820
     *
821
     * @since 1.8
822
     *
823
     * @see GFEntryDetail::lead_detail_page()
824
     *
825
     * @return void
826
     */
827 2
    private function after_update() {
828
829 2
        do_action( 'gform_after_update_entry', $this->form, $this->entry['id'], self::$original_entry );
830 2
        do_action( "gform_after_update_entry_{$this->form['id']}", $this->form, $this->entry['id'], self::$original_entry );
831
832
        // Re-define the entry now that we've updated it.
833 2
        $entry = RGFormsModel::get_lead( $this->entry['id'] );
834
835 2
        $entry = GFFormsModel::set_entry_meta( $entry, $this->form );
836
837
        // We need to clear the cache because Gravity Forms caches the field values, which
838
        // we have just updated.
839 2
        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...
840 2
            GFFormsModel::refresh_lead_field_value( $entry['id'], $field->id );
841
        }
842
843 2
        $this->entry = $entry;
844 2
    }
845
846
847
    /**
848
     * Display the Edit Entry form
849
     *
850
     * @return void
851
     */
852 2
    public function edit_entry_form() {
853
854
        ?>
855
856
        <div class="gv-edit-entry-wrapper"><?php
857
858 2
            $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...
859
860
            /**
861
             * Fixes weird wpautop() issue
862
             * @see https://github.com/katzwebservices/GravityView/issues/451
863
             */
864 2
            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...
865
866
            ?><h2 class="gv-edit-entry-title">
867
                <span><?php
868
869
                    /**
870
                     * @filter `gravityview_edit_entry_title` Modify the edit entry title
871
                     * @param string $edit_entry_title Modify the "Edit Entry" title
872
                     * @param GravityView_Edit_Entry_Render $this This object
873
                     */
874 2
                    $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...
875
876 2
                    echo esc_attr( $edit_entry_title );
877
            ?></span>
878
            </h2>
879
880
            <?php $this->maybe_print_message(); ?>
881
882
            <?php // The ID of the form needs to be `gform_{form_id}` for the pluploader ?>
883
884
            <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...
885
886
                <?php
887
888 2
                wp_nonce_field( self::$nonce_key, self::$nonce_key );
889
890 2
                wp_nonce_field( self::$nonce_field, self::$nonce_field, false );
891
892
                // Print the actual form HTML
893 2
                $this->render_edit_form();
894
895
                ?>
896
            </form>
897
898
            <script>
899
                gform.addFilter('gform_reset_pre_conditional_logic_field_action', function ( reset, formId, targetId, defaultValues, isInit ) {
900
                    return false;
901
                });
902
            </script>
903
904
        </div>
905
906
    <?php
907 2
    }
908
909
    /**
910
     * Display success or error message if the form has been submitted
911
     *
912
     * @uses GVCommon::generate_notice
913
     *
914
     * @since 1.16.2.2
915
     *
916
     * @return void
917
     */
918 2
    private function maybe_print_message() {
919
920 2
        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...
921
922
            $back_link = esc_url( remove_query_arg( array( 'page', 'view', 'edit' ) ) );
923
924
            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...
925
926
                // Keeping this compatible with Gravity Forms.
927
                $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...
928
                $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...
929
930
                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...
931
932
            } else {
933
                $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...
934
935
                /**
936
                 * @filter `gravityview/edit_entry/success` Modify the edit entry success message (including the anchor link)
937
                 * @since 1.5.4
938
                 * @param string $entry_updated_message Existing message
939
                 * @param int $view_id View ID
940
                 * @param array $entry Gravity Forms entry array
941
                 * @param string $back_link URL to return to the original entry. @since 1.6
942
                 */
943
                $message = apply_filters( 'gravityview/edit_entry/success', $entry_updated_message , $this->view_id, $this->entry, $back_link );
944
945
                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...
946
            }
947
948
        }
949 2
    }
950
951
    /**
952
     * Display the Edit Entry form in the original Gravity Forms format
953
     *
954
     * @since 1.9
955
     *
956
     * @return void
957
     */
958 2
    private function render_edit_form() {
959
960
        /**
961
         * @action `gravityview/edit-entry/render/before` Before rendering the Edit Entry form
962
         * @since 1.17
963
         * @param GravityView_Edit_Entry_Render $this
964
         */
965 2
        do_action( 'gravityview/edit-entry/render/before', $this );
966
967 2
        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...
968 2
        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...
969 2
        add_filter( 'gform_disable_view_counter', '__return_true' );
970
971 2
        add_filter( 'gform_field_input', array( $this, 'verify_user_can_edit_post' ), 5, 5 );
972 2
        add_filter( 'gform_field_input', array( $this, 'modify_edit_field_input' ), 10, 5 );
973
974
        // We need to remove the fake $_GET['page'] arg to avoid rendering form as if in admin.
975 2
        unset( $_GET['page'] );
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
976
977
        // TODO: Verify multiple-page forms
978
979 2
        ob_start(); // Prevent PHP warnings possibly caused by prefilling list fields for conditional logic
980
981 2
        $html = GFFormDisplay::get_form( $this->form['id'], false, false, true, $this->entry );
982
983 2
        ob_get_clean();
984
985 2
	    remove_filter( 'gform_pre_render', array( $this, 'filter_modify_form_fields' ), 5000 );
986 2
        remove_filter( 'gform_submit_button', array( $this, 'render_form_buttons' ) );
987 2
        remove_filter( 'gform_disable_view_counter', '__return_true' );
988 2
        remove_filter( 'gform_field_input', array( $this, 'verify_user_can_edit_post' ), 5 );
989 2
        remove_filter( 'gform_field_input', array( $this, 'modify_edit_field_input' ), 10 );
990
991 2
        echo $html;
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$html'
Loading history...
992
993
        /**
994
         * @action `gravityview/edit-entry/render/after` After rendering the Edit Entry form
995
         * @since 1.17
996
         * @param GravityView_Edit_Entry_Render $this
997
         */
998 2
        do_action( 'gravityview/edit-entry/render/after', $this );
999 2
    }
1000
1001
    /**
1002
     * Display the Update/Cancel/Delete buttons for the Edit Entry form
1003
     * @since 1.8
1004
     * @return string
1005
     */
1006 2
    public function render_form_buttons() {
1007 2
        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...
1008
    }
1009
1010
1011
    /**
1012
     * Modify the form fields that are shown when using GFFormDisplay::get_form()
1013
     *
1014
     * By default, all fields will be shown. We only want the Edit Tab configured fields to be shown.
1015
     *
1016
     * @param array $form
1017
     * @param boolean $ajax Whether in AJAX mode
1018
     * @param array|string $field_values Passed parameters to the form
1019
     *
1020
     * @since 1.9
1021
     *
1022
     * @return array Modified form array
1023
     */
1024 2
    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...
1025
1026
        // In case we have validated the form, use it to inject the validation results into the form render
1027 2
        if( isset( $this->form_after_validation ) ) {
1028 2
            $form = $this->form_after_validation;
1029
        } else {
1030 2
            $form['fields'] = $this->get_configured_edit_fields( $form, $this->view_id );
1031
        }
1032
1033 2
        $form = $this->filter_conditional_logic( $form );
1034
1035 2
        $form = $this->prefill_conditional_logic( $form );
1036
1037
        // for now we don't support Save and Continue feature.
1038 2
        if( ! self::$supports_save_and_continue ) {
1039 2
	        unset( $form['save'] );
1040
        }
1041
1042 2
        return $form;
1043
    }
1044
1045
    /**
1046
     * 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.
1047
     *
1048
     * @since 1.16.2.2
1049
     *
1050
     * @param string $field_content Always empty. Returning not-empty overrides the input.
1051
     * @param GF_Field $field
1052
     * @param string|array $value If array, it's a field with multiple inputs. If string, single input.
1053
     * @param int $lead_id Lead ID. Always 0 for the `gform_field_input` filter.
1054
     * @param int $form_id Form ID
1055
     *
1056
     * @return string If error, the error message. If no error, blank string (modify_edit_field_input() runs next)
1057
     */
1058 2
    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...
1059
1060 2
        if( GFCommon::is_post_field( $field ) ) {
1061
1062
            $message = null;
1063
1064
            // First, make sure they have the capability to edit the post.
1065
            if( false === current_user_can( 'edit_post', $this->entry['post_id'] ) ) {
1066
1067
                /**
1068
                 * @filter `gravityview/edit_entry/unsupported_post_field_text` Modify the message when someone isn't able to edit a post
1069
                 * @param string $message The existing "You don't have permission..." text
1070
                 */
1071
                $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...
1072
1073
            } elseif( null === get_post( $this->entry['post_id'] ) ) {
1074
                /**
1075
                 * @filter `gravityview/edit_entry/no_post_text` Modify the message when someone is editing an entry attached to a post that no longer exists
1076
                 * @param string $message The existing "This field is not editable; the post no longer exists." text
1077
                 */
1078
                $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...
1079
            }
1080
1081
            if( $message ) {
1082
                $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...
1083
            }
1084
        }
1085
1086 2
        return $field_content;
1087
    }
1088
1089
    /**
1090
     *
1091
     * Fill-in the saved values into the form inputs
1092
     *
1093
     * @param string $field_content Always empty. Returning not-empty overrides the input.
1094
     * @param GF_Field $field
1095
     * @param string|array $value If array, it's a field with multiple inputs. If string, single input.
1096
     * @param int $lead_id Lead ID. Always 0 for the `gform_field_input` filter.
1097
     * @param int $form_id Form ID
1098
     *
1099
     * @return mixed
1100
     */
1101 2
    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 $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...
1102
1103 2
        $gv_field = GravityView_Fields::get_associated_field( $field );
1104
1105
        // If the form has been submitted, then we don't need to pre-fill the values,
1106
        // Except for fileupload type and when a field input is overridden- run always!!
1107
        if(
1108 2
            ( $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...
1109 2
            && false === ( $gv_field && is_callable( array( $gv_field, 'get_field_input' ) ) )
1110
            && ! GFCommon::is_product_field( $field->type )
1111 2
            || ! empty( $field_content )
1112 2
            || in_array( $field->type, array( 'honeypot' ) )
1113
        ) {
1114
	        return $field_content;
1115
        }
1116
1117
        // SET SOME FIELD DEFAULTS TO PREVENT ISSUES
1118 2
        $field->adminOnly = false; /** @see GFFormDisplay::get_counter_init_script() need to prevent adminOnly */
1119
1120 2
        $field_value = $this->get_field_value( $field );
1121
1122
	    // Prevent any PHP warnings, like undefined index
1123 2
	    ob_start();
1124
1125 2
	    $return = null;
1126
1127
        /** @var GravityView_Field $gv_field */
1128 2
        if( $gv_field && is_callable( array( $gv_field, 'get_field_input' ) ) ) {
1129 1
            $return = $gv_field->get_field_input( $this->form, $field_value, $this->entry, $field );
1130
        } else {
1131 2
	        $return = $field->get_field_input( $this->form, $field_value, $this->entry );
1132
	    }
1133
1134
	    // If there was output, it's an error
1135 2
	    $warnings = ob_get_clean();
1136
1137 2
	    if( !empty( $warnings ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1138
		    do_action( 'gravityview_log_error', __METHOD__ . $warnings, $field_value );
1139
	    }
1140
1141 2
        return $return;
1142
    }
1143
1144
    /**
1145
     * Modify the value for the current field input
1146
     *
1147
     * @param GF_Field $field
1148
     *
1149
     * @return array|mixed|string
1150
     */
1151 2
    private function get_field_value( $field ) {
1152
1153
        /**
1154
         * @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.
1155
         * @param boolean True: override saved values; False: don't override (default)
1156
         * @param $field GF_Field object Gravity Forms field object
1157
         * @since 1.13
1158
         */
1159 2
        $override_saved_value = apply_filters( 'gravityview/edit_entry/pre_populate/override', false, $field );
1160
1161
        // We're dealing with multiple inputs (e.g. checkbox) but not time or date (as it doesn't store data in input IDs)
1162 2
        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...
1163
1164
            $field_value = array();
1165
1166
            // only accept pre-populated values if the field doesn't have any choice selected.
1167
            $allow_pre_populated = $field->allowsPrepopulate;
1168
1169
            foreach ( (array)$field->inputs as $input ) {
0 ignored issues
show
introduced by
No space after closing casting parenthesis is prohibited
Loading history...
1170
1171
                $input_id = strval( $input['id'] );
1172
                
1173
                if ( isset( $this->entry[ $input_id ] ) && ! gv_empty( $this->entry[ $input_id ], false, false ) ) {
1174
                    $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...
1175
                    $allow_pre_populated = false;
1176
                }
1177
1178
            }
1179
1180
            $pre_value = $field->get_value_submission( array(), false );
1181
1182
            $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...
1183
1184
        } else {
1185
1186 2
            $id = intval( $field->id );
1187
1188
            // get pre-populated value if exists
1189 2
            $pre_value = $field->allowsPrepopulate ? GFFormsModel::get_parameter_value( $field->inputName, array(), $field ) : '';
1190
1191
            // saved field entry value (if empty, fallback to the pre-populated value, if exists)
1192
            // or pre-populated value if not empty and set to override saved value
1193 2
            $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...
1194
1195
            // in case field is post_category but inputType is select, multi-select or radio, convert value into array of category IDs.
1196 2
            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...
1197
                $categories = array();
1198
                foreach ( explode( ',', $field_value ) as $cat_string ) {
1199
                    $categories[] = GFCommon::format_post_category( $cat_string, true );
1200
                }
1201
                $field_value = 'multiselect' === $field->get_input_type() ? $categories : implode( '', $categories );
1202
            }
1203
1204
        }
1205
1206
        // if value is empty get the default value if defined
1207 2
        $field_value = $field->get_value_default_if_empty( $field_value );
1208
1209
	    /**
1210
	     * @filter `gravityview/edit_entry/field_value` Change the value of an Edit Entry field, if needed
1211
	     * @since 1.11
1212
	     * @since 1.20 Added third param
1213
	     * @param mixed $field_value field value used to populate the input
1214
	     * @param object $field Gravity Forms field object ( Class GF_Field )
1215
	     * @param GravityView_Edit_Entry_Render $this Current object
1216
	     */
1217 2
	    $field_value = apply_filters( 'gravityview/edit_entry/field_value', $field_value, $field, $this );
1218
1219
	    /**
1220
	     * @filter `gravityview/edit_entry/field_value_{field_type}` Change the value of an Edit Entry field for a specific field type
1221
	     * @since 1.17
1222
	     * @since 1.20 Added third param
1223
	     * @param mixed $field_value field value used to populate the input
1224
	     * @param GF_Field $field Gravity Forms field object
1225
	     * @param GravityView_Edit_Entry_Render $this Current object
1226
	     */
1227 2
	    $field_value = apply_filters( 'gravityview/edit_entry/field_value_' . $field->type , $field_value, $field, $this );
1228
1229 2
        return $field_value;
1230
    }
1231
1232
1233
    // ---- Entry validation
1234
1235
    /**
1236
     * Add field keys that Gravity Forms expects.
1237
     *
1238
     * @see GFFormDisplay::validate()
1239
     * @param  array $form GF Form
1240
     * @return array       Modified GF Form
1241
     */
1242 2
    public function gform_pre_validation( $form ) {
1243
1244 2
        if( ! $this->verify_nonce() ) {
1245
            return $form;
1246
        }
1247
1248
        // Fix PHP warning regarding undefined index.
1249 2
        foreach ( $form['fields'] as &$field) {
0 ignored issues
show
introduced by
No space before closing parenthesis is prohibited
Loading history...
1250
1251
            // This is because we're doing admin form pretending to be front-end, so Gravity Forms
1252
            // expects certain field array items to be set.
1253 2
            foreach ( array( 'noDuplicates', 'adminOnly', 'inputType', 'isRequired', 'enablePrice', 'inputs', 'allowedExtensions' ) as $key ) {
1254 2
	            $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...
1255
            }
1256
1257 2
            switch( RGFormsModel::get_input_type( $field ) ) {
1258
1259
                /**
1260
                 * 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.
1261
                 *
1262
                 * 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.
1263
                 *
1264
                 * @hack
1265
                 */
1266 2
                case 'fileupload':
1267
1268
                    // Set the previous value
1269 1
                    $entry = $this->get_entry();
1270
1271 1
                    $input_name = 'input_'.$field->id;
1272 1
                    $form_id = $form['id'];
1273
1274 1
                    $value = NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
1275
1276
                    // Use the previous entry value as the default.
1277 1
                    if( isset( $entry[ $field->id ] ) ) {
1278 1
                        $value = $entry[ $field->id ];
1279
                    }
1280
1281
                    // If this is a single upload file
1282 1
                    if( !empty( $_FILES[ $input_name ] ) && !empty( $_FILES[ $input_name ]['name'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1283 1
                        $file_path = GFFormsModel::get_file_upload_path( $form['id'], $_FILES[ $input_name ]['name'] );
1284 1
                        $value = $file_path['url'];
1285
1286
                    } else {
1287
1288
                        // Fix PHP warning on line 1498 of form_display.php for post_image fields
1289
                        // Fix PHP Notice:  Undefined index:  size in form_display.php on line 1511
1290 1
                        $_FILES[ $input_name ] = array('name' => '', 'size' => '' );
0 ignored issues
show
introduced by
No space after opening parenthesis of array is bad style
Loading history...
1291
1292
                    }
1293
1294 1
                    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...
1295
1296
                        // If there are fresh uploads, process and merge them.
1297
                        // Otherwise, use the passed values, which should be json-encoded array of URLs
1298 1
                        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...
1299
                            $value = empty( $value ) ? '[]' : $value;
1300
                            $value = stripslashes_deep( $value );
1301 1
                            $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...
1302
                        }
1303
1304
                    } else {
1305
1306
                        // A file already exists when editing an entry
1307
                        // We set this to solve issue when file upload fields are required.
1308 1
                        GFFormsModel::$uploaded_files[ $form_id ][ $input_name ] = $value;
1309
1310
                    }
1311
1312 1
                    $this->entry[ $input_name ] = $value;
1313 1
                    $_POST[ $input_name ] = $value;
1314
1315 1
                    break;
1316
1317 2
                case 'number':
1318
                    // Fix "undefined index" issue at line 1286 in form_display.php
1319 1
                    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...
1320
                        $_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...
1321
                    }
1322 2
                    break;
1323
            }
1324
1325
        }
1326
1327 2
        return $form;
1328
    }
1329
1330
1331
    /**
1332
     * Process validation for a edit entry submission
1333
     *
1334
     * Sets the `is_valid` object var
1335
     *
1336
     * @return void
1337
     */
1338 3
    private function validate() {
1339
1340
        /**
1341
         * If using GF User Registration Add-on, remove the validation step, otherwise generates error when updating the entry
1342
         * GF User Registration Add-on version > 3.x has a different class name
1343
         * @since 1.16.2
1344
         */
1345 3
        if ( class_exists( 'GF_User_Registration' ) ) {
1346 3
            remove_filter( 'gform_validation', array( GF_User_Registration::get_instance(), 'validate' ) );
1347
        } else  if ( class_exists( 'GFUser' ) ) {
1348
            remove_filter( 'gform_validation', array( 'GFUser', 'user_registration_validation' ) );
1349
        }
1350
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
1351
1352
        /**
1353
         * For some crazy reason, Gravity Forms doesn't validate Edit Entry form submissions.
1354
         * You can enter whatever you want!
1355
         * We try validating, and customize the results using `self::custom_validation()`
1356
         */
1357 3
        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...
1358
1359
        // Needed by the validate funtion
1360 3
        $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...
1361 3
        $field_values = RGForms::post( 'gform_field_values' );
1362
1363
        // Prevent entry limit from running when editing an entry, also
1364
        // prevent form scheduling from preventing editing
1365 3
        unset( $this->form['limitEntries'], $this->form['scheduleForm'] );
1366
1367
        // Hide fields depending on Edit Entry settings
1368 3
        $this->form['fields'] = $this->get_configured_edit_fields( $this->form, $this->view_id );
1369
1370 3
        $this->is_valid = GFFormDisplay::validate( $this->form, $field_values, 1, $failed_validation_page );
1371
1372 3
        remove_filter( 'gform_validation_'. $this->form_id, array( $this, 'custom_validation' ), 10 );
1373 3
    }
1374
1375
1376
    /**
1377
     * Make validation work for Edit Entry
1378
     *
1379
     * Because we're calling the GFFormDisplay::validate() in an unusual way (as a front-end
1380
     * form pretending to be a back-end form), validate() doesn't know we _can't_ edit post
1381
     * fields. This goes through all the fields and if they're an invalid post field, we
1382
     * set them as valid. If there are still issues, we'll return false.
1383
     *
1384
     * @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...
1385
     * @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...
1386
     */
1387 3
    public function custom_validation( $validation_results ) {
1388
1389 3
        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...
1390
1391 3
        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...
1392
1393 3
        $gv_valid = true;
1394
1395 3
        foreach ( $validation_results['form']['fields'] as $key => &$field ) {
1396
1397 3
            $value = RGFormsModel::get_field_value( $field );
1398 3
            $field_type = RGFormsModel::get_input_type( $field );
1399
1400
            // Validate always
1401
            switch ( $field_type ) {
1402
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
1403
1404 3
                case 'fileupload' :
1405 3
                case 'post_image':
1406
1407
                    // in case nothing is uploaded but there are already files saved
1408 1
                    if( !empty( $field->failed_validation ) && !empty( $field->isRequired ) && !empty( $value ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1409
                        $field->failed_validation = false;
1410
                        unset( $field->validation_message );
1411
                    }
1412
1413
                    // validate if multi file upload reached max number of files [maxFiles] => 2
1414 1
                    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...
1415
1416
                        $input_name = 'input_' . $field->id;
1417
                        //uploaded
1418
                        $file_names = isset( GFFormsModel::$uploaded_files[ $validation_results['form']['id'] ][ $input_name ] ) ? GFFormsModel::$uploaded_files[ $validation_results['form']['id'] ][ $input_name ] : array();
1419
1420
                        //existent
1421
                        $entry = $this->get_entry();
1422
                        $value = NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
1423
                        if( isset( $entry[ $field->id ] ) ) {
1424
                            $value = json_decode( $entry[ $field->id ], true );
1425
                        }
1426
1427
                        // count uploaded files and existent entry files
1428
                        $count_files = count( $file_names ) + count( $value );
1429
1430
                        if( $count_files > $field->maxFiles ) {
1431
                            $field->validation_message = __( 'Maximum number of files reached', 'gravityview' );
1432
                            $field->failed_validation = 1;
1433
                            $gv_valid = false;
1434
1435
                            // in case of error make sure the newest upload files are removed from the upload input
1436
                            GFFormsModel::$uploaded_files[ $validation_results['form']['id'] ] = null;
1437
                        }
1438
1439
                    }
1440
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
1441
1442 1
                    break;
1443
1444
            }
1445
1446
            // This field has failed validation.
1447 3
            if( !empty( $field->failed_validation ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1448
1449 1
                do_action( 'gravityview_log_debug', 'GravityView_Edit_Entry[custom_validation] Field is invalid.', array( 'field' => $field, 'value' => $value ) );
1450
1451
                switch ( $field_type ) {
1452
1453
                    // Captchas don't need to be re-entered.
1454 1
                    case 'captcha':
1455
1456
                        // Post Image fields aren't editable, so we un-fail them.
1457 1
                    case 'post_image':
1458
                        $field->failed_validation = false;
1459
                        unset( $field->validation_message );
1460
                        break;
1461
1462
                }
1463
1464
                // You can't continue inside a switch, so we do it after.
1465 1
                if( empty( $field->failed_validation ) ) {
1466
                    continue;
1467
                }
1468
1469
                // checks if the No Duplicates option is not validating entry against itself, since
1470
                // we're editing a stored entry, it would also assume it's a duplicate.
1471 1
                if( !empty( $field->noDuplicates ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1472
1473
                    $entry = $this->get_entry();
1474
1475
                    // If the value of the entry is the same as the stored value
1476
                    // Then we can assume it's not a duplicate, it's the same.
1477
                    if( !empty( $entry ) && $value == $entry[ $field->id ] ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1478
                        //if value submitted was not changed, then don't validate
1479
                        $field->failed_validation = false;
1480
1481
                        unset( $field->validation_message );
1482
1483
                        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...
1484
1485
                        continue;
1486
                    }
1487
                }
1488
1489
                // if here then probably we are facing the validation 'At least one field must be filled out'
1490 1
                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...
1491
                    unset( $field->validation_message );
1492
	                $field->validation_message = false;
1493
                    continue;
1494
                }
1495
1496 3
                $gv_valid = false;
1497
1498
            }
1499
1500
        }
1501
1502 3
        $validation_results['is_valid'] = $gv_valid;
1503
1504 3
        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...
1505
1506
        // We'll need this result when rendering the form ( on GFFormDisplay::get_form )
1507 3
        $this->form_after_validation = $validation_results['form'];
1508
1509 3
        return $validation_results;
1510
    }
1511
1512
1513
    /**
1514
     * TODO: This seems to be hacky... we should remove it. Entry is set when updating the form using setup_vars()!
1515
     * Get the current entry and set it if it's not yet set.
1516
     * @return array Gravity Forms entry array
1517
     */
1518 1
    public function get_entry() {
1519
1520 1
        if( empty( $this->entry ) ) {
1521
            // Get the database value of the entry that's being edited
1522 1
            $this->entry = gravityview_get_entry( GravityView_frontend::is_single_entry() );
1523
        }
1524
1525 1
        return $this->entry;
1526
    }
1527
1528
1529
1530
    // --- Filters
1531
1532
    /**
1533
     * Get the Edit Entry fields as configured in the View
1534
     *
1535
     * @since 1.8
1536
     *
1537
     * @param int $view_id
1538
     *
1539
     * @return array Array of fields that are configured in the Edit tab in the Admin
1540
     */
1541 3
    private function get_configured_edit_fields( $form, $view_id ) {
1542
1543
        // Get all fields for form
1544 3
        $properties = GravityView_View_Data::getInstance()->get_fields( $view_id );
1545
1546
        // If edit tab not yet configured, show all fields
1547 3
        $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...
1548
1549
        // Hide fields depending on admin settings
1550 3
        $fields = $this->filter_fields( $form['fields'], $edit_fields );
1551
1552
	    // If Edit Entry fields are configured, remove adminOnly field settings. Otherwise, don't.
1553 3
	    $fields = $this->filter_admin_only_fields( $fields, $edit_fields, $form, $view_id );
1554
1555
        /**
1556
         * @filter `gravityview/edit_entry/form_fields` Modify the fields displayed in Edit Entry form
1557
         * @since 1.17
1558
         * @param GF_Field[] $fields Gravity Forms form fields
1559
         * @param array|null $edit_fields Fields for the Edit Entry tab configured in the View Configuration
1560
         * @param array $form GF Form array (`fields` key modified to have only fields configured to show in Edit Entry)
1561
         * @param int $view_id View ID
1562
         */
1563 3
        $fields = apply_filters( 'gravityview/edit_entry/form_fields', $fields, $edit_fields, $form, $view_id );
1564
1565 3
        return $fields;
1566
    }
1567
1568
1569
    /**
1570
     * Filter area fields based on specified conditions
1571
     *  - This filter removes the fields that have calculation configured
1572
     *
1573
     * @uses GravityView_Edit_Entry::user_can_edit_field() Check caps
1574
     * @access private
1575
     * @param GF_Field[] $fields
1576
     * @param array $configured_fields
1577
     * @since  1.5
1578
     * @return array $fields
1579
     */
1580 2
    private function filter_fields( $fields, $configured_fields ) {
1581
1582 2
        if( empty( $fields ) || !is_array( $fields ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1583
            return $fields;
1584
        }
1585
1586 2
        $edit_fields = array();
1587
1588 2
        $field_type_blacklist = $this->loader->get_field_blacklist( $this->entry );
1589
1590
        // First, remove blacklist or calculation fields
1591 2
        foreach ( $fields as $key => $field ) {
1592
1593
            // Remove the fields that have calculation properties and keep them to be used later
1594
            // @since 1.16.2
1595 2
            if( $field->has_calculation() ) {
1596
                $this->fields_with_calculation[] = $field;
1597
                // don't remove the calculation fields on form render.
1598
            }
1599
1600 2
            if( in_array( $field->type, $field_type_blacklist ) ) {
1601 2
                unset( $fields[ $key ] );
1602
            }
1603
        }
1604
1605
        // The Edit tab has not been configured, so we return all fields by default.
1606 2
        if( empty( $configured_fields ) ) {
1607 2
            return $fields;
1608
        }
1609
1610
        // The edit tab has been configured, so we loop through to configured settings
1611
        foreach ( $configured_fields as $configured_field ) {
1612
1613
	        /** @var GF_Field $field */
1614
	        foreach ( $fields as $field ) {
1615
1616
                if( intval( $configured_field['id'] ) === intval( $field->id ) && $this->user_can_edit_field( $configured_field, false ) ) {
1617
                    $edit_fields[] = $this->merge_field_properties( $field, $configured_field );
1618
                    break;
1619
                }
1620
1621
            }
1622
1623
        }
1624
1625
        return $edit_fields;
1626
1627
    }
1628
1629
    /**
1630
     * Override GF Form field properties with the ones defined on the View
1631
     * @param  GF_Field $field GF Form field object
1632
     * @param  array $field_setting  GV field options
1633
     * @since  1.5
1634
     * @return array|GF_Field
1635
     */
1636
    private function merge_field_properties( $field, $field_setting ) {
1637
1638
        $return_field = $field;
1639
1640
        if( empty( $field_setting['show_label'] ) ) {
1641
            $return_field->label = '';
1642
        } elseif ( !empty( $field_setting['custom_label'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1643
            $return_field->label = $field_setting['custom_label'];
1644
        }
1645
1646
        if( !empty( $field_setting['custom_class'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1647
            $return_field->cssClass .= ' '. gravityview_sanitize_html_class( $field_setting['custom_class'] );
1648
        }
1649
1650
        /**
1651
         * Normalize page numbers - avoid conflicts with page validation
1652
         * @since 1.6
1653
         */
1654
        $return_field->pageNumber = 1;
1655
1656
        return $return_field;
1657
1658
    }
1659
1660
    /**
1661
     * Remove fields that shouldn't be visible based on the Gravity Forms adminOnly field property
1662
     *
1663
     * @since 1.9.1
1664
     *
1665
     * @param array|GF_Field[] $fields Gravity Forms form fields
1666
     * @param array|null $edit_fields Fields for the Edit Entry tab configured in the View Configuration
1667
     * @param array $form GF Form array
1668
     * @param int $view_id View ID
1669
     *
1670
     * @return array Possibly modified form array
1671
     */
1672 2
    private function filter_admin_only_fields( $fields = array(), $edit_fields = null, $form = array(), $view_id = 0 ) {
1673
1674
	    /**
1675
         * @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
1676
	     * If the Edit Entry tab is not configured, adminOnly fields will not be shown to non-administrators.
1677
	     * If the Edit Entry tab *is* configured, adminOnly fields will be shown to non-administrators, using the configured GV permissions
1678
	     * @since 1.9.1
1679
	     * @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.
1680
	     * @param array $form GF Form array
1681
	     * @param int $view_id View ID
1682
	     */
1683 2
	    $use_gf_adminonly_setting = apply_filters( 'gravityview/edit_entry/use_gf_admin_only_setting', empty( $edit_fields ), $form, $view_id );
1684
1685 2
	    if( $use_gf_adminonly_setting && false === GVCommon::has_cap( 'gravityforms_edit_entries', $this->entry['id'] ) ) {
1686
            foreach( $fields as $k => $field ) {
1687
                if( $field->adminOnly ) {
1688
                    unset( $fields[ $k ] );
1689
                }
1690
            }
1691
            return $fields;
1692
        }
1693
1694 2
	    foreach( $fields as &$field ) {
1695 2
		    $field->adminOnly = false;
1696
        }
1697
1698 2
        return $fields;
1699
    }
1700
1701
    // --- Conditional Logic
1702
1703
    /**
1704
     * Conditional logic isn't designed to work with forms that already have content. When switching input values,
1705
     * the dependent fields will be blank.
1706
     *
1707
     * Note: This is because GF populates a JavaScript variable with the input values. This is tough to filter at the input level;
1708
     * via the `gform_field_value` filter; it requires lots of legwork. Doing it at the form level is easier.
1709
     *
1710
     * @since 1.17.4
1711
     *
1712
     * @param array $form Gravity Forms array object
1713
     *
1714
     * @return array $form, modified to fix conditional
1715
     */
1716 2
    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...
1717
1718 2
        if( ! GFFormDisplay::has_conditional_logic( $form ) ) {
1719 2
            return $form;
1720
        }
1721
1722
        // Have Conditional Logic pre-fill fields as if the data were default values
1723
        /** @var GF_Field $field */
1724
        foreach ( $form['fields'] as &$field ) {
1725
1726
            if( 'checkbox' === $field->type ) {
1727
                foreach ( $field->get_entry_inputs() as $key => $input ) {
1728
                    $input_id = $input['id'];
1729
                    $choice = $field->choices[ $key ];
1730
                    $value = rgar( $this->entry, $input_id );
1731
                    $match = RGFormsModel::choice_value_match( $field, $choice, $value );
1732
                    if( $match ) {
1733
                        $field->choices[ $key ]['isSelected'] = true;
1734
                    }
1735
                }
1736
            } else {
1737
1738
                // We need to run through each field to set the default values
1739
                foreach ( $this->entry as $field_id => $field_value ) {
1740
1741
                    if( floatval( $field_id ) === floatval( $field->id ) ) {
1742
1743
                        if( 'list' === $field->type ) {
1744
                            $list_rows = maybe_unserialize( $field_value );
1745
1746
                            $list_field_value = array();
1747
                            foreach ( (array) $list_rows as $row ) {
1748
                                foreach ( (array) $row as $column ) {
1749
                                    $list_field_value[] = $column;
1750
                                }
1751
                            }
1752
1753
                            $field->defaultValue = serialize( $list_field_value );
1754
                        } else {
1755
                            $field->defaultValue = $field_value;
1756
                        }
1757
                    }
1758
                }
1759
            }
1760
        }
1761
1762
        return $form;
1763
    }
1764
1765
    /**
1766
     * Remove the conditional logic rules from the form button and the form fields, if needed.
1767
     *
1768
     * @todo Merge with caller method
1769
     * @since 1.9
1770
     *
1771
     * @param array $form Gravity Forms form
1772
     * @return array Modified form, if not using Conditional Logic
1773
     */
1774 2
    private function filter_conditional_logic( $form ) {
1775
1776
        /**
1777
         * @filter `gravityview/edit_entry/conditional_logic` Should the Edit Entry form use Gravity Forms conditional logic showing/hiding of fields?
1778
         * @since 1.9
1779
         * @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
1780
         * @param array $form Gravity Forms form
1781
         */
1782 2
        $use_conditional_logic = apply_filters( 'gravityview/edit_entry/conditional_logic', true, $form );
1783
1784 2
        if( $use_conditional_logic ) {
1785 2
            return $form;
1786
        }
1787
1788
        foreach( $form['fields'] as &$field ) {
1789
            /* @var GF_Field $field */
1790
            $field->conditionalLogic = null;
1791
        }
1792
1793
        unset( $form['button']['conditionalLogic'] );
1794
1795
        return $form;
1796
1797
    }
1798
1799
    /**
1800
     * Disable the Gravity Forms conditional logic script and features on the Edit Entry screen
1801
     *
1802
     * @since 1.9
1803
     *
1804
     * @param $has_conditional_logic
1805
     * @param $form
1806
     * @return mixed
1807
     */
1808 2
    public function manage_conditional_logic( $has_conditional_logic, $form ) {
1809
1810 2
        if( ! $this->is_edit_entry() ) {
1811
            return $has_conditional_logic;
1812
        }
1813
1814
	    /** @see GravityView_Edit_Entry_Render::filter_conditional_logic for filter documentation */
1815 2
        return apply_filters( 'gravityview/edit_entry/conditional_logic', $has_conditional_logic, $form );
1816
    }
1817
1818
1819
    // --- User checks and nonces
1820
1821
    /**
1822
     * Check if the user can edit the entry
1823
     *
1824
     * - Is the nonce valid?
1825
     * - Does the user have the right caps for the entry
1826
     * - Is the entry in the trash?
1827
     *
1828
     * @todo Move to GVCommon
1829
     *
1830
     * @param  boolean $echo Show error messages in the form?
1831
     * @return boolean        True: can edit form. False: nope.
1832
     */
1833 3
    private function user_can_edit_entry( $echo = false ) {
1834
1835 3
        $error = NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
1836
1837
        /**
1838
         *  1. Permalinks are turned off
1839
         *  2. There are two entries embedded using oEmbed
1840
         *  3. One of the entries has just been saved
1841
         */
1842 3
        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...
1843
1844
            $error = true;
1845
1846
        }
1847
1848 3
        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...
1849
1850
            $error = true;
1851
1852 3
        } elseif( ! $this->verify_nonce() ) {
1853
1854
            /**
1855
             * If the Entry is embedded, there may be two entries on the same page.
1856
             * If that's the case, and one is being edited, the other should fail gracefully and not display an error.
1857
             */
1858
            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...
1859
                $error = true;
1860
            } else {
1861
                $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...
1862
            }
1863
1864
        }
1865
1866 3
        if( ! GravityView_Edit_Entry::check_user_cap_edit_entry( $this->entry ) ) {
1867 1
            $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...
1868
        }
1869
1870 3
        if( $this->entry['status'] === 'trash' ) {
0 ignored issues
show
introduced by
Found "=== '". Use Yoda Condition checks, you must
Loading history...
1871
            $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...
1872
        }
1873
1874
        // No errors; everything's fine here!
1875 3
        if( empty( $error ) ) {
1876 3
            return true;
1877
        }
1878
1879 1
        if( $echo && $error !== true ) {
0 ignored issues
show
introduced by
Found "!== true". Use Yoda Condition checks, you must
Loading history...
1880
1881 1
	        $error = esc_html( $error );
1882
1883
	        /**
1884
	         * @since 1.9
1885
	         */
1886 1
	        if ( ! empty( $this->entry ) ) {
1887 1
		        $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...
1888
	        }
1889
1890 1
            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...
1891
        }
1892
1893 1
        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...
1894
1895 1
        return false;
1896
    }
1897
1898
1899
    /**
1900
     * Check whether a field is editable by the current user, and optionally display an error message
1901
     * @uses  GravityView_Edit_Entry->check_user_cap_edit_field() Check user capabilities
1902
     * @param  array  $field Field or field settings array
1903
     * @param  boolean $echo  Whether to show error message telling user they aren't allowed
1904
     * @return boolean         True: user can edit the current field; False: nope, they can't.
1905
     */
1906
    private function user_can_edit_field( $field, $echo = false ) {
1907
1908
        $error = NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
1909
1910
        if( ! $this->check_user_cap_edit_field( $field ) ) {
1911
            $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...
1912
        }
1913
1914
        // No errors; everything's fine here!
1915
        if( empty( $error ) ) {
1916
            return true;
1917
        }
1918
1919
        if( $echo ) {
1920
            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...
1921
        }
1922
1923
        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...
1924
1925
        return false;
1926
1927
    }
1928
1929
1930
    /**
1931
     * checks if user has permissions to edit a specific field
1932
     *
1933
     * Needs to be used combined with GravityView_Edit_Entry::user_can_edit_field for maximum security!!
1934
     *
1935
     * @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...
1936
     * @return bool
1937
     */
1938
    private function check_user_cap_edit_field( $field ) {
1939
1940
        // If they can edit any entries (as defined in Gravity Forms), we're good.
1941
        if( GVCommon::has_cap( array( 'gravityforms_edit_entries', 'gravityview_edit_others_entries' ) ) ) {
1942
            return true;
1943
        }
1944
1945
        $field_cap = isset( $field['allow_edit_cap'] ) ? $field['allow_edit_cap'] : false;
1946
1947
        // If the field has custom editing capaibilities set, check those
1948
        if( $field_cap ) {
1949
            return GVCommon::has_cap( $field['allow_edit_cap'] );
1950
        }
1951
1952
        return false;
1953
    }
1954
1955
1956
    /**
1957
     * Is the current nonce valid for editing the entry?
1958
     * @return boolean
1959
     */
1960 2
    public function verify_nonce() {
1961
1962
        // Verify form submitted for editing single
1963 2
        if( $this->is_edit_entry_submission() ) {
1964
            $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...
1965
        }
1966
1967
        // Verify
1968 2
        else if( ! $this->is_edit_entry() ) {
1969
            $valid = false;
1970
        }
1971
1972
        else {
1973 2
            $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...
1974
        }
1975
1976
        /**
1977
         * @filter `gravityview/edit_entry/verify_nonce` Override Edit Entry nonce validation. Return true to declare nonce valid.
1978
         * @since 1.13
1979
         * @param int|boolean $valid False if invalid; 1 or 2 when nonce was generated
1980
         * @param string $nonce_field Key used when validating submissions. Default: is_gv_edit_entry
1981
         */
1982 2
        $valid = apply_filters( 'gravityview/edit_entry/verify_nonce', $valid, self::$nonce_field );
1983
1984 2
        return $valid;
1985
    }
1986
1987
1988
1989
} //end class