\x20\40\x20\40
<?php
namespace Imagely\NGG\Settings;
/**
* Base class for settings managers
*
* Provides common functionality for managing settings with dynamic option handlers,
* default values, and array access capabilities.
*/
abstract class ManagerBase implements \ArrayAccess {
/**
* The option name used for storing settings
*
* @var string
*/
protected static $option_name = 'ngg_options';
/**
* Array of settings options
*
* @var array
*/
protected $_options = [];
/**
* Array of default values for settings
*
* @var array
*/
protected $_defaults = [];
/**
* Array of option handlers for dynamic options
*
* @var array
*/
protected $_option_handlers = [];
/**
* Saves the settings
*
* @return void
*/
abstract public function save();
/**
* Destroys the settings
*
* @return void
*/
abstract public function destroy();
/**
* Loads the settings
*
* @return void
*/
abstract public function load();
/**
* Constructor
*/
protected function __construct() {
$this->load();
}
/**
* Adds a class to handle dynamic options
*
* @param string $klass The class name to handle the option.
* @param array $options Array of option names to be handled by this class.
*/
public function add_option_handler( $klass, $options = [] ) {
if ( ! is_array( $options ) ) {
$options = [ $options ];
}
foreach ( $options as $option_name ) {
$this->_option_handlers[ $option_name ] = $klass;
}
}
/**
* Gets a handler used to provide a dynamic option
*
* @param string $option_name The option name to get the handler for.
* @param string $method The method to check for in the handler.
* @return null|mixed
*/
protected function _get_option_handler( $option_name, $method = 'get' ) {
$retval = null;
if ( isset( $this->_option_handlers[ $option_name ] ) ) {
if ( ! is_object( $this->_option_handlers[ $option_name ] ) ) {
$klass = $this->_option_handlers[ $option_name ];
$this->_option_handlers[ $option_name ] = new $klass();
}
$retval = $this->_option_handlers[ $option_name ];
if ( ! method_exists( $retval, $method ) ) {
$retval = null;
}
}
return $retval;
}
/**
* Gets the value of a particular setting
*
* @param string $key The setting key to retrieve.
* @param mixed $default_value The default value if the setting is not found.
* @return mixed
*/
public function get( $key, $default_value = null ) {
$retval = $default_value;
$handler = $this->_get_option_handler( $key, 'get' );
if ( $handler ) {
$retval = $handler->get( $key, $default_value );
} elseif ( isset( $this->_options[ $key ] ) ) {
$retval = $this->_options[ $key ];
}
// In case a stdObject has been passed in as a value, we want to only return scalar values or arrays.
if ( is_object( $retval ) ) {
$retval = (array) $retval;
}
return $retval;
}
/**
* Sets a setting to a particular value
*
* @param string $key The setting key or an array of key-value pairs.
* @param mixed $value The value to set.
* @param bool $skip_handlers Whether to skip option handlers.
* @return mixed
*/
public function set( $key, $value = null, $skip_handlers = false ) {
if ( is_object( $value ) ) {
$value = (array) $value;
}
if ( is_array( $key ) ) {
foreach ( $key as $k => $v ) {
$this->set( $k, $v );
}
} else {
$handler = ! $skip_handlers ? $this->_get_option_handler( $key, 'set' ) : false;
if ( $handler ) {
$handler->set( $key, $value );
} else {
$this->_options[ $key ] = $value;
}
}
return $this;
}
/**
* Deletes a setting
*
* @param string $key The setting key to delete.
*/
public function delete( $key ) {
$handler = $this->_get_option_handler( $key, 'delete' );
if ( $handler ) {
$handler->delete( $key );
} else {
unset( $this->_options[ $key ] );
}
}
/**
* Determines if a setting exists or not
*
* @param string $key The setting key to check.
* @return bool
*/
public function is_set( $key ) {
return array_key_exists( $key, $this->_options );
}
/**
* Alias to is_set()
*
* @param string $key The setting key to check.
* @return bool
*/
public function exists( $key ) {
return $this->is_set( $key );
}
/**
* Checks if a setting does not exist
*
* @param string $key The setting key to check.
* @return bool
*/
public function does_not_exist( $key ) {
return ! $this->exists( $key );
}
/**
* Resets all settings and defaults
*
* @return void
*/
public function reset() {
$this->_options = [];
$this->_defaults = [];
}
/**
* This function does two things:
* a) If a value hasn't been set for the specified key, or it's been set to a previously set
* default value, then set this key to the value specified
* b) Sets a new default value for this key
*
* @param string $key The setting key.
* @param mixed $default_value The default value to set.
* @return mixed
*/
public function set_default_value( $key, $default_value ) {
if ( ! isset( $this->_defaults[ $key ] ) ) {
$this->_defaults[ $key ] = $default_value;
}
if ( is_null( $this->get( $key, null ) ) || $this->get( $key ) == $this->_defaults[ $key ] ) {
$this->set( $key, $default_value );
}
$this->_defaults[ $key ] = $default_value;
return $this->get( $key );
}
/**
* Checks if an offset exists (ArrayAccess implementation)
*
* @param string $key The offset to check.
* @return bool
*/
#[\ReturnTypeWillChange]
public function offsetExists( $key ) {
return $this->is_set( $key );
}
/**
* Gets an offset (ArrayAccess implementation)
*
* @param string $key The offset to retrieve.
* @return mixed
*/
#[\ReturnTypeWillChange]
public function offsetGet( $key ) {
return $this->get( $key );
}
/**
* Sets an offset (ArrayAccess implementation)
*
* @param string $key The offset to set.
* @param mixed $value The value to set.
* @return mixed
*/
#[\ReturnTypeWillChange]
public function offsetSet( $key, $value ) {
return $this->set( $key, $value );
}
/**
* Unsets an offset (ArrayAccess implementation)
*
* @param string $key The offset to unset.
* @return void
*/
#[\ReturnTypeWillChange]
public function offsetUnset( $key ) {
$this->delete( $key );
}
/**
* Magic method to get a setting
*
* @param string $key The setting key.
* @return mixed
*/
public function __get( $key ) {
return $this->get( $key );
}
/**
* Magic method to set a setting
*
* @param string $key The setting key.
* @param mixed $value The value to set.
* @return mixed
*/
public function __set( $key, $value ) {
return $this->set( $key, $value );
}
/**
* Magic method to check if a setting is set
*
* @param string $key The setting key.
* @return bool
*/
public function __isset( $key ) {
return $this->is_set( $key );
}
/**
* Converts the settings to a JSON string
*
* @return string
*/
public function __toString() {
return wp_json_encode( $this->_options );
}
/**
* Converts the settings to an array
*
* @return array
*/
public function to_array() {
ksort( $this->_options );
return $this->_options;
}
/**
* Converts the settings to a JSON string
*
* @return string
*/
public function to_json() {
return wp_json_encode( $this->_options );
}
/**
* Loads settings from a JSON string
*
* @param string $json The JSON string to load.
* @return void
*/
public function from_json( $json ) {
$this->_options = (array) json_decode( $json );
}
}