179 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Icon types registry
 | |
|  *
 | |
|  * @package Icon_Picker
 | |
|  * @author  Dzikri Aziz <kvcrvt@gmail.com>
 | |
|  */
 | |
| 
 | |
| final class Icon_Picker_Types_Registry {
 | |
| 
 | |
| 	/**
 | |
| 	 * Icon_Picker_Types_Registry singleton
 | |
| 	 *
 | |
| 	 * @static
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @var    Icon_Picker_Types_Registry
 | |
| 	 */
 | |
| 	protected static $instance;
 | |
| 
 | |
| 	/**
 | |
| 	 * Base icon type class name
 | |
| 	 *
 | |
| 	 * @access protected
 | |
| 	 * @since  0.1.0
 | |
| 	 * @var    string
 | |
| 	 */
 | |
| 	protected $base_class = 'Icon_Picker_Type';
 | |
| 
 | |
| 	/**
 | |
| 	 * All types
 | |
| 	 *
 | |
| 	 * @access protected
 | |
| 	 * @since  0.1.0
 | |
| 	 * @var    array
 | |
| 	 */
 | |
| 	protected $types = array();
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Get instance
 | |
| 	 *
 | |
| 	 * @static
 | |
| 	 * @since  0.1.0
 | |
| 	 * @param  array $args Arguments.
 | |
| 	 *
 | |
| 	 * @return Icon_Picker_Types_Registry
 | |
| 	 */
 | |
| 	public static function instance( $args = array() ) {
 | |
| 		if ( is_null( self::$instance ) ) {
 | |
| 			self::$instance = new self( $args );
 | |
| 		}
 | |
| 
 | |
| 		return self::$instance;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Getter magic
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @param  string $name Property name.
 | |
| 	 * @return mixed  NULL if attribute doesn't exist.
 | |
| 	 */
 | |
| 	public function __get( $name ) {
 | |
| 		if ( isset( $this->$name ) ) {
 | |
| 			return $this->$name;
 | |
| 		}
 | |
| 
 | |
| 		return null;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Setter magic
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	public function __isset( $name ) {
 | |
| 		return isset( $this->$name );
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @return Icon_Picker_Types_Registry
 | |
| 	 */
 | |
| 	protected function __construct() {
 | |
| 		/**
 | |
| 		 * Fires when Icon Picker types registry is ready
 | |
| 		 *
 | |
| 		 * @since 0.1.0
 | |
| 		 * @param Icon_Picker_Types_Registry $this Icon_Picker_Types_Registry instance.
 | |
| 		 */
 | |
| 		do_action( 'icon_picker_types_registry_init', $this );
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Register icon type
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @param  Icon_Picker_Type $type Icon type.
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function add( Icon_Picker_Type $type ) {
 | |
| 		if ( $this->is_valid_type( $type ) ) {
 | |
| 			$this->types[ $type->id ] = $type;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Get icon type
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @param  string $id Icon type ID.
 | |
| 	 * @return mixed  Icon type or NULL if it's not registered.
 | |
| 	 */
 | |
| 	public function get( $id ) {
 | |
| 		if ( isset( $this->types[ $id ] ) ) {
 | |
| 			return $this->types[ $id ];
 | |
| 		}
 | |
| 
 | |
| 		return null;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Check if icon type is valid
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @param  Icon_Picker_Type $type Icon type.
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	protected function is_valid_type( Icon_Picker_Type $type ) {
 | |
| 		foreach ( array( 'id', 'controller' ) as $var ) {
 | |
| 			$value = $type->$var;
 | |
| 
 | |
| 			if ( empty( $value ) ) {
 | |
| 				trigger_error( esc_html( sprintf( 'Icon Picker: "%s" cannot be empty.', $var ) ) );
 | |
| 				return false;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if ( isset( $this->types[ $type->id ] ) ) {
 | |
| 			trigger_error( esc_html( sprintf( 'Icon Picker: Icon type %s is already registered. Please use a different ID.', $type->id ) ) );
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Get all icon types for JS
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function get_types_for_js() {
 | |
| 		$types = array();
 | |
| 		$names = array();
 | |
| 
 | |
| 		foreach ( $this->types as $type ) {
 | |
| 			$types[ $type->id ] = $type->get_props();
 | |
| 			$names[ $type->id ] = $type->name;
 | |
| 		}
 | |
| 
 | |
| 		array_multisort( $names, SORT_ASC, $types );
 | |
| 
 | |
| 		return $types;
 | |
| 	}
 | |
| }
 |