Completed
Pull Request — develop (#1436)
by Zack
19:56
created

get_download_base_price()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
cc 3
nc 2
nop 1
dl 0
loc 14
ccs 0
cts 8
cp 0
crap 12
rs 9.7998
c 0
b 0
f 0
1
<?php
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 && ! isset( $_GET['cache'] ) ) {
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( 'Manage Add-Ons', 'Extensions are WordPress plugins that add functionality to GravityView and Gravity Forms', 'gravityview' );
101
102
		$menu_text = sprintf( '<span title="%s" style="margin: 0">%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...
Unused Code introduced by
The call to Frontend_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 && ! isset( $_GET['cache'] ) ) {
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(
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 ) );
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>' );
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
				$this->render_section( 'views', esc_html__( 'GravityView Layouts', 'gravityview' ), $downloads_data, $wp_plugins );
317
318
				$this->render_section( 'extensions', esc_html__( 'GravityView Extensions', 'gravityview' ), $downloads_data, $wp_plugins );
319
320
				$this->render_section(  'plugins', esc_html__( 'Gravity Forms Add-Ons', 'gravityview' ), $downloads_data, $wp_plugins );
321
322
				$this->render_section(  'friends', esc_html__( 'Friends of GravityView', 'gravityview' ), $downloads_data, $wp_plugins );
323
				?>
324
            </div>
325
        </div>
326
		<?php
327
	}
328
329
	private function render_section( $section_slug, $heading, $downloads_data, $wp_plugins = array() ) {
330
331
		ob_start();
332
333
		foreach ( $downloads_data as $download ) {
334
335
			if ( $section_slug !== \GV\Utils::get( $download, 'info/category/0/slug' ) && $section_slug !== \GV\Utils::get( $download, 'info/category/1/slug' ) ) {
336
				continue;
337
			}
338
339
			if ( empty( $download['info'] ) ) {
340
				continue;
341
			}
342
343
			$this->render_download( $download, $wp_plugins );
344
		}
345
346
		$output = ob_get_clean();
347
		$output = trim( $output );
348
349
		if ( ! empty( $output ) ) {
350
			echo '<div class="clearfix" style="width:100%;"><h3 style="font-size: 1.5em;">' . esc_html( $heading ) . '</h3></div>';
351
			echo $output;
352
		}
353
	}
354
355
	/**
356
	 * Outputs the HTML of a single download
357
	 *
358
	 * @param array $download Download data, as returned from EDD API
359
	 * @param array $wp_plugins
360
	 *
361
	 * @return void
362
	 */
363
	protected function render_download( $download, $wp_plugins ) {
364
365
        $details = $this->get_download_display_details( $download, $wp_plugins );
366
367
        $download_info = $details['download_info'];
368
369
		?>
370
        <div class="item <?php echo esc_attr( $details['item_class'] ); ?>">
371
            <div class="addon-inner">
372
                <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>
373
                <h3><?php echo esc_html( \GV\Utils::get( $download_info, 'installer_title', $download_info['title'] ) ); ?></h3>
374
                <div>
375
                    <?php if( ! empty( $details['status_label'] ) ) { ?>
376
                    <div class="status <?php echo esc_attr( $details['status'] ); ?>" title="<?php printf( esc_attr__( 'Plugin status: %s', 'gravityview' ), esc_html( $details['status_label'] ) ); ?>">
377
                        <span class="dashicons dashicons-admin-plugins"></span> <span class="status-label"><?php echo esc_html( $details['status_label'] ); ?></span>
378
                    </div>
379
			        <?php } ?>
380
381
                    <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'] ); ?>">
382
                        <span class="title"><?php echo esc_html( $details['button_label'] ); ?></span>
383
                        <?php if( $details['spinner'] ) { ?><span class="spinner"></span><?php } ?>
384
                    </a>
385
                </div>
386
387
                <div class="addon-excerpt"><?php
388
389
                    $excerpt = \GV\Utils::get( $download_info, 'installer_excerpt', $download_info['excerpt'] );
390
391
                    // Allow some pure HTML tags, but remove everything else from the excerpt.
392
                    $tags = array( '<strong>', '</strong>', '<em>', '</em>', '<code>', '</code>' );
393
                    $replacements = array( '[b]', '[/b]', '[i]', '[/i]', '[code]', '[/code]' );
394
395
                    $excerpt = str_replace( $tags, $replacements, $excerpt );
396
                    $excerpt = esc_html( strip_tags( $excerpt ) );
397
					$excerpt = str_replace( $replacements, $tags, $excerpt );
398
399
					echo wpautop( $excerpt );
400
                ?></div>
401
            </div>
402
        </div>
403
		<?php
404
	}
