Completed
Pull Request — develop (#1523)
by
unknown
29:02 queued 08:55
created

GravityView_Change_Entry_Creator   A

Complexity

Total Complexity 30

Size/Duplication

Total Lines 293
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 4

Test Coverage

Coverage 26.14%

Importance

Changes 0
Metric Value
dl 0
loc 293
ccs 23
cts 88
cp 0.2614
rs 10
c 0
b 0
f 0
wmc 30
lcom 0
cbo 4

9 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 34 3
A add_selectwoo_assets() 0 19 3
A assign_new_user_to_lead() 0 41 4
A prevent_conflicts() 0 8 1
A load() 0 25 4
A set_screen_mode() 0 12 3
B update_entry_creator() 0 39 6
A add_select() 0 29 4
A entry_creator_get_users() 0 27 2
1
<?php
2
3
/**
4
 * @since 1.2
5
 */
6
class GravityView_Change_Entry_Creator {
7
8 1
    function __construct() {
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...
9
10
    	/**
11
    	 * @since  1.5.1
12
    	 */
13 1
    	add_action('gform_user_registered', array( $this, 'assign_new_user_to_lead'), 10, 4 );
14
15
    	// ONLY ADMIN FROM HERE ON.
16 1
    	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
        // Enqueues SelectWoo script and style.
36
        add_action( 'admin_enqueue_scripts', array( $this, 'add_selectwoo_assets') );
37
38
        // Ajax callback to get users to change entry creator.
39
        add_action( 'wp_ajax_entry_creator_get_users', array( $this, 'entry_creator_get_users' ) );
40
41
    }
42
43
    /**
44
     * Enqueues SelectWoo script and style.
45
     *
46
     * @since  2.9.1
47
     *
48
     */
49
    function add_selectwoo_assets() {
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...
50
51
        $version      = GravityView_Plugin::version;
0 ignored issues
show
Deprecated Code introduced by
The constant GravityView_Plugin::version has been deprecated with message: Use \GV\Plugin::$version

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
52
        $script_debug = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
53
54
        wp_enqueue_script( 'gravityview-selectWoo', plugins_url( 'assets/lib/selectWoo/selectWoo.full.min.js', GRAVITYVIEW_FILE ), array(), $version );
55
        wp_enqueue_style( 'gravityview-selectWoo', plugins_url( 'assets/lib/selectWoo/selectWoo.min.css', GRAVITYVIEW_FILE ), array(), $version );
56
57
        wp_enqueue_script( 'gravityview_entry_creator', plugins_url( 'assets/js/admin-entry-creator' . $script_debug . '.js', GRAVITYVIEW_FILE ), array( 'gravityview-selectWoo' ), $version );
58
59
        wp_localize_script(
60
            'gravityview_entry_creator',
61
            'GVEntryCreator',
62
            array(
63
                'ajaxurl' => admin_url( 'admin-ajax.php' ),
64
                'action'  => 'entry_creator_get_users',
65
            ) 
66
        );
67
    }
68
69
    /**
70
     * Get users list for entry creator.
71
     *
72
     * @since  2.9.1
73
     *
74
     */
75
    function entry_creator_get_users() {
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...
76
77
        $post_var = wp_parse_args(
78
            wp_unslash( $_POST ),
79
            array(
80
                'q' => '',
81
                'gv_nonce' => '',
82
            )
83
        );
84
85
        if( !wp_verify_nonce( $post_var['gv_nonce'], 'gv_entry_creator' )) {
86
            die();
87
        }
88
89
        $search_string = $post_var['q'];
90
91
        $user_args = array(
92
            'search'         => $search_string . '*',
93
            'search_columns' => array( 'ID', 'user_login', 'user_email', 'user_nicename', 'display_name' ),
94
        );
95
96
        $users = GVCommon::get_users( 'change_entry_creator', $user_args );
97
98
        echo wp_send_json( $users, 200 );
99
100
        die();
101
    }
102
103
    /**
104
     * When an user is created using the User Registration add-on, assign the entry to them
105
     *
106
     * @since  1.5.1
107
     * @uses RGFormsModel::update_lead_property() Modify the entry `created_by` field
108
     * @param  int $user_id  WordPress User ID
109
     * @param  array $config   User registration feed configuration
110
     * @param  array  $entry     GF Entry array
111
     * @param  string $password User password
112
     * @return void
113
     */
114
    function assign_new_user_to_lead( $user_id, $config, $entry = array(), $password = '' ) {
0 ignored issues
show
Unused Code introduced by
The parameter $password 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...
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...
115
116
    	/**
117
    	 * Disable assigning the new user to the entry by returning false.
118
    	 * @param  int $user_id  WordPress User ID
119
	     * @param  array $config   User registration feed configuration
120
	     * @param  array  $entry     GF Entry array
121
    	 */
122
    	$assign_to_lead = apply_filters( 'gravityview_assign_new_user_to_entry', true, $user_id, $config, $entry );
123
124
    	// If filter returns false, do not process
125
    	if( empty( $assign_to_lead ) ) {
126
    		return;
127
    	}
128
129
    	// Update the entry. The `false` prevents checking Akismet; `true` disables the user updated hook from firing
130
    	$result = RGFormsModel::update_entry_property( (int) $entry['id'], 'created_by', (int) $user_id, false, true );
131
132
    	if ( false === $result ) {
133
    		$status = __('Error', 'gravityview');
134
    		global $wpdb;
135
		    $note = sprintf( '%s: Failed to assign User ID #%d as the entry creator (Last database error: "%s")', $status, $user_id, $wpdb->last_error );
136
    	} else {
137
    		$status = __('Success', 'gravityview');
138
    	    $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 );
139
    	}
140
141
    	gravityview()->log->debug( 'GravityView_Change_Entry_Creator[assign_new_user_to_lead] - {note}', array( 'note' => $note ) );
142
143
	    /**
144
	     * @filter `gravityview_disable_change_entry_creator_note` Disable adding a note when changing the entry creator
145
	     * @since 1.21.5
146
	     * @param boolean $disable Disable the Change Entry Creator note. Default: false.
147
	     */
148
	    if( apply_filters('gravityview_disable_change_entry_creator_note', false ) ) {
149
		    return;
150
	    }
151
152
        GravityView_Entry_Notes::add_note( $entry['id'], -1, 'GravityView', $note, 'gravityview' );
153
154
    }
155
156
    /**
157
     * Disable previous functionality; use this one as the canonical.
158
     * @return void
159
     */
160
    function prevent_conflicts() {
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...
161
162
    	// Plugin that was provided here:
163
    	// @link https://gravityview.co/support/documentation/201991205/
164
    	remove_action("gform_entry_info", 'gravityview_change_entry_creator_form', 10 );
165
    	remove_action("gform_after_update_entry", 'gravityview_update_entry_creator', 10 );
166
167
    }
168
169
    /**
170
     * @since  3.6.3
171
     * @return void
172
     */
173
    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...
174
175
    	// Does GF exist?
176
        if( !class_exists('GFCommon') ) {
177
            return;
178
        }
179
180
        // Can the user edit entries?
181
        if( ! GVCommon::has_cap( array( 'gravityforms_edit_entries', 'gravityview_edit_entries' ) ) ) {
182
            return;
183
        }
184
185
        // If screen mode isn't set, then we're in the wrong place.
186
        if( empty( $_REQUEST['screen_mode'] ) ) {
187
            return;
188
        }
189
190
        // Now, no validation is required in the methods; let's hook in.
191
        add_action('admin_init', array( &$this, 'set_screen_mode' ) );
192
193
        add_action("gform_entry_info", array( &$this, 'add_select' ), 10, 2);
194
195
        add_action("gform_after_update_entry", array( &$this, 'update_entry_creator' ), 10, 2);
196
197
    }
