1
|
|
|
<?php |
|
|
|
|
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* @since 1.2 |
5
|
|
|
*/ |
6
|
|
|
class GravityView_Change_Entry_Creator { |
7
|
|
|
|
8
|
|
|
function __construct() { |
|
|
|
|
9
|
|
|
|
10
|
|
|
/** |
11
|
|
|
* @since 1.5.1 |
12
|
|
|
*/ |
13
|
|
|
add_action('gform_user_registered', array( $this, 'assign_new_user_to_lead'), 10, 4 ); |
|
|
|
|
14
|
|
|
|
15
|
|
|
// ONLY ADMIN FROM HERE ON. |
16
|
|
|
if( !is_admin() ) { return; } |
|
|
|
|
17
|
|
|
|
18
|
|
|
/** |
19
|
|
|
* @filter `gravityview_disable_change_entry_creator` Disable the Change Entry Creator functionality |
20
|
|
|
* @since 1.7.4 |
21
|
|
|
* @param boolean $disable Disable the Change Entry Creator functionality. Default: false. |
22
|
|
|
*/ |
23
|
|
|
if( apply_filters('gravityview_disable_change_entry_creator', false ) ) { |
|
|
|
|
24
|
|
|
return; |
25
|
|
|
} |
26
|
|
|
|
27
|
|
|
/** |
28
|
|
|
* Use `init` to fix bbPress warning |
29
|
|
|
* @see https://bbpress.trac.wordpress.org/ticket/2309 |
30
|
|
|
*/ |
31
|
|
|
add_action('init', array( $this, 'load'), 100 ); |
|
|
|
|
32
|
|
|
|
33
|
|
|
add_action('plugins_loaded', array( $this, 'prevent_conflicts') ); |
|
|
|
|
34
|
|
|
|
35
|
|
|
} |
36
|
|
|
|
37
|
|
|
/** |
38
|
|
|
* When an user is created using the User Registration add-on, assign the entry to them |
39
|
|
|
* |
40
|
|
|
* @since 1.5.1 |
41
|
|
|
* @uses RGFormsModel::update_lead_property() Modify the entry `created_by` field |
42
|
|
|
* @param int $user_id WordPress User ID |
43
|
|
|
* @param array $config User registration feed configuration |
44
|
|
|
* @param array $entry GF Entry array |
45
|
|
|
* @param string $password User password |
46
|
|
|
* @return void |
47
|
|
|
*/ |
48
|
|
|
function assign_new_user_to_lead( $user_id, $config, $entry = array(), $password = '' ) { |
|
|
|
|
49
|
|
|
|
50
|
|
|
/** |
51
|
|
|
* Disable assigning the new user to the entry by returning false. |
52
|
|
|
* @param int $user_id WordPress User ID |
53
|
|
|
* @param array $config User registration feed configuration |
54
|
|
|
* @param array $entry GF Entry array |
55
|
|
|
*/ |
56
|
|
|
$assign_to_lead = apply_filters( 'gravityview_assign_new_user_to_entry', true, $user_id, $config, $entry ); |
57
|
|
|
|
58
|
|
|
// If filter returns false, do not process |
59
|
|
|
if( empty( $assign_to_lead ) ) { |
60
|
|
|
return; |
61
|
|
|
} |
62
|
|
|
|
63
|
|
|
// Update the entry. The `false` prevents checking Akismet; `true` disables the user updated hook from firing |
64
|
|
|
$result = RGFormsModel::update_lead_property( $entry['id'], 'created_by', $user_id, false, true ); |
65
|
|
|
|
66
|
|
|
if( empty( $result ) ) { |
67
|
|
|
$status = __('Error', 'gravityview'); |
|
|
|
|
68
|
|
|
} else { |
69
|
|
|
$status = __('Success', 'gravityview'); |
|
|
|
|
70
|
|
|
} |
71
|
|
|
|
72
|
|
|
$note = sprintf( _x('%s: Assigned User ID #%d as the entry creator.', 'First parameter: Success or error of the action. Second: User ID number', 'gravityview'), $status, $user_id ); |
|
|
|
|
73
|
|
|
|
74
|
|
|
do_action( 'gravityview_log_debug', 'GravityView_Change_Entry_Creator[assign_new_user_to_lead] - '.$note ); |
75
|
|
|
|
76
|
|
|
/** |
77
|
|
|
* @filter `gravityview_disable_change_entry_creator_note` Disable adding a note when changing the entry creator |
78
|
|
|
* @since 1.21.5 |
79
|
|
|
* @param boolean $disable Disable the Change Entry Creator note. Default: false. |
80
|
|
|
*/ |
81
|
|
|
if( apply_filters('gravityview_disable_change_entry_creator_note', false ) ) { |
|
|
|
|
82
|
|
|
return; |
83
|
|
|
} |
84
|
|
|
|
85
|
|
|
GravityView_Entry_Notes::add_note( $entry['id'], -1, 'GravityView', $note, 'gravityview' ); |
86
|
|
|
|
87
|
|
|
} |
88
|
|
|
|
89
|
|
|
/** |
90
|
|
|
* Disable previous functionality; use this one as the canonical. |
91
|
|
|
* @return void |
92
|
|
|
*/ |
93
|
|
|
function prevent_conflicts() { |
|
|
|
|
94
|
|
|
|
95
|
|
|
// Plugin that was provided here: |
96
|
|
|
// @link https://gravityview.co/support/documentation/201991205/ |
97
|
|
|
remove_action("gform_entry_info", 'gravityview_change_entry_creator_form', 10 ); |
|
|
|
|
98
|
|
|
remove_action("gform_after_update_entry", 'gravityview_update_entry_creator', 10 ); |
|
|
|
|
99
|
|
|
|
100
|
|
|
// Disable for Gravity Forms Add-ons 3.6.2 and lower |
101
|
|
|
if( class_exists( 'KWS_GF_Change_Lead_Creator' ) ) { |
102
|
|
|
|
103
|
|
|
$Old_Lead_Creator = new KWS_GF_Change_Lead_Creator; |
104
|
|
|
|
105
|
|
|
// Now, no validation is required in the methods; let's hook in. |
106
|
|
|
remove_action('admin_init', array( $Old_Lead_Creator, 'set_screen_mode' ) ); |
|
|
|
|
107
|
|
|
|
108
|
|
|
remove_action("gform_entry_info", array( $Old_Lead_Creator, 'add_select' ), 10 ); |
|
|
|
|
109
|
|
|
|
110
|
|
|
remove_action("gform_after_update_entry", array( $Old_Lead_Creator, 'update_entry_creator' ), 10 ); |
|
|
|
|
111
|
|
|
} |
112
|
|
|
|
113
|
|
|
} |
114
|
|
|
|
115
|
|
|
/** |
116
|
|
|
* @since 3.6.3 |
117
|
|
|
* @return void |
118
|
|
|
*/ |
119
|
|
|
function load() { |
|
|
|
|
120
|
|
|
|
121
|
|
|
// Does GF exist? |
122
|
|
|
if( !class_exists('GFCommon') ) { |
|
|
|
|
123
|
|
|
return; |
124
|
|
|
} |
125
|
|
|
|
126
|
|
|
// Can the user edit entries? |
127
|
|
|
if( ! GVCommon::has_cap( array( 'gravityforms_edit_entries', 'gravityview_edit_entries' ) ) ) { |
128
|
|
|
return; |
129
|
|
|
} |
130
|
|
|
|
131
|
|
|
// If screen mode isn't set, then we're in the wrong place. |
132
|
|
|
if( empty( $_REQUEST['screen_mode'] ) ) { |
|
|
|
|
133
|
|
|
return; |
134
|
|
|
} |
135
|
|
|
|
136
|
|
|
// Now, no validation is required in the methods; let's hook in. |
137
|
|
|
add_action('admin_init', array( &$this, 'set_screen_mode' ) ); |
|
|
|
|
138
|
|
|
|
139
|
|
|
add_action("gform_entry_info", array( &$this, 'add_select' ), 10, 2); |
|
|
|
|
140
|
|
|
|
141
|
|
|
add_action("gform_after_update_entry", array( &$this, 'update_entry_creator' ), 10, 2); |
|
|
|
|
142
|
|
|
|
143
|
|
|
} |
144
|
|
|
|
145
|
|
|
/** |
146
|
|
|
* Allows for edit links to work with a link instead of a form (GET instead of POST) |
147
|
|
|
* @return void |
148
|
|
|
*/ |
149
|
|
|
function set_screen_mode() { |
|
|
|
|
150
|
|
|
|
151
|
|
|
// If $_GET['screen_mode'] is set to edit, set $_POST value |
152
|
|
|
if( rgget('screen_mode') === 'edit' ) { |
|
|
|
|
153
|
|
|
$_POST["screen_mode"] = 'edit'; |
|
|
|
|
154
|
|
|
} |
155
|
|
|
|
156
|
|
|
} |
157
|
|
|
|
158
|
|
|
/** |
159
|
|
|
* When the entry creator is changed, add a note to the entry |
160
|
|
|
* @param array $form GF entry array |
161
|
|
|
* @param int $entry_id Entry ID |
162
|
|
|
* @return void |
163
|
|
|
*/ |
164
|
|
|
function update_entry_creator($form, $entry_id) { |
|
|
|
|
165
|
|
|
global $current_user; |
|
|
|
|
166
|
|
|
|
167
|
|
|
// Update the entry |
168
|
|
|
$created_by = absint( rgpost('created_by') ); |
|
|
|
|
169
|
|
|
|
170
|
|
|
RGFormsModel::update_lead_property( $entry_id, 'created_by', $created_by ); |
171
|
|
|
|
172
|
|
|
// If the creator has changed, let's add a note about who it used to be. |
173
|
|
|
$originally_created_by = rgpost('originally_created_by'); |
|
|
|
|
174
|
|
|
|
175
|
|
|
// If there's no owner and there didn't used to be, keep going |
176
|
|
|
if( empty( $originally_created_by ) && empty( $created_by ) ) { |
177
|
|
|
return; |
178
|
|
|
} |
179
|
|
|
|
180
|
|
|
// If the values have changed |
181
|
|
|
if( absint( $originally_created_by ) !== absint( $created_by ) ) { |
182
|
|
|
|
183
|
|
|
$user_data = get_userdata($current_user->ID); |
|
|
|
|
184
|
|
|
|
185
|
|
|
$user_format = _x('%s (ID #%d)', 'The name and the ID of users who initiated changes to entry ownership', 'gravityview'); |
|
|
|
|
186
|
|
|
|
187
|
|
|
$original_name = $created_by_name = esc_attr_x( 'No User', 'To show that the entry was unassigned from an actual user to no user.', 'gravityview'); |
|
|
|
|
188
|
|
|
|
189
|
|
|
if( !empty( $originally_created_by ) ) { |
|
|
|
|
190
|
|
|
$originally_created_by_user_data = get_userdata($originally_created_by); |
|
|
|
|
191
|
|
|
$original_name = sprintf( $user_format, $originally_created_by_user_data->display_name, $originally_created_by_user_data->ID ); |
192
|
|
|
} |
193
|
|
|
|
194
|
|
|
if( !empty( $created_by ) ) { |
|
|
|
|
195
|
|
|
$created_by_user_data = get_userdata($created_by); |
|
|
|
|
196
|
|
|
$created_by_name = sprintf( $user_format, $created_by_user_data->display_name, $created_by_user_data->ID ); |
197
|
|
|
} |
198
|
|
|
|
199
|
|
|
GravityView_Entry_Notes::add_note( $entry_id, $current_user->ID, $user_data->display_name, sprintf( __('Changed entry creator from %s to %s', 'gravityview'), $original_name, $created_by_name ), 'note' ); |
|
|
|
|
200
|
|
|
} |
201
|
|
|
|
202
|
|
|
} |
203
|
|
|
|
204
|
|
|
/** |
205
|
|
|
* Output the select to change the entry creator |
206
|
|
|
* @param int $form_id GF Form ID |
207
|
|
|
* @param array $entry GF entry array |
208
|
|
|
* @return void |
209
|
|
|
*/ |
210
|
|
|
function add_select($form_id, $entry ) { |
|
|
|
|
211
|
|
|
|
212
|
|
|
if( rgpost('screen_mode') !== 'edit' ) { |
|
|
|
|
213
|
|
|
return; |
214
|
|
|
} |
215
|
|
|
|
216
|
|
|
$created_by_id = rgar( $entry, 'created_by' ); |
217
|
|
|
|
218
|
|
|
$users = GVCommon::get_users( 'change_entry_creator' ); |
219
|
|
|
|
220
|
|
|
$is_created_by_in_users = wp_list_filter( $users, array( 'ID' => $created_by_id ) ); |
221
|
|
|
|
222
|
|
|
// Make sure that the entry creator is included in the users list. If not, add them. |
223
|
|
|
if ( ! empty( $created_by_id ) && empty( $is_created_by_in_users ) ) { |
224
|
|
|
|
225
|
|
|
if ( $created_by_user = GVCommon::get_users( 'change_entry_creator', array( 'include' => $created_by_id ) ) ) { |
226
|
|
|
$users = array_merge( $users, $created_by_user ); |
227
|
|
|
} |
228
|
|
|
} |
229
|
|
|
|
230
|
|
|
$output = '<label for="change_created_by">'; |
231
|
|
|
$output .= esc_html__('Change Entry Creator:', 'gravityview'); |
|
|
|
|
232
|
|
|
$output .= '</label>'; |
233
|
|
|
|
234
|
|
|
// If there are users who are not being shown, show a warning. |
235
|
|
|
// TODO: Use AJAX instead of <select> |
236
|
|
|
$count_users = count_users(); |
237
|
|
|
if( sizeof( $users ) < $count_users['total_users'] ) { |
238
|
|
|
$output .= '<p><i class="dashicons dashicons-warning"></i> ' . sprintf( esc_html__( 'The displayed list of users has been trimmed due to the large number of users. %sLearn how to remove this limit%s.', 'gravityview' ), '<a href="https://docs.gravityview.co/article/251-i-only-see-some-users-in-the-change-entry-creator-dropdown" rel="external">', '</a>' ) . '</p>'; |
239
|
|
|
} |
240
|
|
|
|
241
|
|
|
$output .= '<select name="created_by" id="change_created_by" class="widefat">'; |
242
|
|
|
$output .= '<option value="' . selected( $entry['created_by'], '0', false ) . '"> — '.esc_attr_x( 'No User', 'No user assigned to the entry', 'gravityview').' — </option>'; |
|
|
|
|
243
|
|
|
foreach($users as $user) { |
|
|
|
|
244
|
|
|
$output .= '<option value="'. $user->ID .'"'. selected( $entry['created_by'], $user->ID, false ).'>'.esc_attr( $user->display_name.' ('.$user->user_nicename.')' ).'</option>'; |
245
|
|
|
} |
246
|
|
|
$output .= '</select>'; |
247
|
|
|
$output .= '<input name="originally_created_by" value="'.esc_attr( $entry['created_by'] ).'" type="hidden" />'; |
248
|
|
|
|
249
|
|
|
unset( $is_created_by_in_users, $created_by_user, $users, $created_by_id, $count_users ); |
250
|
|
|
|
251
|
|
|
echo $output; |
|
|
|
|
252
|
|
|
} |
253
|
|
|
|
254
|
|
|
} |
255
|
|
|
|
256
|
|
|
new GravityView_Change_Entry_Creator; |
257
|
|
|
|
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.