Completed
Push — develop ( 0eafe4...ba52e7 )
by Zack
17:36 queued 10s
created

GravityView_Admin_Installer   C

Complexity

Total Complexity 56

Size/Duplication

Total Lines 587
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 5

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
dl 0
loc 587
ccs 0
cts 282
cp 0
rs 5.5199
c 0
b 0
f 0
wmc 56
lcom 2
cbo 5

16 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 13 1
A register_noconflict() 0 6 1
B add_downloads_data_filters() 0 25 6
A add_admin_menu() 0 15 1
A maybe_modify_license_notice() 0 8 2
A get_wp_plugins_data() 0 21 3
B get_downloads_data() 0 44 5
A set_downloads_data() 0 3 1
A delete_downloads_data() 0 3 1
B render_screen() 0 58 7
A render_download() 0 43 3
C get_download_display_details() 0 100 11
A get_download_base_price() 0 14 3
A activate_download() 0 17 4
A deactivate_download() 0 17 3
A maybe_enqueue_scripts_and_styles() 0 21 4

How to fix   Complexity   

Complex Class

Complex classes like GravityView_Admin_Installer 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_Admin_Installer, and based on these observations, apply Extract Interface, too.

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 16 and the first side effect is on line 6.

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
// Exit if accessed directly
4
5
if ( ! defined( 'ABSPATH' ) ) {
6
	exit;
7
}
8
9
/**
10
 * GravityView_Admin_Installer Class
11
 *
12
 * A general class for About page.
13
 *
14
 * @since 2.1
15
 */