198
199
    /**
200
     * Allows for edit links to work with a link instead of a form (GET instead of POST)
201
     * @return void
202 1
     */
203
    function set_screen_mode() {
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...
204 1
205
    	if( 'view' === \GV\Utils::_POST( 'screen_mode' ) ) {
206
    		return;
207
	    }
208 1
209
    	// If $_GET['screen_mode'] is set to edit, set $_POST value
210 1
        if( \GV\Utils::_GET( 'screen_mode' ) === 'edit' ) {
211
            $_POST["screen_mode"] = 'edit';
212 1
        }
213
214
    }
215 1
216
    /**
217
     * When the entry creator is changed, add a note to the entry
218
     * @param  array $form   GF entry array
219
     * @param  int $entry_id Entry ID
220
     * @return void
221
     */
222 1
    function update_entry_creator($form, $entry_id) {
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...
223 1
            global $current_user;
224 1
225
        // Update the entry
226
        $created_by = absint( \GV\Utils::_POST( 'created_by') );
227
228 1
        RGFormsModel::update_lead_property( $entry_id, 'created_by', $created_by );
229 1
230
        // If the creator has changed, let's add a note about who it used to be.
231
        $originally_created_by = \GV\Utils::_POST( 'originally_created_by' );
232
233 1
        // If there's no owner and there didn't used to be, keep going
234 1
        if( empty( $originally_created_by ) && empty( $created_by ) ) {
235 1
            return;
236 1
        }
237
238 1
        // If the values have changed
239 1
        if( absint( $originally_created_by ) !== absint( $created_by ) ) {
240
241 1
            $user_data = get_userdata($current_user->ID);
242
243 1
            $user_format = _x('%s (ID #%d)', 'The name and the ID of users who initiated changes to entry ownership', 'gravityview');
244 1
245
            $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');
246
247
            if( !empty( $originally_created_by ) ) {
248
                $originally_created_by_user_data = get_userdata($originally_created_by);
249
                $original_name = sprintf( $user_format, $originally_created_by_user_data->display_name, $originally_created_by_user_data->ID );
250
            }
251
252
            if( !empty( $created_by ) ) {
253
                $created_by_user_data =  get_userdata($created_by);
254
                $created_by_name = sprintf( $user_format, $created_by_user_data->display_name, $created_by_user_data->ID );
255
            }
256
257
            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' );
258
        }
259
260
    }
