347 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			347 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace EDD\Admin\Extensions;
 | |
| 
 | |
| use \EDD\Admin\Pass_Manager;
 | |
| 
 | |
| abstract class Extension {
 | |
| 
 | |
| 	/**
 | |
| 	 * The product ID. This only needs to be set if the extending class is
 | |
| 	 * for a single product.
 | |
| 	 *
 | |
| 	 * @since 2.11.4
 | |
| 	 * @var int
 | |
| 	 */
 | |
| 	protected $item_id;
 | |
| 
 | |
| 	/**
 | |
| 	 * The settings tab where this item will show.
 | |
| 	 *
 | |
| 	 * @since 2.11.4
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected $settings_tab = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * The required AA pass level.
 | |
| 	 */
 | |
| 	const PASS_LEVEL = Pass_Manager::PERSONAL_PASS_ID;
 | |
| 
 | |
| 	/**
 | |
| 	 * The Extension Manager
 | |
| 	 *
 | |
| 	 * @var \EDD\Admin\Extensions\Extension_Manager
 | |
| 	 */
 | |
| 	protected $manager;
 | |
| 
 | |
| 	/**
 | |
| 	 * The settings section for this item.
 | |
| 	 *
 | |
| 	 * @since 2.11.5
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected $settings_section = 'general';
 | |
| 
 | |
| 	public function __construct() {
 | |
| 		$this->manager = new \EDD\Admin\Extensions\Extension_Manager( static::PASS_LEVEL );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Whether the extension is activated.
 | |
| 	 *
 | |
| 	 * @since 2.11.4
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	abstract protected function is_activated();
 | |
| 
 | |
| 	/**
 | |
| 	 * Output the settings field (installation helper).
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function settings_field() {
 | |
| 		if ( $this->is_activated() ) {
 | |
| 			return;
 | |
| 		}
 | |
| 		$this->do_single_extension_card();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Outputs a single extension card.
 | |
| 	 *
 | |
| 	 * @since 2.11.4
 | |
| 	 * @param false|int $item_id Optional: the individual extension product ID.
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function do_single_extension_card( $item_id = false ) {
 | |
| 		if ( empty( $item_id ) && empty( $this->item_id ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 		$product_data = $this->get_product_data( $item_id );
 | |
| 		if ( ! $product_data || empty( $product_data->title ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 		$this->manager->do_extension_card(
 | |
| 			$product_data,
 | |
| 			$this->get_button_parameters( $product_data, $item_id ),
 | |
| 			$this->get_link_parameters( $product_data ),
 | |
| 			$this->get_configuration( $product_data )
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Gets the product data for a specific extension.
 | |
| 	 *
 | |
| 	 * @param false|int $item_id
 | |
| 	 * @return bool|ProductData|array False if there is no data; product data object if there is, or possibly an array of arrays.
 | |
| 	 */
 | |
| 	public function get_product_data( $item_id = false ) {
 | |
| 		require_once EDD_PLUGIN_DIR . 'includes/admin/extensions/class-extensions-api.php';
 | |
| 		$api          = new ExtensionsAPI();
 | |
| 		$body         = $this->get_api_body();
 | |
| 		$api_item_id  = $item_id ?: $this->item_id;
 | |
| 		$product_data = $api->get_product_data( $body, $api_item_id );
 | |
| 		if ( ! $product_data ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		if ( $api_item_id ) {
 | |
| 			return $product_data;
 | |
| 		}
 | |
| 
 | |
| 		if ( $item_id && ! empty( $product_data[ $item_id ] ) ) {
 | |
| 			return $product_data[ $item_id ];
 | |
| 		}
 | |
| 
 | |
| 		return $product_data;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Gets the custom configuration for the extension.
 | |
| 	 *
 | |
| 	 * @since 2.11.4
 | |
| 	 * @param ProductData $product_data Optionally allows the product data to be parsed in the configuration.
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	protected function get_configuration( ProductData $product_data ) {
 | |
| 		return array();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Formats a custom description array by running wpautop and converting it to a string.
 | |
| 	 *
 | |
| 	 * @since 2.11.4
 | |
| 	 * @param array $description The custom product description.
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	protected function format_description( array $description ) {
 | |
| 		return implode( '', array_map( 'wpautop', $description ) );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Whether the current screen is an EDD setings screen.
 | |
| 	 *
 | |
| 	 * @since 2.11.4
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	protected function is_edd_settings_screen() {
 | |
| 		return edd_is_admin_page( 'settings', $this->settings_tab );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Whether the current screen is a download new/edit screen.
 | |
| 	 *
 | |
| 	 * @since 2.11.4
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	protected function is_download_edit_screen() {
 | |
| 		return edd_is_admin_page( 'download', 'edit' ) || edd_is_admin_page( 'download', 'new' );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Whether the section for an individual product can be registered/shown.
 | |
| 	 *
 | |
| 	 * @since 2.11.4
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	protected function can_show_product_section() {
 | |
| 		if ( ! $this->is_edd_settings_screen() ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 		if ( $this->is_activated() ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 		if ( ! $this->get_product_data() ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Gets the array for the body of the API request.
 | |
| 	 * Classes may need to override this (for example, to query a specific tag).
 | |
| 	 * Note that the first array key/value pair are used to create the option name.
 | |
| 	 *
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	protected function get_api_body() {
 | |
| 		return array();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Gets the type for the button data-type attribute.
 | |
| 	 * This is intended to sync with the Products API request.
 | |
| 	 * Default is product.
 | |
| 	 *
 | |
| 	 * Really a shim for array_key_first.
 | |
| 	 *
 | |
| 	 * @param array $array
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	private function get_type( array $array ) {
 | |
| 		$type = 'product';
 | |
| 		if ( empty( $array ) ) {
 | |
| 			return $type;
 | |
| 		}
 | |
| 		if ( function_exists( 'array_key_first' ) ) {
 | |
| 			return array_key_first( $array );
 | |
| 		}
 | |
| 		foreach ( $array as $key => $unused ) {
 | |
| 			return $key;
 | |
| 		}
 | |
| 
 | |
| 		return $type;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Gets the button parameters.
 | |
| 	 * Classes should not need to replace this method.
 | |
| 	 *
 | |
| 	 * @param ProductData $product_data The extension data returned from the Products API.
 | |
| 	 * @param int|false                         $item_id      Optional: the item ID.
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	protected function get_button_parameters( ProductData $product_data, $item_id = false ) {
 | |
| 		if ( empty( $item_id ) ) {
 | |
| 			$item_id = $this->item_id;
 | |
| 		}
 | |
| 		$body   = $this->get_api_body();
 | |
| 		$type   = $this->get_type( $body );
 | |
| 		$id     = ! empty( $body[ $type ] ) ? $body[ $type ] : $this->item_id;
 | |
| 		$button = array(
 | |
| 			'type'    => $type,
 | |
| 			'id'      => $id,
 | |
| 			'product' => $item_id,
 | |
| 		);
 | |
| 		// If the extension is not installed, the button will prompt to install and activate it.
 | |
| 		if ( ! $this->manager->is_plugin_installed( $product_data->basename ) ) {
 | |
| 			if ( $this->manager->pass_can_download() ) {
 | |
| 				$button = array(
 | |
| 					/* translators: The extension name. */
 | |
| 					'button_text' => sprintf( __( 'Log In to Your Account to Download %s', 'easy-digital-downloads' ), $product_data->title ),
 | |
| 					'href'        => $this->get_upgrade_url( $product_data, $item_id, true ),
 | |
| 					'new_tab'     => true,
 | |
| 					'type'        => $type,
 | |
| 				);
 | |
| 			} else {
 | |
| 				$button = array(
 | |
| 					/* translators: The extension name. */
 | |
| 					'button_text' => sprintf( __( 'Upgrade Today to Access %s!', 'easy-digital-downloads' ), $product_data->title ),
 | |
| 					'href'        => $this->get_upgrade_url( $product_data, $item_id ),
 | |
| 					'new_tab'     => true,
 | |
| 					'type'        => $type,
 | |
| 				);
 | |
| 			}
 | |
| 		} elseif ( ! empty( $product_data->basename ) && ! $this->manager->is_plugin_active( $product_data->basename ) ) {
 | |
| 			// If the extension is installed, but not activated, the button will prompt to activate it.
 | |
| 			$button['plugin'] = $product_data->basename;
 | |
| 			$button['action'] = 'activate';
 | |
| 			/* translators: The extension name. */
 | |
| 			$button['button_text'] = sprintf( __( 'Activate %s', 'easy-digital-downloads' ), $product_data->title );
 | |
| 		}
 | |
| 
 | |
| 		return $button;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Gets the upgrade URL for the button.
 | |
| 	 *
 | |
| 	 * @since 2.11.4
 | |
| 	 * @param ProductData $product_data The product data object.
 | |
| 	 * @param int                               $item_id      The item/product ID.
 | |
| 	 * @param bool                              $has_access   Whether the user already has access to the extension (based on pass level).
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	private function get_upgrade_url( ProductData $product_data, $item_id, $has_access = false ) {
 | |
| 		if ( $has_access ) {
 | |
| 			$url = 'https://easydigitaldownloads.com/your-account/your-downloads/';
 | |
| 		} else {
 | |
| 			$url = 'https://easydigitaldownloads.com/lite-upgrade';
 | |
| 		}
 | |
| 
 | |
| 		$utm_parameters = array(
 | |
| 			'utm_medium'  => $this->settings_section,
 | |
| 			'utm_content' => $product_data->slug,
 | |
| 		);
 | |
| 
 | |
| 		return edd_link_helper(
 | |
| 			$url,
 | |
| 			$utm_parameters
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Gets the array of parameters for the link to configure the extension.
 | |
| 	 *
 | |
| 	 * @since 2.11.4
 | |
| 	 * @param ProductData  $product_data  The product data object.
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	protected function get_link_parameters( ProductData $product_data ) {
 | |
| 		$configuration = $this->get_configuration( $product_data );
 | |
| 		$tab           = ! empty( $configuration['tab'] ) ? $configuration['tab'] : $product_data->tab;
 | |
| 		$section       = ! empty( $configuration['section'] ) ? $configuration['section'] : $product_data->section;
 | |
| 		if ( empty( $tab ) && empty( $section ) ) {
 | |
| 			return array(
 | |
| 				/* translators: the plural Downloads label. */
 | |
| 				'button_text' => sprintf( __( 'View %s', 'easy-digital-downloads' ), edd_get_label_plural() ),
 | |
| 				'href'        => add_query_arg(
 | |
| 					array(
 | |
| 						'post_type' => 'download',
 | |
| 					),
 | |
| 					admin_url( 'edit.php' )
 | |
| 				),
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		return array(
 | |
| 			/* translators: The extension name. */
 | |
| 			'button_text' => sprintf( __( 'Configure %s', 'easy-digital-downloads' ), $product_data->title ),
 | |
| 			'href'        => edd_get_admin_url(
 | |
| 				array(
 | |
| 					'page'    => 'edd-settings',
 | |
| 					'tab'     => urlencode( $tab ),
 | |
| 					'section' => urlencode( $section ),
 | |
| 				)
 | |
| 			),
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Optionally hides the submit button on screens where it's not needed.
 | |
| 	 *
 | |
| 	 * @since 2.11.4
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function hide_submit_button() {
 | |
| 		if ( ! $this->can_show_product_section() ) {
 | |
| 			return;
 | |
| 		}
 | |
| 		?>
 | |
| 		<style>p.submit{display:none;}</style>
 | |
| 		<?php
 | |
| 	}
 | |
| }
 |