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