261
262
    /**
263
     * Output the select to change the entry creator
264
     * @param int $form_id GF Form ID
265
     * @param array $entry    GF entry array
266
     * @return void
267
     */
268
    function add_select($form_id, $entry ) {
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...
269
270
        if( \GV\Utils::_POST( 'screen_mode' ) !== 'edit' ) {
271
            return;
272
        }
273
274
275
        $output = '<label for="change_created_by">';
276
        $output .= esc_html__('Change Entry Creator:', 'gravityview');
277
        $output .= '</label>';
278
279
	    $output .= '<select name="created_by" id="change_created_by" class="widefat">';
280
281
        $created_by_id = \GV\Utils::get( $entry, 'created_by' );
282
        $created_by_user = GVCommon::get_users( 'change_entry_creator', array( 'include' => $created_by_id ) );
283
        $created_by_user = isset($created_by_user[0]) ? $created_by_user[0] : array();
284
285
        if( empty( $created_by_user ) ) {
286
            $output .= '<option value="0"> &mdash; '.esc_attr_x( 'No User', 'No user assigned to the entry', 'gravityview').' &mdash; </option>';
287
        } else {
288
            $output .= '<option value="'. $created_by_user->ID .'" "selected">'.esc_attr( $created_by_user->display_name.' ('.$created_by_user->user_nicename.')' ).'</option>';
289
        }
290
291
        $output .= '</select>';
292
        $output .= '<input name="originally_created_by" value="'.esc_attr( $entry['created_by'] ).'" type="hidden" />';
293
        $output .= wp_nonce_field( 'gv_entry_creator', 'gv_entry_creator_nonce', false, false );
294
295
        echo $output;
296
    }
297
298
}
299
300
new GravityView_Change_Entry_Creator;
301