Completed
Pull Request — master (#716)
by Zack
09:51 queued 04:52
created

add_script_dependencies()   B

Complexity

Conditions 8
Paths 13

Size

Total Lines 18
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 8
eloc 11
c 2
b 0
f 0
nc 13
nop 2
dl 0
loc 18
rs 7.7777
1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 14 and the first side effect is on line 228.

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.

Loading history...
2
/**
3
 * GravityView's No-Conflict mode: disable scripts that interfere with the plugin.
4
 *
5
 * @since 1.17
6
 * @file class-gravityview-admin-no-conflict.php
7
 * @package GravityView
8
 * @subpackage includes\admin
9
 */
10
11
/**
12
 * @since 1.17
13
 */
14
class GravityView_Admin_No_Conflict {
15
16
	/**
17
	 * @since 1.17
18
	 */
19
	public function __construct() {
20
21
		if( ! is_admin() ) { return; }
22
		
23
		$this->add_hooks();
24
	}
25
26
	/**
27
	 * Add the hooks to fix script and style conflicts
28
	 *
29
	 * @since 1.17
30
	 *
31
	 * @return void
32
	 */
33
	private function add_hooks() {
34
		//Hooks for no-conflict functionality
35
		add_action( 'wp_print_scripts', array( $this, 'no_conflict_scripts' ), 1000);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
36
		add_action( 'admin_print_footer_scripts', array( $this, 'no_conflict_scripts' ), 9);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
37
38
		add_action( 'wp_print_styles', array( $this, 'no_conflict_styles' ), 1000);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
39
		add_action( 'admin_print_styles', array( $this, 'no_conflict_styles' ), 11);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
40
		add_action( 'admin_print_footer_scripts', array( $this, 'no_conflict_styles' ), 1);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
41
		add_action( 'admin_footer', array( $this, 'no_conflict_styles' ), 1);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
42
	}
43
44
	/**
45
	 * Callback to eliminate any non-registered script
46
	 *
47
	 * @since 1.17 Moved to GravityView_Admin_No_Conflict class
48
	 *
49
	 * @return void
50
	 */
51
	function no_conflict_scripts() {
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...
52
		global $wp_scripts;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
53
54
		if( ! gravityview_is_admin_page() ) {
55
			return;
56
		}
57
58
		$no_conflict_mode = GravityView_Settings::getSetting('no-conflict-mode');
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
59
60
		if( empty( $no_conflict_mode ) ) {
61
			return;
62
		}
63
64
		$wp_allowed_scripts = array(
65
			'common',
66
			'admin-bar',
67
			'autosave',
68
			'post',
69
			'inline-edit-post',
70
			'utils',
71
			'svg-painter',
72
			'wp-auth-check',
73
			'heartbeat',
74
			'media-editor',
75
			'media-upload',
76
			'thickbox',
77
			'wp-color-picker',
78
79
			// Settings
80
			'gv-admin-edd-license',
81
82
			// Common
83
			'select2-js',
84
			'qtip-js',
85
86
			// jQuery
87
			'jquery',
88
			'jquery-ui-core',
89
			'jquery-ui-sortable',
90
			'jquery-ui-datepicker',
91
			'jquery-ui-dialog',
92
			'jquery-ui-slider',
93
			'jquery-ui-dialog',
94
			'jquery-ui-tabs',
95
			'jquery-ui-draggable',
96
			'jquery-ui-droppable',
97
			'jquery-ui-accordion',
98
		);
99
100
		$this->remove_conflicts( $wp_scripts, $wp_allowed_scripts, 'scripts' );
101
	}
102
103
	/**
104
	 * Callback to eliminate any non-registered style
105
	 *
106
	 * @since 1.17 Moved to GravityView_Admin_No_Conflict class
107
	 *
108
	 * @return void
109
	 */
110
	function no_conflict_styles() {
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...
111
		global $wp_styles;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
112
113
		if( ! gravityview_is_admin_page() ) {
114
			return;
115
		}
116
117
		// Dequeue other jQuery styles even if no-conflict is off.
118
		// Terrible-looking tabs help no one.
119
		if( !empty( $wp_styles->registered ) )  {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
120
			foreach ($wp_styles->registered as $key => $style) {
0 ignored issues
show
introduced by
No space after opening parenthesis is prohibited
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
121
				if( preg_match( '/^(?:wp\-)?jquery/ism', $key ) ) {
122
					wp_dequeue_style( $key );
123
				}
124
			}
125
		}
126
127
		$no_conflict_mode = GravityView_Settings::getSetting('no-conflict-mode');
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
128
129
		// If no conflict is off, jQuery will suffice.
130
		if( empty( $no_conflict_mode ) ) {
131
			return;
132
		}
133
134
		$wp_allowed_styles = array(
135
			'admin-bar',
136
			'colors',
137
			'ie',
138
			'wp-auth-check',
139
			'media-views',
140
			'thickbox',
141
			'dashicons',
142
			'wp-jquery-ui-dialog',
143
			'jquery-ui-sortable',
144
145
			// Settings
146
			'gravityview_settings',
147
148
			// @todo qTip styles not loading for some reason!
149
			'jquery-qtip.js',
150
		);
151
152
		$this->remove_conflicts( $wp_styles, $wp_allowed_styles, 'styles' );
153
154
		/**
155
		 * @action `gravityview_remove_conflicts_after` Runs after no-conflict styles are removed. You can re-add styles here.
156
		 */
157
		do_action('gravityview_remove_conflicts_after');
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
158
	}
159
160
	/**
161
	 * Remove any style or script non-registered in the no conflict mode
162
	 *
163
	 * @since 1.17 Moved to GravityView_Admin_No_Conflict class
164
	 *
165
	 * @param  WP_Dependencies $wp_objects        Object of WP_Styles or WP_Scripts
166
	 * @param  string[] $required_objects   List of registered script/style handles
167
	 * @param  string $type              Either 'styles' or 'scripts'
168
	 * @return void
169
	 */
170
	private function remove_conflicts( &$wp_objects, $required_objects, $type = 'scripts' ) {
171
172
		/**
173
		 * @filter `gravityview_noconflict_{$type}` Modify the list of no conflict scripts or styles\n
174
		 * Filter is `gravityview_noconflict_scripts` or `gravityview_noconflict_styles`
175
		 * @param array $required_objects
176
		 */
177
		$required_objects = apply_filters( "gravityview_noconflict_{$type}", $required_objects );
178
179
		//reset queue
180
		$queue = array();
181
		foreach( $wp_objects->queue as $object ) {
182
			if( in_array( $object, $required_objects ) || preg_match('/gravityview|gf_|gravityforms/ism', $object ) ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
183
				$queue[] = $object;
184
			}
185
		}
186
		$wp_objects->queue = $queue;
187
188
		$required_objects = $this->add_script_dependencies( $wp_objects->registered, $required_objects );
189
190
		//unregistering scripts
191
		$registered = array();
192
		foreach( $wp_objects->registered as $handle => $script_registration ){
193
			if( in_array( $handle, $required_objects ) ){
194
				$registered[ $handle ] = $script_registration;
195
			}
196
		}
197
		$wp_objects->registered = $registered;
198
	}
199
200
	/**
201
	 * Add dependencies
202
	 *
203
	 * @since 1.17 Moved to GravityView_Admin_No_Conflict class
204
	 *
205
	 * @param array $registered [description]
206
	 * @param array $scripts    [description]
207
	 */
208
	private function add_script_dependencies($registered, $scripts) {
209
210
		//gets all dependent scripts linked to the $scripts array passed
211
		do {
212
			$dependents = array();
213
			foreach ( $scripts as $script ) {
214
				$deps = isset( $registered[ $script ] ) && is_array( $registered[ $script ]->deps ) ? $registered[ $script ]->deps : array();
215
				foreach ( $deps as $dep ) {
216
					if ( ! in_array( $dep, $scripts ) && ! in_array( $dep, $dependents ) ) {
217
						$dependents[] = $dep;
218
					}
219
				}
220
			}
221
			$scripts = array_merge( $scripts, $dependents );
222
		} while ( ! empty( $dependents ) );
223
224
		return $scripts;
225
	}
226
}
227
228
new GravityView_Admin_No_Conflict;