1022 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			1022 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * HTML elements
 | |
|  *
 | |
|  * A helper class for outputting common HTML elements, such as product drop downs
 | |
|  *
 | |
|  * @package     EDD
 | |
|  * @subpackage  Classes/HTML
 | |
|  * @copyright   Copyright (c) 2018, Easy Digital Downloads, LLC
 | |
|  * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
 | |
|  * @since       1.5
 | |
|  */
 | |
| 
 | |
| // Exit if accessed directly
 | |
| defined( 'ABSPATH' ) || exit;
 | |
| 
 | |
| /**
 | |
|  * EDD_HTML_Elements Class
 | |
|  *
 | |
|  * @since 1.5
 | |
|  */
 | |
| class EDD_HTML_Elements {
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders an HTML Dropdown of all the Products (Downloads)
 | |
| 	 *
 | |
| 	 * @since 1.5
 | |
| 	 *
 | |
| 	 * @param array $args Arguments for the dropdown
 | |
| 	 *
 | |
| 	 * @return string $output Product dropdown
 | |
| 	 */
 | |
| 	public function product_dropdown( $args = array() ) {
 | |
| 		$defaults = array(
 | |
| 			'name'                 => 'products',
 | |
| 			'id'                   => 'products',
 | |
| 			'class'                => '',
 | |
| 			'multiple'             => false,
 | |
| 			'selected'             => 0,
 | |
| 			'chosen'               => false,
 | |
| 			'number'               => 30,
 | |
| 			'bundles'              => true,
 | |
| 			'variations'           => false,
 | |
| 			'show_variations_only' => false,
 | |
| 			'placeholder'          => sprintf( __( 'Choose a %s', 'easy-digital-downloads' ), edd_get_label_singular() ),
 | |
| 			'data'                 => array(
 | |
| 				'search-type'        => 'download',
 | |
| 				'search-placeholder' => sprintf( __( 'Search %s', 'easy-digital-downloads' ), edd_get_label_plural() ),
 | |
| 			),
 | |
| 			'required'             => false,
 | |
| 			'products'             => array(),
 | |
| 		);
 | |
| 
 | |
| 		$args = wp_parse_args( $args, $defaults );
 | |
| 
 | |
| 		$products = $args['products'];
 | |
| 		if ( empty( $args['products'] ) ) {
 | |
| 			$products = $this->get_products( $args );
 | |
| 		}
 | |
| 		$existing_ids = wp_list_pluck( $products, 'ID' );
 | |
| 		if ( ! empty( $args['selected'] ) ) {
 | |
| 
 | |
| 			$selected_items = $args['selected'];
 | |
| 			if ( ! is_array( $selected_items ) ) {
 | |
| 				$selected_items = array( $selected_items );
 | |
| 			}
 | |
| 
 | |
| 			foreach ( $selected_items as $selected_item ) {
 | |
| 				if ( ! in_array( $selected_item, $existing_ids, true ) ) {
 | |
| 
 | |
| 					// If the selected item has a variation, we just need the product ID.
 | |
| 					$has_variation = strpos( $selected_item, '_' );
 | |
| 					if ( false !== $has_variation ) {
 | |
| 						$selected_item = substr( $selected_item, 0, $has_variation );
 | |
| 					}
 | |
| 
 | |
| 					$post = get_post( $selected_item );
 | |
| 					if ( ! is_null( $post ) ) {
 | |
| 						$products[] = $post;
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$options = array(
 | |
| 			'' => '',
 | |
| 		);
 | |
| 		if ( $products ) {
 | |
| 			foreach ( $products as $product ) {
 | |
| 				$has_variations = edd_has_variable_prices( $product->ID );
 | |
| 
 | |
| 				// If a product has no variations, just add it to the list and continue.
 | |
| 				if ( ! $has_variations ) {
 | |
| 					$title                             = esc_html( $product->post_title );
 | |
| 					$options[ absint( $product->ID ) ] = $title;
 | |
| 
 | |
| 					continue;
 | |
| 				}
 | |
| 
 | |
| 				// The product does have variations. Add the top level product to the list
 | |
| 				// if not showing variations, or not showing variations only.
 | |
| 				if ( false === $args['variations'] || ! $args['show_variations_only'] ) {
 | |
| 					$title = esc_html( $product->post_title );
 | |
| 					if ( ! $args['show_variations_only'] ) {
 | |
| 						$title .= ' (' . __( 'All Price Options', 'easy-digital-downloads' ) . ')';
 | |
| 					}
 | |
| 					$options[ absint( $product->ID ) ] = $title;
 | |
| 				}
 | |
| 
 | |
| 				// If showing variations, add them to the list.
 | |
| 				if ( $args['variations'] ) {
 | |
| 					$prices = edd_get_variable_prices( $product->ID );
 | |
| 					foreach ( $prices as $key => $value ) {
 | |
| 						$name = ! empty( $value['name'] ) ? $value['name'] : '';
 | |
| 						if ( $name ) {
 | |
| 							$options[ absint( $product->ID ) . '_' . $key ] = esc_html( $product->post_title . ': ' . $name );
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// This ensures that any selected products are included in the drop down
 | |
| 		if ( is_array( $args['selected'] ) ) {
 | |
| 			foreach ( $args['selected'] as $item ) {
 | |
| 				if ( ! array_key_exists( $item, $options ) ) {
 | |
| 
 | |
| 					$parsed_item = edd_parse_product_dropdown_value( $item );
 | |
| 
 | |
| 					if ( $parsed_item['price_id'] !== false ) {
 | |
| 						$prices = edd_get_variable_prices( (int) $parsed_item['download_id'] );
 | |
| 						foreach ( $prices as $key => $value ) {
 | |
| 							$name = ( isset( $value['name'] ) && ! empty( $value['name'] ) ) ? $value['name'] : '';
 | |
| 
 | |
| 							if ( $name && (int) $parsed_item['price_id'] === (int) $key ) {
 | |
| 								$options[ absint( $product->ID ) . '_' . $key ] = esc_html( get_the_title( (int) $parsed_item['download_id'] ) . ': ' . $name );
 | |
| 							}
 | |
| 						}
 | |
| 					} else {
 | |
| 						$options[ $parsed_item['download_id'] ] = get_the_title( $parsed_item['download_id'] );
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		} elseif ( false !== $args['selected'] && $args['selected'] !== 0 ) {
 | |
| 			if ( ! array_key_exists( $args['selected'], $options ) ) {
 | |
| 				$parsed_item = edd_parse_product_dropdown_value( $args['selected'] );
 | |
| 
 | |
| 				if ( $parsed_item['price_id'] !== false ) {
 | |
| 					$prices = edd_get_variable_prices( (int) $parsed_item['download_id'] );
 | |
| 
 | |
| 					foreach ( $prices as $key => $value ) {
 | |
| 						$name = ( isset( $value['name'] ) && ! empty( $value['name'] ) ) ? $value['name'] : '';
 | |
| 
 | |
| 						if ( $name && (int) $parsed_item['price_id'] === (int) $key ) {
 | |
| 							$options[ absint( $product->ID ) . '_' . $key ] = esc_html( get_the_title( (int) $parsed_item['download_id'] ) . ': ' . $name );
 | |
| 						}
 | |
| 					}
 | |
| 				} else {
 | |
| 					$options[ $parsed_item['download_id'] ] = get_the_title( $parsed_item['download_id'] );
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if ( ! $args['bundles'] ) {
 | |
| 			$args['class'] .= ' no-bundles';
 | |
| 		}
 | |
| 
 | |
| 		if ( $args['variations'] ) {
 | |
| 			$args['class'] .= ' variations';
 | |
| 		}
 | |
| 
 | |
| 		if ( $args['show_variations_only'] ) {
 | |
| 			$args['class'] .= ' variations-only';
 | |
| 		}
 | |
| 
 | |
| 		// 'all' gets created as an option if passed via the `selected` argument.
 | |
| 		if ( isset( $options['all'] ) ) {
 | |
| 			unset( $options['all'] );
 | |
| 		}
 | |
| 
 | |
| 		$output = $this->select( array(
 | |
| 			'name'             => $args['name'],
 | |
| 			'selected'         => $args['selected'],
 | |
| 			'id'               => $args['id'],
 | |
| 			'class'            => $args['class'],
 | |
| 			'options'          => $options,
 | |
| 			'chosen'           => $args['chosen'],
 | |
| 			'multiple'         => $args['multiple'],
 | |
| 			'placeholder'      => $args['placeholder'],
 | |
| 			'show_option_all'  => isset( $args['show_option_all'] ) ? $args['show_option_all'] : false,
 | |
| 			'show_option_none' => false,
 | |
| 			'data'             => $args['data'],
 | |
| 			'required'         => $args['required'],
 | |
| 		) );
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get EDD products for the product dropdown.
 | |
| 	 *
 | |
| 	 * @param array  $args     Parameters for the get_posts function.
 | |
| 	 * @return array WP_Post[] Array of download objects.
 | |
| 	 */
 | |
| 	public function get_products( $args = array() ) {
 | |
| 		$defaults = array(
 | |
| 			'number'  => 30,
 | |
| 			'bundles' => true,
 | |
| 		);
 | |
| 
 | |
| 		$args = wp_parse_args( $args, $defaults );
 | |
| 
 | |
| 		$product_args = array(
 | |
| 			'post_type'      => 'download',
 | |
| 			'orderby'        => 'title',
 | |
| 			'order'          => 'ASC',
 | |
| 			'posts_per_page' => $args['number'],
 | |
| 		);
 | |
| 
 | |
| 		if ( ! current_user_can( 'edit_products' ) ) {
 | |
| 			$product_args['post_status'] = apply_filters( 'edd_product_dropdown_status_nopriv', array( 'publish' ) );
 | |
| 		} else {
 | |
| 			$product_args['post_status'] = apply_filters(
 | |
| 				'edd_product_dropdown_status',
 | |
| 				array(
 | |
| 					'publish',
 | |
| 					'draft',
 | |
| 					'private',
 | |
| 					'future',
 | |
| 				)
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		if ( is_array( $product_args['post_status'] ) ) {
 | |
| 
 | |
| 			// Given the array, sanitize them.
 | |
| 			$product_args['post_status'] = array_map( 'sanitize_text_field', $product_args['post_status'] );
 | |
| 		} else {
 | |
| 
 | |
| 			// If we didn't get an array, fallback to 'publish'.
 | |
| 			$product_args['post_status'] = array( 'publish' );
 | |
| 		}
 | |
| 
 | |
| 		// Maybe disable bundles.
 | |
| 		if ( ! $args['bundles'] ) {
 | |
| 			$product_args['meta_query'] = array(
 | |
| 				'relation' => 'OR',
 | |
| 				array(
 | |
| 					'key'     => '_edd_product_type',
 | |
| 					'value'   => 'bundle',
 | |
| 					'compare' => '!=',
 | |
| 				),
 | |
| 				array(
 | |
| 					'key'     => '_edd_product_type',
 | |
| 					'value'   => 'bundle',
 | |
| 					'compare' => 'NOT EXISTS',
 | |
| 				),
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		$product_args = apply_filters( 'edd_product_dropdown_args', $product_args );
 | |
| 
 | |
| 		return get_posts( $product_args );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders an HTML Dropdown of all customers
 | |
| 	 *
 | |
| 	 * @since 2.2
 | |
| 	 *
 | |
| 	 * @param array $args
 | |
| 	 *
 | |
| 	 * @return string $output Customer dropdown
 | |
| 	 */
 | |
| 	public function customer_dropdown( $args = array() ) {
 | |
| 		$defaults = array(
 | |
| 			'name'          => 'customers',
 | |
| 			'id'            => 'customers',
 | |
| 			'class'         => '',
 | |
| 			'multiple'      => false,
 | |
| 			'selected'      => 0,
 | |
| 			'chosen'        => true,
 | |
| 			'placeholder'   => __( 'Choose a Customer', 'easy-digital-downloads' ),
 | |
| 			'number'        => 30,
 | |
| 			'data'          => array(
 | |
| 				'search-type'        => 'customer',
 | |
| 				'search-placeholder' => __( 'Search Customers', 'easy-digital-downloads' ),
 | |
| 			),
 | |
| 			'none_selected' => __( 'No customer attached', 'easy-digital-downloads' ),
 | |
| 			'required'      => false,
 | |
| 		);
 | |
| 
 | |
| 		$args = wp_parse_args( $args, $defaults );
 | |
| 
 | |
| 		$customers = edd_get_customers( array(
 | |
| 			'number' => $args['number'],
 | |
| 		) );
 | |
| 
 | |
| 		$options = array();
 | |
| 
 | |
| 		if ( $customers ) {
 | |
| 			$options[0] = $args['none_selected'];
 | |
| 			foreach ( $customers as $customer ) {
 | |
| 				$options[ absint( $customer->id ) ] = esc_html( $customer->name . ' (' . $customer->email . ')' );
 | |
| 			}
 | |
| 		} else {
 | |
| 			$options[0] = __( 'No customers found', 'easy-digital-downloads' );
 | |
| 		}
 | |
| 
 | |
| 		if ( ! empty( $args['selected'] ) ) {
 | |
| 
 | |
| 			// If a selected customer has been specified, we need to ensure it's in the initial list of customers displayed
 | |
| 			if ( ! array_key_exists( $args['selected'], $options ) ) {
 | |
| 				$customer = new EDD_Customer( $args['selected'] );
 | |
| 
 | |
| 				if ( $customer ) {
 | |
| 					$options[ absint( $args['selected'] ) ] = esc_html( $customer->name . ' (' . $customer->email . ')' );
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$output = $this->select( array(
 | |
| 			'name'             => $args['name'],
 | |
| 			'selected'         => $args['selected'],
 | |
| 			'id'               => $args['id'],
 | |
| 			'class'            => $args['class'] . ' edd-customer-select',
 | |
| 			'options'          => $options,
 | |
| 			'multiple'         => $args['multiple'],
 | |
| 			'placeholder'      => $args['placeholder'],
 | |
| 			'chosen'           => $args['chosen'],
 | |
| 			'show_option_all'  => false,
 | |
| 			'show_option_none' => false,
 | |
| 			'data'             => $args['data'],
 | |
| 			'required'         => $args['required'],
 | |
| 		) );
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders an HTML Dropdown of all the Users
 | |
| 	 *
 | |
| 	 * @since 2.6.9
 | |
| 	 *
 | |
| 	 * @param array $args
 | |
| 	 *
 | |
| 	 * @return string $output User dropdown
 | |
| 	 */
 | |
| 	public function user_dropdown( $args = array() ) {
 | |
| 		$defaults = array(
 | |
| 			'name'        => 'users',
 | |
| 			'id'          => 'users',
 | |
| 			'class'       => '',
 | |
| 			'multiple'    => false,
 | |
| 			'selected'    => 0,
 | |
| 			'chosen'      => true,
 | |
| 			'placeholder' => __( 'Select a User', 'easy-digital-downloads' ),
 | |
| 			'number'      => 30,
 | |
| 			'data'        => array(
 | |
| 				'search-type'        => 'user',
 | |
| 				'search-placeholder' => __( 'Search Users', 'easy-digital-downloads' ),
 | |
| 			),
 | |
| 			'required'    => false,
 | |
| 		);
 | |
| 
 | |
| 		$args = wp_parse_args( $args, $defaults );
 | |
| 
 | |
| 		$user_args = array(
 | |
| 			'number' => $args['number'],
 | |
| 		);
 | |
| 		$users     = get_users( $user_args );
 | |
| 		$options   = array();
 | |
| 
 | |
| 		if ( $users ) {
 | |
| 			foreach ( $users as $user ) {
 | |
| 				$options[ $user->ID ] = esc_html( $user->display_name );
 | |
| 			}
 | |
| 		} else {
 | |
| 			$options[0] = __( 'No users found', 'easy-digital-downloads' );
 | |
| 		}
 | |
| 
 | |
| 		$selected = $args['selected'];
 | |
| 		if ( ! is_array( $selected ) ) {
 | |
| 			$selected = array( $selected );
 | |
| 		}
 | |
| 		// If a selected user has been specified, we need to ensure it's in the initial list of user displayed
 | |
| 		if ( ! empty( $selected ) ) {
 | |
| 			foreach ( $selected as $selected_user ) {
 | |
| 				if ( ! array_key_exists( $selected_user, $options ) ) {
 | |
| 					$user = get_userdata( $selected_user );
 | |
| 
 | |
| 					if ( $user ) {
 | |
| 						$options[ absint( $user->ID ) ] = esc_html( $user->display_name );
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$output = $this->select( array(
 | |
| 			'name'             => $args['name'],
 | |
| 			'selected'         => $args['selected'],
 | |
| 			'id'               => $args['id'],
 | |
| 			'class'            => $args['class'] . ' edd-user-select',
 | |
| 			'options'          => $options,
 | |
| 			'multiple'         => $args['multiple'],
 | |
| 			'placeholder'      => $args['placeholder'],
 | |
| 			'chosen'           => $args['chosen'],
 | |
| 			'show_option_all'  => false,
 | |
| 			'show_option_none' => false,
 | |
| 			'data'             => $args['data'],
 | |
| 			'required'         => $args['required'],
 | |
| 		) );
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders an HTML Dropdown of all the Discounts
 | |
| 	 *
 | |
| 	 * @since 1.5.2
 | |
| 	 * @since 3.0 Allow $args to be passed.
 | |
| 	 *
 | |
| 	 * @param string $name     Name attribute of the dropdown.
 | |
| 	 * @param int    $selected Discount to select automatically.
 | |
| 	 * @param string $status   Discount post_status to retrieve.
 | |
| 	 *
 | |
| 	 * @return string $output Discount dropdown
 | |
| 	 */
 | |
| 	public function discount_dropdown( $name = 'edd_discounts', $selected = 0, $status = '' ) {
 | |
| 		$defaults = array(
 | |
| 			'name'            => 'discounts',
 | |
| 			'id'              => 'discounts',
 | |
| 			'class'           => '',
 | |
| 			'multiple'        => false,
 | |
| 			'selected'        => 0,
 | |
| 			'chosen'          => true,
 | |
| 			'placeholder'     => __( 'Choose a Discount', 'easy-digital-downloads' ),
 | |
| 			'show_option_all' => __( 'All Discounts', 'easy-digital-downloads' ),
 | |
| 			'number'          => 30,
 | |
| 			'data'            => array(
 | |
| 				'search-type'        => 'discount',
 | |
| 				'search-placeholder' => __( 'Search Discounts', 'easy-digital-downloads' ),
 | |
| 			),
 | |
| 			'required'        => false,
 | |
| 		);
 | |
| 
 | |
| 		$args = func_get_args();
 | |
| 
 | |
| 		if ( 1 === func_num_args() && is_array( $args[0] ) ) {
 | |
| 			$args = wp_parse_args( $args[0], $defaults );
 | |
| 		} else {
 | |
| 			$args = wp_parse_args( array(
 | |
| 				'name'     => $name,
 | |
| 				'selected' => $selected,
 | |
| 				'nopaging' => true,
 | |
| 			), $defaults );
 | |
| 		}
 | |
| 
 | |
| 		$discount_args = array(
 | |
| 			'number' => $args['number'],
 | |
| 		);
 | |
| 
 | |
| 		if ( ! empty( $status ) ) {
 | |
| 			$discount_args['status'] = $status;
 | |
| 		}
 | |
| 
 | |
| 		$discounts = edd_get_discounts( $discount_args );
 | |
| 		$options   = array();
 | |
| 
 | |
| 		if ( $discounts ) {
 | |
| 			foreach ( $discounts as $discount ) {
 | |
| 				$options[ absint( $discount->id ) ] = esc_html( $discount->name );
 | |
| 			}
 | |
| 		} else {
 | |
| 			$options[0] = __( 'No discounts found', 'easy-digital-downloads' );
 | |
| 		}
 | |
| 
 | |
| 		$output = $this->select( array(
 | |
| 			'name'             => $args['name'],
 | |
| 			'selected'         => $args['selected'],
 | |
| 			'id'               => $args['id'],
 | |
| 			'class'            => $args['class'] . ' edd-user-select',
 | |
| 			'options'          => $options,
 | |
| 			'multiple'         => $args['multiple'],
 | |
| 			'placeholder'      => $args['placeholder'],
 | |
| 			'chosen'           => $args['chosen'],
 | |
| 			'show_option_all'  => $args['show_option_all'],
 | |
| 			'show_option_none' => false,
 | |
| 			'required'         => $args['required'],
 | |
| 		) );
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders an HTML Dropdown of all the Categories
 | |
| 	 *
 | |
| 	 * @since 1.5.2
 | |
| 	 *
 | |
| 	 * @param string $name     Name attribute of the dropdown
 | |
| 	 * @param int    $selected Category to select automatically
 | |
| 	 *
 | |
| 	 * @return string $output Category dropdown
 | |
| 	 */
 | |
| 	public function category_dropdown( $name = 'edd_categories', $selected = 0 ) {
 | |
| 		$categories = get_terms( 'download_category', apply_filters( 'edd_category_dropdown', array() ) );
 | |
| 		$options    = array();
 | |
| 
 | |
| 		foreach ( $categories as $category ) {
 | |
| 			$options[ absint( $category->term_id ) ] = esc_html( $category->name );
 | |
| 		}
 | |
| 
 | |
| 		$category_labels = edd_get_taxonomy_labels( 'download_category' );
 | |
| 		$output          = $this->select( array(
 | |
| 			'name'             => $name,
 | |
| 			'selected'         => $selected,
 | |
| 			'options'          => $options,
 | |
| 			'show_option_all'  => sprintf( _x( 'All %s', 'plural: Example: "All Categories"', 'easy-digital-downloads' ), $category_labels['name'] ),
 | |
| 			'show_option_none' => false,
 | |
| 		) );
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders an HTML Dropdown of years
 | |
| 	 *
 | |
| 	 * @since 1.5.2
 | |
| 	 *
 | |
| 	 * @param string $name         Name attribute of the dropdown.
 | |
| 	 * @param int    $selected     Year to select automatically.
 | |
| 	 * @param int    $years_before Number of years before the current year the dropdown should start with.
 | |
| 	 * @param int    $years_after  Number of years after the current year the dropdown should finish at.
 | |
| 	 * @param string $id           A unique identifier for the field.
 | |
| 	 * @return string $output Year dropdown
 | |
| 	 */
 | |
| 	public function year_dropdown( $name = 'year', $selected = 0, $years_before = 5, $years_after = 0, $id = 'edd_year_select' ) {
 | |
| 		$current    = date( 'Y' );
 | |
| 		$start_year = $current - absint( $years_before );
 | |
| 		$end_year   = $current + absint( $years_after );
 | |
| 		$selected   = empty( $selected ) ? date( 'Y' ) : $selected;
 | |
| 		$options    = array();
 | |
| 
 | |
| 		while ( $start_year <= $end_year ) {
 | |
| 			$options[ absint( $start_year ) ] = $start_year;
 | |
| 			$start_year ++;
 | |
| 		}
 | |
| 
 | |
| 		$output = $this->select(
 | |
| 			array(
 | |
| 				'name'             => $name,
 | |
| 				'id'               => $id . '_' . $name,
 | |
| 				'selected'         => $selected,
 | |
| 				'options'          => $options,
 | |
| 				'show_option_all'  => false,
 | |
| 				'show_option_none' => false,
 | |
| 			)
 | |
| 		);
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders an HTML Dropdown of months
 | |
| 	 *
 | |
| 	 * @since 1.5.2
 | |
| 	 *
 | |
| 	 * @param string  $name             Name attribute of the dropdown.
 | |
| 	 * @param int     $selected         Month to select automatically.
 | |
| 	 * @param string  $id               A unique identifier for the field.
 | |
| 	 * @param boolean $return_long_name Whether to use the long name for the month.
 | |
| 	 *
 | |
| 	 * @return string $output Month dropdown
 | |
| 	 */
 | |
| 	public function month_dropdown( $name = 'month', $selected = 0, $id = 'edd_month_select', $return_long_name = false ) {
 | |
| 		$month    = 1;
 | |
| 		$options  = array();
 | |
| 		$selected = empty( $selected ) ? date( 'n' ) : $selected;
 | |
| 
 | |
| 		while ( $month <= 12 ) {
 | |
| 			$options[ absint( $month ) ] = edd_month_num_to_name( $month, $return_long_name );
 | |
| 			$month ++;
 | |
| 		}
 | |
| 
 | |
| 		$output = $this->select(
 | |
| 			array(
 | |
| 				'name'             => $name,
 | |
| 				'id'               => $id . '_' . $name,
 | |
| 				'selected'         => $selected,
 | |
| 				'options'          => $options,
 | |
| 				'show_option_all'  => false,
 | |
| 				'show_option_none' => false,
 | |
| 			)
 | |
| 		);
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Gets the countries dropdown.
 | |
| 	 *
 | |
| 	 * @since  3.0
 | |
| 	 * @param  array  $args    The array of parameters passed to the method
 | |
| 	 * @param  string $country The selected country
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function country_select( $args = array(), $country = '' ) {
 | |
| 		$args = wp_parse_args(
 | |
| 			$args,
 | |
| 			array(
 | |
| 				'name'             => 'edd_countries',
 | |
| 				'class'            => 'edd_countries_filter',
 | |
| 				'options'          => edd_get_country_list(),
 | |
| 				'chosen'           => true,
 | |
| 				'selected'         => $country,
 | |
| 				'show_option_none' => false,
 | |
| 				'placeholder'      => __( 'Choose a Country', 'easy-digital-downloads' ),
 | |
| 				'show_option_all'  => __( 'All Countries', 'easy-digital-downloads' ),
 | |
| 				'data'             => array(
 | |
| 					'nonce' => wp_create_nonce( 'edd-country-field-nonce' ),
 | |
| 				),
 | |
| 				'required'         => false,
 | |
| 			)
 | |
| 		);
 | |
| 
 | |
| 		if ( false === strpos( $args['class'], 'edd_countries_filter' ) ) {
 | |
| 			$args['class'] .= ' edd_countries_filter';
 | |
| 		}
 | |
| 
 | |
| 		return $this->select( $args );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Gets the regions dropdown.
 | |
| 	 *
 | |
| 	 * @since  3.0
 | |
| 	 * @param  array  $args     The array of parameters passed to the method
 | |
| 	 * @param  string $country  The country from which to populate the regions
 | |
| 	 * @param  string $region   The selected region
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function region_select( $args = array(), $country = '', $region = '' ) {
 | |
| 		if ( ! $country ) {
 | |
| 			$country = edd_get_shop_country();
 | |
| 		}
 | |
| 		$args = wp_parse_args(
 | |
| 			$args,
 | |
| 			array(
 | |
| 				'name'             => 'edd_regions',
 | |
| 				'class'            => 'edd_regions_filter',
 | |
| 				'options'          => edd_get_shop_states( $country ),
 | |
| 				'chosen'           => true,
 | |
| 				'selected'         => $region,
 | |
| 				'show_option_none' => false,
 | |
| 				'placeholder'      => __( 'Choose a Region', 'easy-digital-downloads' ),
 | |
| 				'show_option_all'  => __( 'All Regions', 'easy-digital-downloads' ),
 | |
| 				'required'         => false,
 | |
| 			)
 | |
| 		);
 | |
| 
 | |
| 		if ( false === strpos( $args['class'], 'edd_regions_filter' ) ) {
 | |
| 			$args['class'] .= ' edd_regions_filter';
 | |
| 		}
 | |
| 
 | |
| 		return $this->select( $args );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders an HTML Dropdown
 | |
| 	 *
 | |
| 	 * @since 1.6
 | |
| 	 *
 | |
| 	 * @param array $args
 | |
| 	 *
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function select( $args = array() ) {
 | |
| 
 | |
| 		$args = wp_parse_args( $args, array(
 | |
| 			'options'          => array(),
 | |
| 			'name'             => null,
 | |
| 			'class'            => '',
 | |
| 			'id'               => '',
 | |
| 			'selected'         => 0,
 | |
| 			'chosen'           => false,
 | |
| 			'placeholder'      => null,
 | |
| 			'multiple'         => false,
 | |
| 			'show_option_all'  => _x( 'All', 'all dropdown items', 'easy-digital-downloads' ),
 | |
| 			'show_option_none' => _x( 'None', 'no dropdown items', 'easy-digital-downloads' ),
 | |
| 			'data'             => array(),
 | |
| 			'readonly'         => false,
 | |
| 			'disabled'         => false,
 | |
| 			'required'         => false,
 | |
| 		) );
 | |
| 
 | |
| 		$data_elements = '';
 | |
| 		foreach ( $args['data'] as $key => $value ) {
 | |
| 			$data_elements .= ' data-' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
 | |
| 		}
 | |
| 
 | |
| 		if ( $args['multiple'] ) {
 | |
| 			$multiple = ' MULTIPLE';
 | |
| 		} else {
 | |
| 			$multiple = '';
 | |
| 		}
 | |
| 
 | |
| 		if ( $args['chosen'] ) {
 | |
| 			$args['class'] .= ' edd-select-chosen';
 | |
| 			if ( is_rtl() ) {
 | |
| 				$args['class'] .= ' chosen-rtl';
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if ( $args['placeholder'] ) {
 | |
| 			$placeholder = $args['placeholder'];
 | |
| 		} else {
 | |
| 			$placeholder = '';
 | |
| 		}
 | |
| 
 | |
| 		if ( isset( $args['readonly'] ) && $args['readonly'] ) {
 | |
| 			$readonly = ' readonly="readonly"';
 | |
| 		} else {
 | |
| 			$readonly = '';
 | |
| 		}
 | |
| 
 | |
| 		if ( isset( $args['disabled'] ) && $args['disabled'] ) {
 | |
| 			$disabled = ' disabled="disabled"';
 | |
| 		} else {
 | |
| 			$disabled = '';
 | |
| 		}
 | |
| 
 | |
| 		$required = '';
 | |
| 		if ( ! empty( $args['required'] ) ) {
 | |
| 			$required = ' required';
 | |
| 		}
 | |
| 
 | |
| 		$class  = implode( ' ', array_map( 'esc_attr', explode( ' ', $args['class'] ) ) );
 | |
| 		$output = '<select' . $disabled . $readonly . $required . ' name="' . esc_attr( $args['name'] ) . '" id="' . esc_attr( str_replace( '-', '_', $args['id'] ) ) . '" class="edd-select ' . $class . '"' . $multiple . ' data-placeholder="' . $placeholder . '"' . $data_elements . '>';
 | |
| 
 | |
| 		if ( ! isset( $args['selected'] ) || ( is_array( $args['selected'] ) && empty( $args['selected'] ) ) || ! $args['selected'] ) {
 | |
| 			$selected = "";
 | |
| 		}
 | |
| 
 | |
| 		if ( ! empty( $args['show_option_all'] ) ) {
 | |
| 			if ( $args['multiple'] && ! empty( $args['selected'] ) ) {
 | |
| 				$selected = selected( true, in_array( 0, (array) $args['selected'] ), false );
 | |
| 			} elseif ( isset( $args['selected'] ) && ! is_array( $args['selected'] ) ) {
 | |
| 				$selected = selected( $args['selected'], 0, false );
 | |
| 			}
 | |
| 			$output .= '<option value="all"' . $selected . '>' . esc_html( $args['show_option_all'] ) . '</option>';
 | |
| 		}
 | |
| 
 | |
| 		if ( ! empty( $args['options'] ) ) {
 | |
| 			if ( $args['show_option_none'] ) {
 | |
| 				if ( $args['multiple'] ) {
 | |
| 					$selected = selected( true, in_array( - 1, $args['selected'] ), false );
 | |
| 				} elseif ( isset( $args['selected'] ) && ! is_array( $args['selected'] ) && ! empty( $args['selected'] ) ) {
 | |
| 					$selected = selected( $args['selected'], - 1, false );
 | |
| 				}
 | |
| 				$output .= '<option value="-1"' . $selected . '>' . esc_html( $args['show_option_none'] ) . '</option>';
 | |
| 			}
 | |
| 
 | |
| 			foreach ( $args['options'] as $key => $option ) {
 | |
| 				if ( $args['multiple'] && is_array( $args['selected'] ) ) {
 | |
| 					$selected = selected( true, in_array( (string) $key, $args['selected'] ), false );
 | |
| 				} elseif ( isset( $args['selected'] ) && ! is_array( $args['selected'] ) ) {
 | |
| 					$selected = selected( $args['selected'], $key, false );
 | |
| 				}
 | |
| 
 | |
| 				$output .= '<option value="' . esc_attr( $key ) . '"' . $selected . '>' . esc_html( $option ) . '</option>';
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$output .= '</select>';
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders an HTML Checkbox
 | |
| 	 *
 | |
| 	 * @since 1.9
 | |
| 	 * @since 3.0 Added `label` argument.
 | |
| 	 *
 | |
| 	 * @param array $args
 | |
| 	 *
 | |
| 	 * @return string Checkbox HTML code
 | |
| 	 */
 | |
| 	public function checkbox( $args = array() ) {
 | |
| 		$defaults = array(
 | |
| 			'name'    => null,
 | |
| 			'current' => null,
 | |
| 			'class'   => 'edd-checkbox',
 | |
| 			'options' => array(
 | |
| 				'disabled' => false,
 | |
| 				'readonly' => false,
 | |
| 			),
 | |
| 			'label'   => '',
 | |
| 			'value'   => null,
 | |
| 		);
 | |
| 
 | |
| 		$args = wp_parse_args( $args, $defaults );
 | |
| 
 | |
| 		$classes   = explode( ' ', $args['class'] );
 | |
| 		$classes[] = $args['name'];
 | |
| 		$class     = implode( ' ', array_map( 'sanitize_html_class', array_unique( array_filter( $classes ) ) ) );
 | |
| 
 | |
| 		$options = '';
 | |
| 		if ( ! empty( $args['options']['disabled'] ) ) {
 | |
| 			$options .= ' disabled="disabled"';
 | |
| 		} elseif ( ! empty( $args['options']['readonly'] ) ) {
 | |
| 			$options .= ' readonly';
 | |
| 		}
 | |
| 
 | |
| 		$value = '';
 | |
| 		if ( ! empty( $args['value'] ) ) {
 | |
| 			$value .= ' value="' . esc_attr( $args['value'] ) . '"';
 | |
| 		}
 | |
| 
 | |
| 		// Checked could mean 'on' or 1 or true, so sanitize it for checked()
 | |
| 		$to_check = ! empty( $args['current'] );
 | |
| 		$checked  = checked( true, $to_check, false );
 | |
| 
 | |
| 		// Get the HTML to output
 | |
| 		$output = '<input type="checkbox" name="' . esc_attr( $args['name'] ) . '" id="' . esc_attr( $args['name'] ) . '" class="' . esc_attr( $class ) . '" ' . $value . $checked . $options . ' />';
 | |
| 
 | |
| 		if ( ! empty( $args['label'] ) ) {
 | |
| 			$output .= '<label for="' . esc_attr( $args['name'] ) . '">' . wp_kses_post( $args['label'] ) . '</label>';
 | |
| 		}
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders an HTML Text field
 | |
| 	 *
 | |
| 	 * @since 1.5.2
 | |
| 	 *
 | |
| 	 * @param array $args Arguments for the text field
 | |
| 	 *
 | |
| 	 * @return string Text field
 | |
| 	 */
 | |
| 	public function text( $args = array() ) {
 | |
| 		// Backwards compatibility
 | |
| 		if ( func_num_args() > 1 ) {
 | |
| 			$args = func_get_args();
 | |
| 
 | |
| 			$name  = $args[0];
 | |
| 			$value = isset( $args[1] ) ? $args[1] : '';
 | |
| 			$label = isset( $args[2] ) ? $args[2] : '';
 | |
| 			$desc  = isset( $args[3] ) ? $args[3] : '';
 | |
| 		}
 | |
| 
 | |
| 		$defaults = array(
 | |
| 			'id'           => '',
 | |
| 			'name'         => isset( $name ) ? $name : 'text',
 | |
| 			'value'        => isset( $value ) ? $value : null,
 | |
| 			'label'        => isset( $label ) ? $label : null,
 | |
| 			'desc'         => isset( $desc ) ? $desc : null,
 | |
| 			'placeholder'  => '',
 | |
| 			'class'        => 'regular-text',
 | |
| 			'disabled'     => false,
 | |
| 			'autocomplete' => '',
 | |
| 			'data'         => false,
 | |
| 			'required'     => false,
 | |
| 		);
 | |
| 
 | |
| 		$args = wp_parse_args( $args, $defaults );
 | |
| 
 | |
| 		$class    = implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $args['class'] ) ) );
 | |
| 		$disabled = '';
 | |
| 		if ( $args['disabled'] ) {
 | |
| 			$disabled = ' disabled="disabled"';
 | |
| 		}
 | |
| 
 | |
| 		$required = '';
 | |
| 		if ( ! empty( $args['required'] ) ) {
 | |
| 			$required = ' required';
 | |
| 		}
 | |
| 
 | |
| 		$data = '';
 | |
| 		if ( ! empty( $args['data'] ) ) {
 | |
| 			foreach ( $args['data'] as $key => $value ) {
 | |
| 				$data .= 'data-' . edd_sanitize_key( $key ) . '="' . esc_attr( $value ) . '" ';
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$output = '<span id="edd-' . edd_sanitize_key( $args['name'] ) . '-wrap">';
 | |
| 		if ( ! empty( $args['label'] ) ) {
 | |
| 			$output .= '<label class="edd-label" for="' . edd_sanitize_key( $args['id'] ) . '">' . esc_html( $args['label'] ) . '</label>';
 | |
| 		}
 | |
| 
 | |
| 		if ( ! empty( $args['desc'] ) ) {
 | |
| 			$output .= '<span class="edd-description">' . esc_html( $args['desc'] ) . '</span>';
 | |
| 		}
 | |
| 
 | |
| 		$output .= '<input type="text" name="' . esc_attr( $args['name'] ) . '" id="' . esc_attr( $args['id'] ) . '" autocomplete="' . esc_attr( $args['autocomplete'] ) . '" value="' . esc_attr( $args['value'] ) . '" placeholder="' . esc_attr( $args['placeholder'] ) . '" class="' . $class . '" ' . $data . $disabled . $required . '/>';
 | |
| 
 | |
| 		$output .= '</span>';
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders a date picker
 | |
| 	 *
 | |
| 	 * @since 2.4
 | |
| 	 *
 | |
| 	 * @param array $args Arguments for the text field
 | |
| 	 *
 | |
| 	 * @return string Datepicker field
 | |
| 	 */
 | |
| 	public function date_field( $args = array() ) {
 | |
| 
 | |
| 		if ( empty( $args['class'] ) ) {
 | |
| 			$args['class']          = 'edd_datepicker';
 | |
| 			$args['data']['format'] = edd_get_date_picker_format();
 | |
| 
 | |
| 		} elseif ( ! strpos( $args['class'], 'edd_datepicker' ) ) {
 | |
| 			$args['class']          .= ' edd_datepicker';
 | |
| 			$args['data']['format'] = edd_get_date_picker_format();
 | |
| 		}
 | |
| 
 | |
| 		return $this->text( $args );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders an HTML textarea
 | |
| 	 *
 | |
| 	 * @since 1.9
 | |
| 	 *
 | |
| 	 * @param array $args Arguments for the textarea
 | |
| 	 *
 | |
| 	 * @return string textarea
 | |
| 	 */
 | |
| 	public function textarea( $args = array() ) {
 | |
| 		$defaults = array(
 | |
| 			'name'     => 'textarea',
 | |
| 			'value'    => null,
 | |
| 			'label'    => null,
 | |
| 			'desc'     => null,
 | |
| 			'class'    => 'large-text',
 | |
| 			'disabled' => false,
 | |
| 		);
 | |
| 
 | |
| 		$args = wp_parse_args( $args, $defaults );
 | |
| 
 | |
| 		$class    = implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $args['class'] ) ) );
 | |
| 		$disabled = '';
 | |
| 		if ( $args['disabled'] ) {
 | |
| 			$disabled = ' disabled="disabled"';
 | |
| 		}
 | |
| 
 | |
| 		$output = '<span id="edd-' . edd_sanitize_key( $args['name'] ) . '-wrap">';
 | |
| 
 | |
| 		if ( ! empty( $args['label'] ) ) {
 | |
| 			$output .= '<label class="edd-label" for="' . edd_sanitize_key( $args['name'] ) . '">' . esc_html( $args['label'] ) . '</label>';
 | |
| 		}
 | |
| 
 | |
| 		$output .= '<textarea name="' . esc_attr( $args['name'] ) . '" id="' . edd_sanitize_key( $args['name'] ) . '" class="' . $class . '"' . $disabled . '>' . esc_attr( $args['value'] ) . '</textarea>';
 | |
| 
 | |
| 		if ( ! empty( $args['desc'] ) ) {
 | |
| 			$output .= '<span class="edd-description">' . esc_html( $args['desc'] ) . '</span>';
 | |
| 		}
 | |
| 
 | |
| 		$output .= '</span>';
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Renders an ajax user search field
 | |
| 	 *
 | |
| 	 * @since 2.0
 | |
| 	 *
 | |
| 	 * @param array $args
 | |
| 	 *
 | |
| 	 * @return string text field with ajax search
 | |
| 	 */
 | |
| 	public function ajax_user_search( $args = array() ) {
 | |
| 
 | |
| 		// Parse args
 | |
| 		$args = wp_parse_args( $args, array(
 | |
| 			'id'           => 'user_id',
 | |
| 			'name'         => 'user_id',
 | |
| 			'value'        => null,
 | |
| 			'placeholder'  => __( 'Enter Username', 'easy-digital-downloads' ),
 | |
| 			'label'        => null,
 | |
| 			'desc'         => null,
 | |
| 			'class'        => 'edd-user-dropdown',
 | |
| 			'disabled'     => false,
 | |
| 			'autocomplete' => 'off',
 | |
| 			'data'         => false,
 | |
| 		) );
 | |
| 
 | |
| 		// Setup the AJAX class
 | |
| 		$args['class'] = 'edd-ajax-user-search ' . sanitize_html_class( $args['class'] );
 | |
| 
 | |
| 		// Concatenate output
 | |
| 		$output  = '<span class="edd_user_search_wrap">';
 | |
| 		$output .= $this->text( $args );
 | |
| 		$output .= '<span class="edd_user_search_results hidden"><span></span></span>';
 | |
| 		$output .= '<span class="spinner"></span>';
 | |
| 		$output .= '</span>';
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Show a required indicator on a field.
 | |
| 	 *
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function show_required() {
 | |
| 
 | |
| 		$output  = '<span class="edd-required-indicator" aria-hidden="true">*</span>';
 | |
| 		$output .= sprintf( '<span class="screen-reader-text">%s</span>', __( 'Required', 'easy-digital-downloads' ) );
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| }
 |