16
class GravityView_Admin_Installer {
17
18
	const EDD_API_URL = 'https://gravityview.co/edd-api/products/';
19
20
	const EDD_API_KEY = 'e4c7321c4dcf342c9cb078e27bf4ba97';
21
22
	const EDD_API_TOKEN = 'e031fd350b03bc223b10f04d8b5dde42';
23
24
	const DOWNLOADS_DATA_TRANSIENT = 'gv_downloads_data';
25
26
	const DOWNLOADS_DATA_TRANSIENT_EXPIRY = DAY_IN_SECONDS;
27
28
	/**
29
	 * @var string
30
	 */
31
	public $minimum_capability = 'install_plugins';
32
33
	public function __construct() {
34
35
		$this->add_downloads_data_filters();
36
37
		add_action( 'admin_menu', array( $this, 'add_admin_menu' ), 200 );
38
		add_action( 'gravityview/admin_installer/delete_downloads_data', array( $this, 'delete_downloads_data' ) );
39
		add_action( 'wp_ajax_gravityview_admin_installer_activate', array( $this, 'activate_download' ) );
40
		add_action( 'wp_ajax_gravityview_admin_installer_deactivate', array( $this, 'deactivate_download' ) );
41
		add_action( 'admin_enqueue_scripts', array( $this, 'maybe_enqueue_scripts_and_styles' ) );
42
		add_filter( 'gravityview_noconflict_scripts', array( $this, 'register_noconflict' ) );
43
		add_filter( 'gravityview_noconflict_styles', array( $this, 'register_noconflict' ) );
44
		add_filter( 'gravityview/settings/license-key-notice', array( $this, 'maybe_modify_license_notice' ) );
45
	}
46
47
	/**
48
	 * Let us operate when GF no-conflict is enabled
49
	 *
50
	 * @param array $items Scripts or styles to exclude from no-conflict
51
	 *
52
	 * @return array
53
	 */
54
	public function register_noconflict( $items ) {
55
56
		$items[] = 'gravityview-admin-installer';
57
58
		return $items;
59
	}
60
61
62
	/**
63
	 * Modify plugins data with custom GV extension info
64
	 *
65
	 * @return void
66
	 */
67
	public function add_downloads_data_filters() {
68
69
	    $downloads_data = get_site_transient( self::DOWNLOADS_DATA_TRANSIENT );
70
71
	    if ( ! $downloads_data ) {
72
			return;
73
		}
74
75
		add_filter( 'plugins_api', function ( $data, $action, $args ) use ( $downloads_data ) {
76
			foreach ( $downloads_data as $extension ) {
77
				if ( empty( $extension['info'] ) || empty( $args->slug ) || $args->slug !== $extension['info']['slug'] ) {
78
					continue;
79
				}
80
81
				return (object) array(
82
					'slug'          => $extension['info']['slug'],
83
					'name'          => $extension['info']['title'],
84
					'version'       => $extension['licensing']['version'],
85
					'download_link' => $extension['files'][0]['file'],
86
				);
87
			}
88
89
			return $data;
90
		}, 10, 3 );
91
	}
92
93
	/**
94
	 * Add new admin menu
95
	 *
96
	 * @return void
97
	 */
98
	public function add_admin_menu() {
99
100
	    $menu_text = _x( 'Extensions', 'Extensions are WordPress plugins that add functionality to GravityView and Gravity Forms', 'gravityview' );
101
102
		$menu_text = sprintf( '<span title="%s">%s</span>', esc_attr__( 'Plugins that extend GravityView and Gravity Forms functionality.', 'gravityview' ), $menu_text );
103
104
		add_submenu_page(
105
			'edit.php?post_type=gravityview',
106
			__( 'GravityView Extensions and Plugins', 'gravityview' ),
107
			$menu_text,
108
			$this->minimum_capability,
109
			'gv-admin-installer',
110
			array( $this, 'render_screen' )
111
		);
112
	}
113
114
	/**
115
     * When on the Installer page, show a different notice than on the Settings page
116
     *
117
	 * @param array $notice
118
	 *
119
	 * @return string License notice
120
	 */
121
	public function maybe_modify_license_notice( $notice = '' ) {
122
123
		if ( ! gravityview()->request->is_admin( '', 'downloads' ) ) {
0 ignored issues
show
Unused Code introduced by
The call to Request::is_admin() has too many arguments starting with ''.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
124
            return $notice;
125
        }
126
127
        return esc_html__( 'Your license %s. Do you want access to these plugins? %sActivate your license%s or %sget a license here%s.', 'gravityview' );
128
	}
129
130
	/**
131
	 * Get an array of plugins with textdomains as keys
132
	 *
133
	 * @return array {
134
	 * @type string $path Path to the plugin
135
	 * @type string $version What version is the plugin
136
	 * @type bool $activated Is the plugin activated
137
	 * }
138
	 */
139
	protected function get_wp_plugins_data() {
140
141
		$wp_plugins = array();
142
143
		$all_plugins = get_plugins();
144
145
		foreach ( $all_plugins as $path => $plugin ) {
146
147
			if ( empty( $plugin['TextDomain'] ) ) {
148
				continue;
149
			}
150
151
			$wp_plugins[ $plugin['TextDomain'] ] = array(
152
				'path'      => $path,
153
				'version'   => $plugin['Version'],
154
				'activated' => is_plugin_active( $path )
155
			);
156
		}
157
158
		return $wp_plugins;
159
	}
160
161
	/**
162
	 * Get downloads data from transient or from API; save transient after getting data from API
163
	 *
164
	 * @return WP_Error|array If error, returns WP_Error. If not valid JSON, empty array. Otherwise, this structure: {
165
     *   @type array  $info {
166
     *       @type string $id int 17
167
     *       @type string $slug Extension slug
168
     *       @type string $title Extension title
169
     *       @type string $create_date in '2018-07-19 20:03:10' format
170
     *       @type string $modified_date
171
     *       @type string $status
172
     *       @type string $link URL to public plugin page
173
     *       @type string $content
174
     *       @type string $excerpt
175
     *       @type string $thumbnail URL to thumbnail
176
     *       @type array  $category Taxonomy details for the plugin's category {
177
     *         @type int $term_id => int 30
178
     *         @type string $name => string 'Plugins' (length=7)
179
     *         @type string $slug => string 'plugins' (length=7)
180
     *         @type int $term_group => int 0
181
     *         @type int $term_taxonomy_id => int 30
182
     *         @type string $taxonomy => string 'download_category' (length=17)
183
     *         @type string $description => string '' (length=0)
184
     *         @type int $parent => int 0
185
     *         @type int $count => int 4
186
     *         @type string $filter => string 'raw' (length=3)
187
     *       }
188
     *       @type array $tags {see $category above}
189
     *       @type string $textdomain string 'gravityview' (length=11)
190
     *   }
191
     *   @type array $pricing array of `price_name_slugs` => '00.00' values, if price options exist
192
     *   @type array $licensing {
193
     *       @type bool   $enabled Is licensing enabled for the extension
194
     *       @type string $version Version number
195
     *       @type string $exp_unit Expiration unit ('years')
196
     *       @type string $exp_length Expiration length ('1')
197
     *   }
198
     *   @type array $files Array of files. Empty if user has no access to the file. {
199
     *       @type string $file string URL of the file download
200
     *   }
201
     * }
202
	 */
203
	public function get_downloads_data() {
204
205
		$downloads_data = get_site_transient( self::DOWNLOADS_DATA_TRANSIENT );
206
207
		if ( $downloads_data ) {
208
			return $downloads_data;
209
		}
210
211
		if( \GV\Plugin::is_network_activated() ) {
212
			$home_url = network_home_url();
213
		} else {
214
			$home_url = home_url();
215
		}
216
217
		$api_url = add_query_arg(
218
			array(
219
				'key'         => self::EDD_API_KEY,
220
				'token'       => self::EDD_API_TOKEN,
221
				'url'         => $home_url,
222
				'license_key' => gravityview()->plugin->settings->get( 'license_key' )
223
			),
224
			self::EDD_API_URL
225
		);
226
227
		$response = wp_remote_get( $api_url, array(
0 ignored issues
show
introduced by
wp_remote_get is highly discouraged, please use vip_safe_wp_remote_get() instead.
Loading history...
228
			'sslverify' => false,
229
			'timeout'   => 5,
230
		) );
231
232
		if ( is_wp_error( $response ) ) {
233
		    gravityview()->log->error( "Extension data response is an error", array( 'data' => $response ) );
0 ignored issues
show
Coding Style Comprehensibility introduced by
The string literal Extension data response is an error does not require double quotes, as per coding-style, please use single quotes.

PHP provides two ways to mark string literals. Either with single quotes 'literal' or with double quotes "literal". The difference between these is that string literals in double quotes may contain variables with are evaluated at run-time as well as escape sequences.

String literals in single quotes on the other hand are evaluated very literally and the only two characters that needs escaping in the literal are the single quote itself (\') and the backslash (\\). Every other character is displayed as is.

Double quoted string literals may contain other variables or more complex escape sequences.

<?php

$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";

print $doubleQuoted;

will print an indented: Single is Value

If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear.

For more information on PHP string literals and available escape sequences see the PHP core documentation.

Loading history...
234
			return $response;
235
		}
236
237
		$downloads_data = json_decode( wp_remote_retrieve_body( $response ), true );
238
239
		if ( empty( $downloads_data['products'] ) ) {
240
			return array();
241
		}
242
243
		$this->set_downloads_data( $downloads_data['products'] );
244
245
		return $downloads_data['products'];
246
	}
247
248
	/**
249
	 * Save downloads data in a time-bound transient
250
	 *
251
	 * @param array $data
252
	 *
253
	 * @return true if successful, false otherwise
254
	 */
255
	public function set_downloads_data( $data ) {
256
		return set_site_transient( self::DOWNLOADS_DATA_TRANSIENT, $data, self::DOWNLOADS_DATA_TRANSIENT_EXPIRY );
257
	}
258
259
	/**
260
	 * Delete downloads data transient
261
	 *
262
	 * @return bool true if successful, false otherwise
263
	 */
264
	public function delete_downloads_data() {
265
		return delete_site_transient( self::DOWNLOADS_DATA_TRANSIENT );
266
	}
267
268
	/**
269
	 * Display a grid of available downloads and controls to install/activate/deactivate them
270
	 *
271
	 * @since 2.1
272
	 *
273
	 * @return void
274
	 */
275
	public function render_screen() {
276
277
		$downloads_data = $this->get_downloads_data();
278
279
		if ( is_wp_error( $downloads_data ) || empty( $downloads_data ) ) {
280
			?>
281
            <div class="wrap">
282
                <h1><?php esc_html_e( 'GravityView Extensions and Plugins', 'gravityview' ); ?></h1>
283
                <div class="gv-admin-installer-notice notice inline error">
284
                    <h3><?php esc_html_e( 'Extensions and plugins data cannot be loaded at the moment. Please try again later.', 'gravityview' ); ?></h3>
285
                    <?php
286
                    if ( is_wp_error( $downloads_data ) ) {
287
	                    echo wpautop( '<pre>' . esc_html( $downloads_data->get_error_message() ) . '</pre>' );
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'wpautop'
Loading history...
288
                    }
289
                    ?>
290
                </div>
291
            </div>
292
			<?php
293
294
			return;
295
		}
296
297
		?>
298
        <div class="wrap">
299
300
301
            <h1><?php esc_html_e( 'GravityView Extensions and Plugins', 'gravityview' ); ?></h1>
302
303
            <h2><?php esc_html_e( 'The following plugins extend GravityView and Gravity Forms functionality:', 'gravityview' ); ?></h2>
304
305
            <div class="wp-header-end"></div>
306
307
            <div class="gv-admin-installer-notice notice inline error hidden is-dismissible">
308
                <p><!-- Contents will be replaced by JavaScript if there is an error --></p>
309
            </div>
310
311
            <div class="gv-admin-installer-container">
312
				<?php
313
314
				$wp_plugins = $this->get_wp_plugins_data();
315
316
				foreach ( $downloads_data as $extension ) {
317
318
					if ( empty( $extension['info'] ) ) {
319
						continue;
320
					}
321
322
					if ( 'gravityview' === \GV\Utils::get( $extension, 'info/slug' ) ) {
323
						continue;
324
					}
325
326
					$this->render_download( $extension, $wp_plugins );
327
				}
328
				?>
329
            </div>
330
        </div>
331
		<?php
332
	}
333
334
	/**
335
	 * Outputs the HTML of a single download
336
	 *
337
	 * @param array $download Download data, as returned from EDD API
338
	 * @param array $wp_plugins
339
	 *
340
	 * @return void
341
	 */
342
	protected function render_download( $download, $wp_plugins ) {
343
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
344
345
        $details = $this->get_download_display_details( $download, $wp_plugins );
346
347
        $download_info = $details['download_info'];
348
349
		?>
350
        <div class="item <?php echo esc_attr( $details['item_class'] ); ?>">
351
            <div class="addon-inner">
352
                <a href="<?php echo esc_url( $download_info['link'] ); ?>" rel="external noreferrer noopener" title="<?php esc_html_e( 'Visit the plugin page', 'gravityview' ); ?>"><img class="thumbnail" src="<?php echo esc_attr( $download_info['thumbnail'] ); ?>" alt="" /></a>
353
                <h3><?php echo esc_html( \GV\Utils::get( $download_info, 'installer_title', $download_info['title'] ) ); ?></h3>
354
                <div>
355
                    <?php if( ! empty( $details['status_label'] ) ) { ?>
356
                    <div class="status <?php echo esc_attr( $details['status'] ); ?>" title="<?php printf( esc_attr__( 'Plugin status: %s', 'gravityview' ), esc_html( $details['status_label'] ) ); ?>">
357
                        <span class="dashicons dashicons-admin-plugins"></span> <span class="status-label"><?php echo esc_html( $details['status_label'] ); ?></span>
358
                    </div>
359
			        <?php } ?>
360
361
                    <a data-status="<?php echo esc_attr( $details['status'] ); ?>" data-plugin-path="<?php echo esc_attr( $details['plugin_path'] ); ?>" href="<?php echo esc_url( $details['href'] ); ?>" class="button <?php echo esc_attr( $details['button_class'] ); ?>" title="<?php echo esc_attr( $details['button_title'] ); ?>">
362
                        <span class="title"><?php echo esc_html( $details['button_label'] ); ?></span>
363
                        <?php if( $details['spinner'] ) { ?><span class="spinner"></span><?php } ?>
364
                    </a>
365
                </div>
366
367
                <div class="addon-excerpt"><?php
368
369
                    $excerpt = \GV\Utils::get( $download_info, 'installer_excerpt', $download_info['excerpt'] );
370
371
                    // Allow some pure HTML tags, but remove everything else from the excerpt.
372
                    $tags = array( '<strong>', '</strong>', '<em>', '</em>', '<code>', '</code>' );
373
                    $replacements = array( '[b]', '[/b]', '[i]', '[/i]', '[code]', '[/code]' );
374
375
                    $excerpt = str_replace( $tags, $replacements, $excerpt );
376
                    $excerpt = esc_html( strip_tags( $excerpt ) );
377
					$excerpt = str_replace( $replacements, $tags, $excerpt );
378
379
					echo wpautop( $excerpt );
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'wpautop'
Loading history...
380
                ?></div>
381
            </div>
382
        </div>
383
		<?php
384
	}
385
386
	/**
387
     * Generates details array for the download to keep the render_download() method a bit tidier
388
     *
389
	 * @param array $download Single download, as returned by {@see get_downloads_data}
390
	 * @param array $wp_plugins All active plugins, as returned by {@see get_plugins()}
391
	 *
392
	 * @return array {
393
     *   @type array $download_info
394
     *   @type string $plugin_path
395
     *   @type string $status License status returned by Easy Digital Downloads ("active", "inactive", "expired", "revoked", etc)
396
     *   @type string $status_label
397
     *   @type string $button_title Title attribute to show when hovering over the download's button
398
     *   @type string $button_class CSS class to use for the button
399
     *   @type string $button_label Text to use for the download's anchor link
400
     *   @type string $href URL for the download's button
401
     *   @type bool   $spinner Whether to show the spinner icon
402
     *   @type string $item_class CSS class for the download container
403
     *   @type string $required_license The name of the required license for the download ("All Access" or "Core + Extensions")
404
     *   @type bool   $is_active Is the current GravityView license (as entered in Settings) active?
405
     * }
406
	 */
407
	private function get_download_display_details( $download, $wp_plugins ) {
408
409
		$download_info = wp_parse_args( (array) $download['info'], array(
410
			'thumbnail' => '',
411
			'title' => '',
412
			'textdomain' => '',
413
			'slug' => '',
414
			'excerpt' => '',
415
			'link' => '',
416
            'coming_soon' => false,
417
			'installer_title' => null, // May not be defined
418
			'installer_excerpt' => null, // May not be defined
419
		) );
420
421
		$wp_plugin = \GV\Utils::get( $wp_plugins, $download_info['textdomain'], false );
422
423
		$has_access = ! empty( $download['files'] );
424
		$spinner = true;
425
		$href = $plugin_path = '#';
426
		$status = $item_class = $button_title = $button_class = '';
427
		$base_price = $this->get_download_base_price( $download );
428
		$is_active = in_array( gravityview()->plugin->settings->get( 'license_key_response/license' ), array( 'active', 'valid' ), true );
429
		$galactic_only = in_array( \GV\Utils::get( $download, 'info/category/0/slug' ), array( 'plugins', 'views' ) );
430
		$required_license = $galactic_only ? __( 'All Access', 'gravityview' ) : __( 'Core + Extensions', 'gravityview' );
431
432
		// The license is not active - no matter what level, this should not work
433
		if( ! $is_active  && empty( $base_price ) ) {
434
			$spinner      = false;
435
			$status_label = '';
436
			$button_class = 'disabled disabled-license';
437
			$button_label = sprintf( __( 'Active %s License is Required.', 'gravityview' ), $required_license );
438
		}
439
440
		// No access with the current license level, and the download is available to purchase
441
		elseif ( ! $has_access && ! empty( $base_price ) ) {
442
			$spinner      = false;
443
			$status_label = '';
444
			$button_label = sprintf( __( 'Purchase Now for %s', 'gravityview' ), '$' . $base_price );
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$base_price'
Loading history...
445
			$button_class = 'button-primary button-large';
446
			$href         = $download_info['link'];
447
			$item_class   = 'featured';
448
		}
449
450
		// No access with the current license level, and the download is not sold separately
451
		elseif ( ! $has_access && $is_active ) {
452
			$spinner      = false;
453
			$status_label = '';
454
			$button_label = sprintf( __( 'Upgrade to %s for Access', 'gravityview' ), $required_license );
455
			$button_class = 'button-primary button-large';
456
			$href         = 'https://gravityview.co/pricing/?utm_source=admin-installer&utm_medium=admin&utm_campaign=Admin%20Notice&utm_content=' . $required_license;
457
		}
458
459
        elseif ( ! empty( $download_info['coming_soon'] ) ) {
460
	        $spinner      = false;
461
	        $status       = 'notinstalled';
462
	        $status_label = __( 'Coming Soon', 'gravityview' );
463
	        $button_label = __( 'Learn More', 'gravityview' );
464
	        $button_class = 'button-primary button-large';
465
	        $href         = \GV\Utils::get( $download_info, 'link', 'https://gravityview.co/extensions/' );
466
        }
467
468
		// Access but the plugin is not installed
469
		elseif ( ! $wp_plugin ) {
470
471
			$href = add_query_arg(
472
				array(
473
					'action'   => 'install-plugin',
474
					'plugin'   => $download_info['slug'],
475
					'_wpnonce' => wp_create_nonce( 'install-plugin_' . $download_info['slug'] ),
476
				),
477
				self_admin_url( 'update.php' )
478
			);
479
480
			$status = 'notinstalled';
481
			$status_label = __( 'Not Installed', 'gravityview' );
482
			$button_label = __( 'Install', 'gravityview' );
483
484
		}
485
486
		// Access and the plugin is installed but not active
487
		elseif ( false === $wp_plugin['activated'] ) {
488
			$status = 'inactive';
489
			$status_label = __( 'Inactive', 'gravityview' );
490
			$button_label = __( 'Activate', 'gravityview' );
491
			$plugin_path = $wp_plugin['path'];
492
493
		}
494
495
		// Access and the plugin is installed and active
496
		else {
497
498
			$plugin_path = $wp_plugin['path'];
499
			$status = 'active';
500
			$status_label = __( 'Active', 'gravityview' );
501
			$button_label = __( 'Deactivate', 'gravityview' );
502
503
		}
504
505
		return compact( 'download_info','plugin_path', 'status', 'status_label', 'button_title', 'button_class', 'button_label', 'href', 'spinner', 'item_class', 'required_license', 'is_active' );
506
    }
507
508
	/**
509
     * Returns the base price for an extension
510
     *
511
	 * @param array $download
512
	 *
513
	 * @return float Base price for an extension. If not for sale separately, returns 0
514
	 */
515
	private function get_download_base_price( $download ) {
516
517
	    $base_price = \GV\Utils::get( $download, 'pricing/amount', 0 );
518
		$base_price = \GFCommon::to_number( $base_price );
519
520
		unset( $download['pricing']['amount'] );
521
522
		// Price options array, not single price
523
		if ( ! $base_price && ! empty( $download['pricing'] ) ) {
524
			$base_price = array_shift( $download['pricing'] );
525
		}
526
527
		return floatval( $base_price );
528
    }
529
530
	/**
531
	 * Handle AJAX request to activate extension
532
	 *
533
	 * @return void Exits with JSON response
534
	 */
535
	public function activate_download() {
536
		$data = \GV\Utils::_POST( 'data', array() );
537
538
		if ( empty( $data['path'] ) ) {
539
			return;
540
		}
541
542
		$result = activate_plugin( $data['path'] );
543
544
		if ( is_wp_error( $result ) || ! is_plugin_active( $data['path'] ) ) {
545
			wp_send_json_error( array(
546
                'error' => sprintf( __( 'Plugin activation failed: %s', 'gravityview' ), $result->get_error_message() )
547
            ) );
548
		}
549
550
		wp_send_json_success();
551
	}
552
553
	/**
554
	 * Handle AJAX request to deactivate extension
555
	 *
556
	 * @return void Send JSON response status and error message
557
	 */
558
	public function deactivate_download() {
559
		$data = \GV\Utils::_POST( 'data', array() );
560
561
		if ( empty( $data['path'] ) ) {
562
			return;
563
		}
564
565
		deactivate_plugins( $data['path'] );
566
567
		if( is_plugin_active( $data['path'] ) ) {
568
            wp_send_json_error( array(
569
                'error' => sprintf( __( 'Plugin deactivation failed.', 'gravityview' ) )
570
            ) );
571
        }
572
573
		wp_send_json_success();
574
	}
575
576
	/**
577
	 * Register and enqueue assets; localize script
578
	 *
579
	 * @return void
580
	 */
581
	public function maybe_enqueue_scripts_and_styles() {
582
583
		if ( ! gravityview()->request->is_admin( '', 'downloads' ) ) {
0 ignored issues
show
Unused Code introduced by
The call to Request::is_admin() has too many arguments starting with ''.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
584
			return;
585
		}
586
587
		$script_debug = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
588
589
		wp_enqueue_style( 'gravityview-admin-installer', GRAVITYVIEW_URL . 'assets/css/admin-installer.css', array(), \GV\Plugin::$version );
590
591
		wp_enqueue_script( 'gravityview-admin-installer', GRAVITYVIEW_URL . 'assets/js/admin-installer' . $script_debug . '.js', array( 'jquery' ), \GV\Plugin::$version, true );
592
593
		wp_localize_script( 'gravityview-admin-installer', 'gvAdminInstaller', array(
594
			'activateErrorLabel'    => __( 'Plugin activation failed.', 'gravityview' ),
595
			'deactivateErrorLabel'  => __( 'Plugin deactivation failed.', 'gravityview' ),
596
			'activeStatusLabel'     => __( 'Active', 'gravityview' ),
597
			'inactiveStatusLabel'   => __( 'Inactive', 'gravityview' ),
598
			'activateActionLabel'   => __( 'Activate', 'gravityview' ),
599
			'deactivateActionLabel' => __( 'Deactivate', 'gravityview' )
600
		) );
601
	}
602
}
603
604
new GravityView_Admin_Installer;
605