405
406
	/**
407
     * Generates details array for the download to keep the render_download() method a bit tidier
408
     *
409
	 * @param array $download Single download, as returned by {@see get_downloads_data}
410
	 * @param array $wp_plugins All active plugins, as returned by {@see get_plugins()}
411
	 *
412
	 * @return array {
413
     *   @type array $download_info
414
     *   @type string $plugin_path
415
     *   @type string $status License status returned by Easy Digital Downloads ("active", "inactive", "expired", "revoked", etc)
416
     *   @type string $status_label
417
     *   @type string $button_title Title attribute to show when hovering over the download's button
418
     *   @type string $button_class CSS class to use for the button
419
     *   @type string $button_label Text to use for the download's anchor link
420
     *   @type string $href URL for the download's button
421
     *   @type bool   $spinner Whether to show the spinner icon
422
     *   @type string $item_class CSS class for the download container
423
     *   @type string $required_license The name of the required license for the download ("All Access" or "Core + Extensions")
424
     *   @type bool   $is_active Is the current GravityView license (as entered in Settings) active?
425
     * }
426
	 */
427
	private function get_download_display_details( $download, $wp_plugins ) {
428
429
		$download_info = wp_parse_args( (array) $download['info'], array(
430
			'thumbnail' => '',
431
			'title' => '',
432
			'textdomain' => '',
433
			'slug' => '',
434
			'excerpt' => '',
435
			'link' => '',
436
            'coming_soon' => false,
437
			'installer_title' => null, // May not be defined
438
			'installer_excerpt' => null, // May not be defined
439
		) );
440
441
		$wp_plugin = \GV\Utils::get( $wp_plugins, $download_info['textdomain'], false );
442
443
		$has_access = ! empty( $download['files'] );
444
		$spinner = true;
445
		$href = $plugin_path = '#';
446
		$status = $item_class = $button_title = $button_class = '';
447
		$base_price = $this->get_download_base_price( $download );
448
		$is_active = in_array( gravityview()->plugin->settings->get( 'license_key_response/license' ), array( 'active', 'valid' ), true );
449
		$galactic_only = in_array( \GV\Utils::get( $download, 'info/category/0/slug' ), array( 'plugins', 'views' ) );
450
		$required_license = $galactic_only ? __( 'All Access', 'gravityview' ) : __( 'Core + Extensions', 'gravityview' );
451
452
		// The license is not active - no matter what level, this should not work
453
		if( ! $is_active  && empty( $base_price ) ) {
454
			$spinner      = false;
455
			$status_label = '';
456
			$button_class = 'disabled disabled-license';
457
			$button_label = sprintf( __( 'Active %s License is Required.', 'gravityview' ), $required_license );
458
		}
459
460
		// No access with the current license level, and the download is available to purchase
461
		elseif ( ! $has_access && ! empty( $base_price ) ) {
462
			$spinner      = false;
463
			$status_label = '';
464
			$button_label = sprintf( __( 'Purchase Now for %s', 'gravityview' ), '$' . $base_price );
465
			$button_class = 'button-primary button-large';
466
			$href         = $download_info['link'];
467
			$item_class   = 'featured';
468
		}
469
470
		// No access with the current license level, and the download is not sold separately
471
		elseif ( ! $has_access && $is_active ) {
472
			$spinner      = false;
473
			$status_label = '';
474
			$button_label = sprintf( __( 'Upgrade to %s for Access', 'gravityview' ), $required_license );
475
			$button_class = 'button-primary button-large';
476
			$href         = 'https://gravityview.co/pricing/?utm_source=admin-installer&utm_medium=admin&utm_campaign=Admin%20Notice&utm_content=' . $required_license;
477
		}
478
479
        elseif ( ! empty( $download_info['coming_soon'] ) ) {
480
	        $spinner      = false;
481
	        $status       = 'notinstalled';
482
	        $status_label = __( 'Coming Soon', 'gravityview' );
483
	        $button_label = __( 'Learn More', 'gravityview' );
484
	        $button_class = 'button-primary button-large';
485
	        $href         = \GV\Utils::get( $download_info, 'link', 'https://gravityview.co/extensions/' );
486
        }
487
488
		// Access but the plugin is not installed
489
		elseif ( ! $wp_plugin ) {
490
491
			$href = add_query_arg(
492
				array(
493
					'action'   => 'install-plugin',
494
					'plugin'   => $download_info['slug'],
495
					'_wpnonce' => wp_create_nonce( 'install-plugin_' . $download_info['slug'] ),
496
				),
497
				self_admin_url( 'update.php' )
498
			);
499
500
			$status = 'notinstalled';
501
			$status_label = __( 'Not Installed', 'gravityview' );
502
			$button_label = __( 'Install', 'gravityview' );
503
504
		}
505
506
		// Access and the plugin is installed but not active
507
		elseif ( false === $wp_plugin['activated'] ) {
508
			$status = 'inactive';
509
			$status_label = __( 'Inactive', 'gravityview' );
510
			$button_label = __( 'Activate', 'gravityview' );
511
			$plugin_path = $wp_plugin['path'];
512
513
		}
514
515
		// Access and the plugin is installed and active
516
		else {
517
518
			$plugin_path = $wp_plugin['path'];
519
			$status = 'active';
520
			$status_label = __( 'Active', 'gravityview' );
521
			$button_label = __( 'Deactivate', 'gravityview' );
522
523
		}
524
525
		return compact( 'download_info','plugin_path', 'status', 'status_label', 'button_title', 'button_class', 'button_label', 'href', 'spinner', 'item_class', 'required_license', 'is_active' );
526
    }
