lubuntu.me/plugins/so-widgets-bundle/base/inc/fields/siteorigin-widget-field-class-loader.class.php

113 lines
3.0 KiB
PHP
Raw Normal View History

2018-01-26 15:50:15 +01:00
<?php
/**
* Autoloader for widget field classes.
*
* Class SiteOrigin_Field_Class_Loader
*/
class SiteOrigin_Widget_Field_Class_Loader {
private $class_prefixes;
private $class_paths;
function __construct(){
// Setup the loader with default prefixes and paths
$this->add_class_prefixes( array( 'SiteOrigin_Widget_Field_' ), 'base' );
$this->add_class_paths( array( plugin_dir_path( __FILE__ ) ), 'base' );
spl_autoload_register( array( $this, 'load_field_class' ) );
}
static function single(){
static $single;
if( empty( $single ) ) {
$single = new SiteOrigin_Widget_Field_Class_Loader();
}
return $single;
}
/**
* Regsiter class prefixes to watch for in this loader
*
* @param string|array $class_prefixes
* @param string $group
*/
public function add_class_prefixes( $class_prefixes, $group = 'base' ) {
if( !isset( $this->class_prefixes ) ) $this->class_prefixes = array();
if( !isset( $this->class_prefixes[$group] ) ) $this->class_prefixes[$group] = array();
$this->class_prefixes[$group] = array_merge(
$this->class_prefixes[$group],
$class_prefixes
);
$this->class_prefixes[$group] = array_unique( $this->class_prefixes[$group] );
}
/**
* Register paths where we'll look for these classes.
*
* @param string|array $class_paths
* @param string $group
*/
public function add_class_paths( $class_paths, $group = 'base' ) {
if( !isset( $this->class_paths ) ) $this->class_paths = array();
if( !isset( $this->class_paths[$group] ) ) $this->class_paths[$group] = array();
$this->class_paths[$group] = array_merge(
$this->class_paths[$group],
$class_paths
);
$this->class_paths[$group] = array_unique( $this->class_paths[$group] );
}
/**
* Load a class field. This is registered with spl_autoload_register
*
* @param $field_classname
*/
public function load_field_class( $field_classname ) {
$valid_classname = false;
$class_prefix = '';
$class_group = '';
foreach ( $this->class_prefixes as $class_group => $class_prefixes ) {
foreach( $class_prefixes as $class_prefix ) {
$valid_classname = strpos( $field_classname, $class_prefix ) !== false;
if( $valid_classname ) {
break 2;
}
}
}
if ( ! $valid_classname ) return;
$filename = strtolower( str_replace( '_', '-', str_replace( $class_prefix, '', $field_classname ) ) );
if( empty( $this->class_paths[$class_group] ) ) return;
foreach( $this->class_paths[$class_group] as $class_path ) {
$filepath = $class_path . $filename . '.class.php';
if ( file_exists( $filepath ) ) {
require_once $filepath;
continue;
}
}
}
/**
* Initialize and register the class field loader
*/
public function extend(){
$this->add_class_prefixes(
apply_filters( 'siteorigin_widgets_field_class_prefixes', array() ),
'base'
);
$this->add_class_paths(
apply_filters( 'siteorigin_widgets_field_class_paths', array() ),
'base'
);
}
}
add_action( 'init', array( SiteOrigin_Widget_Field_Class_Loader::single(), 'extend' ) );