Completed
Push — develop ( 7592b8...3eb7c5 )
by Zack
14:44
created

class-gravityview-change-entry-creator.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

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 ) ) {
0 ignored issues
show
Expected 1 spaces after opening bracket; 0 found
Loading history...
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
        $users = GVCommon::get_users( 'change_entry_creator' );
217
218
        $output = '<label for="change_created_by">';
219
        $output .= esc_html__('Change Entry Creator:', 'gravityview');
220
        $output .= '</label>
221
        <select name="created_by" id="change_created_by" class="widefat">';
222
        $output .= '<option value=""> &mdash; '.esc_attr_x( 'No User', 'No user assigned to the entry', 'gravityview').' &mdash; </option>';
223
        foreach($users as $user) {
224
            $output .= '<option value="'. $user->ID .'"'. selected( $entry['created_by'], $user->ID, false ).'>'.esc_attr( $user->display_name.' ('.$user->user_nicename.')' ).'</option>';
225
        }
226
        $output .= '</select>';
227
        $output .= '<input name="originally_created_by" value="'.esc_attr( $entry['created_by'] ).'" type="hidden" />';
228
        echo $output;
229
230
    }
231
232
}
233
234
new GravityView_Change_Entry_Creator;
235