527
528
	/**
529
     * Returns the base price for an extension
530
     *
531
	 * @param array $download
532
	 *
533
	 * @return float Base price for an extension. If not for sale separately, returns 0
534
	 */
535
	private function get_download_base_price( $download ) {
536
537
	    $base_price = \GV\Utils::get( $download, 'pricing/amount', 0 );
538
		$base_price = \GFCommon::to_number( $base_price );
539
540
		unset( $download['pricing']['amount'] );
541
542
		// Price options array, not single price
543
		if ( ! $base_price && ! empty( $download['pricing'] ) ) {
544
			$base_price = array_shift( $download['pricing'] );
545
		}
546
547
		return floatval( $base_price );
548
    }
549
550
	/**
551
	 * Handle AJAX request to activate extension
552
	 *
553
	 * @return void Exits with JSON response
554
	 */
555
	public function activate_download() {
556
		$data = \GV\Utils::_POST( 'data', array() );
557
558
		if ( empty( $data['path'] ) ) {
559
			return;
560
		}
561
562
		$result = activate_plugin( $data['path'] );
563
564
		if ( is_wp_error( $result ) || ! is_plugin_active( $data['path'] ) ) {
565
			wp_send_json_error( array(
566
                'error' => sprintf( __( 'Plugin activation failed: %s', 'gravityview' ), $result->get_error_message() )
567
            ) );
568
		}
569
570
		wp_send_json_success();
571
	}
572
573
	/**
574
	 * Handle AJAX request to deactivate extension
575
	 *
576
	 * @return void Send JSON response status and error message
577
	 */
578
	public function deactivate_download() {
579
		$data = \GV\Utils::_POST( 'data', array() );
580
581
		if ( empty( $data['path'] ) ) {
582
			return;
583
		}
584
585
		deactivate_plugins( $data['path'] );
586
587
		if( is_plugin_active( $data['path'] ) ) {
588
            wp_send_json_error( array(
589
                'error' => sprintf( __( 'Plugin deactivation failed.', 'gravityview' ) )
590
            ) );
591
        }
592
593
		wp_send_json_success();
594
	}
595
596
	/**
597
	 * Register and enqueue assets; localize script
598
	 *
599
	 * @return void
600
	 */
601
	public function maybe_enqueue_scripts_and_styles() {
602
603
		if ( ! gravityview()->request->is_admin( '', 'downloads' ) ) {
0 ignored issues
show
Unused Code introduced by
The call to Frontend_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...
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...
604
			return;
605
		}
606
607
		$script_debug = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
608
609
		wp_enqueue_style( 'gravityview-admin-installer', GRAVITYVIEW_URL . 'assets/css/admin-installer.css', array(), \GV\Plugin::$version );
610
611
		wp_enqueue_script( 'gravityview-admin-installer', GRAVITYVIEW_URL . 'assets/js/admin-installer' . $script_debug . '.js', array( 'jquery' ), \GV\Plugin::$version, true );
612
613
		wp_localize_script( 'gravityview-admin-installer', 'gvAdminInstaller', array(
614
			'activateErrorLabel'    => __( 'Plugin activation failed.', 'gravityview' ),
615
			'deactivateErrorLabel'  => __( 'Plugin deactivation failed.', 'gravityview' ),
616
			'activeStatusLabel'     => __( 'Active', 'gravityview' ),
617
			'inactiveStatusLabel'   => __( 'Inactive', 'gravityview' ),
618
			'activateActionLabel'   => __( 'Activate', 'gravityview' ),
619
			'deactivateActionLabel' => __( 'Deactivate', 'gravityview' )
620
		) );
621
	}
622
}
623
624
new GravityView_Admin_Installer;
625