Complex classes like GravityView_Delete_Entry often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use GravityView_Delete_Entry, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
22 | final class GravityView_Delete_Entry { |
||
23 | |||
24 | static $file; |
||
25 | static $instance; |
||
26 | var $entry; |
||
27 | var $form; |
||
28 | var $view_id; |
||
29 | var $is_valid = NULL; |
||
30 | |||
31 | function __construct() { |
||
32 | |||
33 | self::$file = plugin_dir_path( __FILE__ ); |
||
34 | |||
35 | $this->add_hooks(); |
||
36 | } |
||
37 | |||
38 | /** |
||
39 | * @since 1.9.2 |
||
40 | */ |
||
41 | private function add_hooks() { |
||
42 | add_action( 'wp', array( $this, 'process_delete' ), 10000 ); |
||
43 | |||
44 | add_filter( 'gravityview_entry_default_fields', array( $this, 'add_default_field'), 10, 3 ); |
||
45 | |||
46 | add_action( 'gravityview_before', array( $this, 'display_message' ) ); |
||
47 | |||
48 | // For the Delete Entry Link, you don't want visible to all users. |
||
49 | add_filter( 'gravityview_field_visibility_caps', array( $this, 'modify_visibility_caps'), 10, 5 ); |
||
50 | |||
51 | // Modify the field options based on the name of the field type |
||
52 | add_filter( 'gravityview_template_delete_link_options', array( $this, 'delete_link_field_options' ), 10, 5 ); |
||
53 | |||
54 | // add template path to check for field |
||
55 | add_filter( 'gravityview_template_paths', array( $this, 'add_template_path' ) ); |
||
56 | |||
57 | add_action( 'gravityview/edit-entry/publishing-action/after', array( $this, 'add_delete_button'), 10, 3 ); |
||
58 | } |
||
59 | |||
60 | /** |
||
61 | * Return the instantiated class object |
||
62 | * |
||
63 | * @since 1.5.1 |
||
64 | * @return GravityView_Delete_Entry |
||
65 | */ |
||
66 | static function getInstance() { |
||
67 | |||
68 | if( empty( self::$instance ) ) { |
||
69 | self::$instance = new self; |
||
70 | } |
||
71 | |||
72 | return self::$instance; |
||
73 | } |
||
74 | |||
75 | /** |
||
76 | * Include this extension templates path |
||
77 | * |
||
78 | * @since 1.5.1 |
||
79 | * @param array $file_paths List of template paths ordered |
||
80 | */ |
||
81 | function add_template_path( $file_paths ) { |
||
82 | |||
83 | // Index 100 is the default GravityView template path. |
||
84 | // Index 110 is Edit Entry link |
||
85 | $file_paths[ 115 ] = self::$file; |
||
86 | |||
87 | return $file_paths; |
||
88 | } |
||
89 | |||
90 | /** |
||
91 | * Add "Delete Link Text" setting to the edit_link field settings |
||
92 | * |
||
93 | * @since 1.5.1 |
||
94 | * @param [type] $field_options [description] |
||
95 | * @param [type] $template_id [description] |
||
96 | * @param [type] $field_id [description] |
||
97 | * @param [type] $context [description] |
||
98 | * @param [type] $input_type [description] |
||
99 | * @return [type] [description] |
||
100 | */ |
||
101 | function delete_link_field_options( $field_options, $template_id, $field_id, $context, $input_type ) { |
||
102 | |||
103 | // Always a link, never a filter |
||
104 | unset( $field_options['show_as_link'], $field_options['search_filter'] ); |
||
105 | |||
106 | // Delete Entry link should only appear to visitors capable of editing entries |
||
107 | unset( $field_options['only_loggedin'], $field_options['only_loggedin_cap'] ); |
||
108 | |||
109 | $add_option['delete_link'] = array( |
||
110 | 'type' => 'text', |
||
111 | 'label' => __( 'Delete Link Text', 'gravityview' ), |
||
112 | 'desc' => NULL, |
||
113 | 'value' => __('Delete Entry', 'gravityview'), |
||
114 | 'merge_tags' => true, |
||
115 | ); |
||
116 | |||
117 | $field_options['allow_edit_cap'] = array( |
||
118 | 'type' => 'select', |
||
119 | 'label' => __( 'Allow the following users to delete the entry:', 'gravityview' ), |
||
120 | 'choices' => GravityView_Render_Settings::get_cap_choices( $template_id, $field_id, $context, $input_type ), |
||
121 | 'tooltip' => 'allow_edit_cap', |
||
122 | 'class' => 'widefat', |
||
123 | 'value' => 'read', // Default: entry creator |
||
124 | ); |
||
125 | |||
126 | |||
127 | return array_merge( $add_option, $field_options ); |
||
128 | } |
||
129 | |||
130 | |||
131 | /** |
||
132 | * Add Edit Link as a default field, outside those set in the Gravity Form form |
||
133 | * |
||
134 | * @since 1.5.1 |
||
135 | * @param array $entry_default_fields Existing fields |
||
136 | * @param string|array $form form_ID or form object |
||
137 | * @param string $zone Either 'single', 'directory', 'header', 'footer' |
||
138 | */ |
||
139 | function add_default_field( $entry_default_fields, $form = array(), $zone = '' ) { |
||
140 | |||
141 | $entry_default_fields['delete_link'] = array( |
||
142 | 'label' => __('Delete Entry', 'gravityview'), |
||
143 | 'type' => 'delete_link', |
||
144 | 'desc' => __('A link to delete the entry. Respects the Delete Entry permissions.', 'gravityview'), |
||
145 | ); |
||
146 | |||
147 | return $entry_default_fields; |
||
148 | } |
||
149 | |||
150 | /** |
||
151 | * Add Delete Entry Link to the Add Field dialog |
||
152 | * @since 1.5.1 |
||
153 | * @param array $available_fields |
||
154 | */ |
||
155 | function add_available_field( $available_fields = array() ) { |
||
156 | |||
157 | $available_fields['delete_link'] = array( |
||
158 | 'label_text' => __( 'Delete Entry', 'gravityview' ), |
||
159 | 'field_id' => 'delete_link', |
||
160 | 'label_type' => 'field', |
||
161 | 'input_type' => 'delete_link', |
||
162 | 'field_options' => NULL |
||
163 | ); |
||
164 | |||
165 | return $available_fields; |
||
166 | } |
||
167 | |||
168 | /** |
||
169 | * Change wording for the Edit context to read Entry Creator |
||
170 | * |
||
171 | * @since 1.5.1 |
||
172 | * @param array $visibility_caps Array of capabilities to display in field dropdown. |
||
173 | * @param string $field_type Type of field options to render (`field` or `widget`) |
||
174 | * @param string $template_id Table slug |
||
175 | * @param float $field_id GF Field ID - Example: `3`, `5.2`, `entry_link`, `created_by` |
||
176 | * @param string $context What context are we in? Example: `single` or `directory` |
||
177 | * @param string $input_type (textarea, list, select, etc.) |
||
178 | * @return array Array of field options with `label`, `value`, `type`, `default` keys |
||
179 | */ |
||
180 | public function modify_visibility_caps( $visibility_caps = array(), $template_id = '', $field_id = '', $context = '', $input_type = '' ) { |
||
181 | |||
182 | $caps = $visibility_caps; |
||
183 | |||
184 | // If we're configuring fields in the edit context, we want a limited selection |
||
185 | if( $field_id === 'delete_link' ) { |
||
186 | |||
187 | // Remove other built-in caps. |
||
188 | unset( $caps['publish_posts'], $caps['gravityforms_view_entries'], $caps['delete_others_posts'] ); |
||
189 | |||
190 | $caps['read'] = _x('Entry Creator', 'User capability', 'gravityview'); |
||
191 | } |
||
192 | |||
193 | return $caps; |
||
194 | } |
||
195 | |||
196 | /** |
||
197 | * Make sure there's an entry |
||
198 | * |
||
199 | * @since 1.5.1 |
||
200 | * @param [type] $entry [description] |
||
201 | */ |
||
202 | function set_entry( $entry = null ) { |
||
205 | |||
206 | /** |
||
207 | * Generate a consistent nonce key based on the Entry ID |
||
208 | * |
||
209 | * @since 1.5.1 |
||
210 | * @param int $entry_id Entry ID |
||
211 | * @return string Key used to validate request |
||
212 | */ |
||
213 | public static function get_nonce_key( $entry_id ) { |
||
216 | |||
217 | |||
218 | /** |
||
219 | * Generate a nonce link with the base URL of the current View embed |
||
220 | * |
||
221 | * We don't want to link to the single entry, because when deleted, there would be nothing to return to. |
||
222 | * |
||
223 | * @since 1.5.1 |
||
224 | * @param array $entry Gravity Forms entry array |
||
225 | * @return string|null If directory link is valid, the URL to process the delete request. Otherwise, `NULL`. |
||
226 | */ |
||
227 | public static function get_delete_link( $entry, $view_id = 0, $post_id = null ) { |
||
254 | |||
255 | |||
256 | /** |
||
257 | * Add a Delete button to the #publishing-action section of the Delete Entry form |
||
258 | * |
||
259 | * @since 1.5.1 |
||
260 | * @param array $form Gravity Forms form array |
||
261 | * @param array $entry Gravity Forms entry array |
||
262 | * @param int $view_id GravityView View ID |
||
263 | */ |
||
264 | function add_delete_button( $form = array(), $entry = array(), $view_id = NULL ) { |
||
291 | |||
292 | /** |
||
293 | * Handle the deletion request, if $_GET['action'] is set to "delete" |
||
294 | * |
||
295 | * 1. Check referrer validity |
||
296 | * 2. Make sure there's an entry with the slug of $_GET['entry_id'] |
||
297 | * 3. If so, attempt to delete the entry. If not, set the error status |
||
298 | * 4. Remove `action=delete` from the URL |
||
299 | * 5. Redirect to the page using `wp_safe_redirect()` |
||
300 | * |
||
301 | * @since 1.5.1 |
||
302 | * @uses wp_safe_redirect() |
||
303 | * @return void |
||
304 | */ |
||
305 | function process_delete() { |
||
377 | |||
378 | /** |
||
379 | * Delete mode: permanently delete, or move to trash? |
||
380 | * |
||
381 | * @return string `delete` or `trash` |
||
382 | */ |
||
383 | private function get_delete_mode() { |
||
394 | |||
395 | /** |
||
396 | * @since 1.13.1 |
||
397 | * @see GFAPI::delete_entry() |
||
398 | * @return WP_Error|boolean GFAPI::delete_entry() returns a WP_Error on error |
||
399 | */ |
||
400 | private function delete_or_trash_entry( $entry_id ) { |
||
435 | |||
436 | /** |
||
437 | * Is the current nonce valid for editing the entry? |
||
438 | * |
||
439 | * @since 1.5.1 |
||
440 | * @return boolean |
||
441 | */ |
||
442 | public function verify_nonce() { |
||
464 | |||
465 | /** |
||
466 | * Get the onclick attribute for the confirm dialogs that warns users before they delete an entry |
||
467 | * |
||
468 | * @since 1.5.1 |
||
469 | * @return string HTML `onclick` attribute |
||
470 | */ |
||
471 | public static function get_confirm_dialog() { |
||
483 | |||
484 | /** |
||
485 | * Check if the user can edit the entry |
||
486 | * |
||
487 | * - Is the nonce valid? |
||
488 | * - Does the user have the right caps for the entry |
||
489 | * - Is the entry in the trash? |
||
490 | * |
||
491 | * @since 1.5.1 |
||
492 | * @param array $entry Gravity Forms entry array |
||
493 | * @return boolean|WP_Error True: can edit form. WP_Error: nope. |
||
494 | */ |
||
495 | function user_can_delete_entry( $entry = array() ) { |
||
524 | |||
525 | |||
526 | /** |
||
527 | * checks if user has permissions to view the link or delete a specific entry |
||
528 | * |
||
529 | * @since 1.5.1 |
||
530 | * @since 1.15 Added `$view_id` param |
||
531 | * |
||
532 | * @param array $entry Gravity Forms entry array |
||
533 | * @param array $field Field settings (optional) |
||
534 | * @param int $view_id Pass a View ID to check caps against. If not set, check against current View (optional) |
||
535 | * @return bool |
||
536 | */ |
||
537 | public static function check_user_cap_delete_entry( $entry, $field = array(), $view_id = 0 ) { |
||
614 | |||
615 | |||
616 | /** |
||
617 | * After processing delete entry, the user will be redirected to the referring View or embedded post/page. Display a message on redirection. |
||
618 | * |
||
619 | * If success, there will be `status` URL parameters `status=>success` |
||
620 | * If an error, there will be `status` and `message` URL parameters `status=>error&message=example` |
||
621 | * |
||
622 | * @since 1.15.2 Only show message when the URL parameter's View ID matches the current View ID |
||
623 | * @since 1.5.1 |
||
624 | * |
||
625 | * @param int $current_view_id The ID of the View being rendered |
||
626 | * @return void |
||
627 | */ |
||
628 | public function display_message( $current_view_id = 0 ) { |
||
670 | |||
671 | |||
672 | } // end class |
||
673 | |||
676 |
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.