Files
thetempusproject/app/classes/preferences.php
Joey Kimsey d7e8b586d7 various updates
remove dependence on jQuery
add image delete
Admin ui fix for mobile
image updates to new style
update comments
2025-02-05 06:36:29 -05:00

386 lines
14 KiB
PHP

<?php
/**
* app/classes/preferences.php
*
* This class handles all the hard-coded preferences.
*
* @version 5.0.1
* @author Joey Kimsey <Joey@thetempusproject.com>
* @link https://TheTempusProject.com
* @license https://opensource.org/licenses/MIT [MIT LICENSE]
*/
namespace TheTempusProject\Classes;
use TheTempusProject\Houdini\Classes\Issues;
use TheTempusProject\Houdini\Classes\Forms;
use TheTempusProject\Houdini\Classes\Template;
use TheTempusProject\Canary\Bin\Canary as Debug;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Bedrock\Functions\Upload;
use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\TheTempusProject as App;
use TheTempusProject\Bedrock\Classes\Config;
class Preferences {
public static $preferences = false;
private static $location = false;
private static $initialized = false;
/**
* Default constructor which will attempt to load the preferences from the location specified.
*
* @param {string} [$location]
* @return {null|object}
*/
public function __construct( $location = '' ) {
if ( self::$initialized !== false ) {
Debug::log( 'Preferences already initialized.' );
return $this;
}
if ( empty( $location ) ) {
$location = PREFERENCES_JSON;
}
self::$initialized = $this->load( $location );
if ( self::$initialized !== false ) {
Debug::log( 'Preferences initialization succeeded.' );
return $this;
}
Debug::warn( 'Preferences initialization failed.' );
}
/**
* Attempts to retrieve then set the preferences from a file.
* @note This function will reset the preferences every time it is used.
*
* @param {string} [$location]
* @return {bool}
*/
public function load( $location ) {
self::$preferences = $this->getPrefsFile( $location );
self::$location = $location;
if ( self::$preferences === false || empty( self::$preferences ) ) {
Debug::warn( 'Preferences load failed.' );
return false;
}
Debug::log( 'Preferences load succeeded.' );
return true;
}
/**
* Opens and decodes the preferences json from the location provided.
*
* @param {string} [$location]
* @return {bool|array}
*/
public function getPrefsFile( $location ) {
if ( file_exists( $location ) ) {
Debug::debug( "Preferences json found: $location" );
return json_decode( file_get_contents( $location ), true );
} else {
Debug::warn( "Preferences json not found: $location" );
return false;
}
}
/**
* Retrieves the preference option for $name.
*
* @param {string} [$name]
* @return {WILD}
*/
public static function get( $name ) {
if ( self::$preferences === false ) {
return Debug::warn( 'Preferences not loaded.' );
}
if ( isset( self::$preferences[$name] ) ) {
return self::$preferences[$name];
}
return Debug::warn( "Preference not found: $name" );
}
public function getType( $name ) {
$pref = $this->get( $name );
if ( empty( $pref ) || empty( $pref['type'] ) ) {
return Debug::warn( "Preference Type not found: $name" );
}
return $pref['type'];
}
public function getDefault( $name ) {
$pref = $this->get( $name );
if ( empty( $pref ) || empty( $pref['default'] ) ) {
return Debug::warn( "Preference Default not found: $name" );
}
return $pref['default'];
}
public function getOptions( $name ) {
$pref = $this->get( $name );
if ( empty( $pref ) || empty( $pref['options'] ) ) {
return Debug::warn( "Preference Options not found: $name" );
}
return $pref['options'];
}
public function getPrettyName( $name ) {
$pref = $this->get( $name );
if ( empty( $pref ) || empty( $pref['pretty'] ) ) {
return Debug::warn( "Preference Pretty Name not found: $name" );
}
return $pref['pretty'];
}
/**
* Saves the current preferences.
*
* @param {bool} [$default] - Whether or not to save a default copy.
* @return {bool}
*/
public function save( $backup = true ) {
if ( self::$preferences === false ) {
Debug::warn( 'Preferences not loaded.' );
return false;
}
if ( self::$location === false ) {
Debug::warn( 'Preferences location not set.' );
return false;
}
if ( $backup ) {
$locationArray = explode( '.', self::$location );
$locationArray[] = 'bak';
$backupLoction = implode( '.', $locationArray );
if ( !file_put_contents( $backupLoction, json_encode( self::$preferences ) ) ) {
return false;
}
}
if ( file_put_contents( self::$location, json_encode( self::$preferences ) ) ) {
return true;
}
return false;
}
/**
* Adds a new preference to the $preferences array.
*
* @param {string} [$name]
* @param {string} [$value]
* @return {bool}
*/
public function add( $name, $details ) {
if ( !Check::simpleName( $name ) ) {
Debug::error( "Preference name invalid: $name" );
return false;
}
if ( isset( self::$preferences[$name] ) ) {
Debug::warn( "Preference already exists: $name" );
return false;
}
if ( self::$preferences === false ) {
self::$preferences = [];
}
$prefsArray = $this->normalizePreferenceArray( $name, $details );
if ( false === $prefsArray ) {
Debug::warn( 'Preference array failed to load properly.' );
return false;
}
self::$preferences[$name] = $prefsArray;
return true;
}
public function getFormHtml( $populated = [] ) {
// dv( self::$preferences );
$form = '';
// Added so i can force some sort of ordering
$inputTypes = [
'file' => [],
'select' => [],
'timezone' => [],
'checkbox' => [],
'switch' => [],
];
foreach ( self::$preferences as $name => $details ) {
$tempPrefsArray = $this->normalizePreferenceArray( $name, $details );
if ( isset( $populated[ $name ] ) ) {
$tempPrefsArray['value'] = $populated[$name];
} else {
$tempPrefsArray['value'] = $tempPrefsArray['default'];
}
// $form .= Forms::getFormFieldHtml( $name, $tempPrefsArray['pretty'], $tempPrefsArray['type'], $tempPrefsArray['default'], $tempPrefsArray['options'] );
if ( $tempPrefsArray['type'] == 'checkbox' ) {
$tempPrefsArray['type'] = 'switch';
}
if ( 'file' === $tempPrefsArray['type'] ) {
// dv( Config::getValue( 'uploads/images' ) );
if ( ! Config::getValue( 'uploads/images' ) ) {
Debug::info( 'Preference hidden because uploads are disabled.' );
continue;
}
}
$inputTypes[ $tempPrefsArray['type'] ][] = self::getFormFieldHtml( $name, $tempPrefsArray['pretty'], $tempPrefsArray['type'], $tempPrefsArray['value'], $tempPrefsArray['options'] );
}
foreach ( $inputTypes as $skip => $items ) {
$form .= implode( ' ', $items );
}
return $form;
}
public static function getFormFieldHtml( $fieldname, $fieldTitle, $type, $defaultValue = '', $options = null ) {
$html = '';
switch ( $type ) {
case 'radio':
case 'bool':
case 'boolean':
$fieldHtml = Forms::getRadioHtml( $fieldname, [ 'true', 'false' ], $defaultValue );
break;
case 'select':
$fieldHtml = Forms::getSelectHtml( $fieldname, $options, $defaultValue );
break;
case 'customSelect':
if ( empty( $options ) ) {
$options = '{' . $fieldname . '-options}';
}
$fieldHtml = Forms::getSelectHtml( $fieldname, $options, $defaultValue );
break;
case 'block':
$fieldHtml = Forms::getTextBlockHtml( $fieldname, $defaultValue );
break;
case 'text':
case 'url':
$fieldHtml = Forms::getTextHtml( $fieldname, $defaultValue );
break;
case 'checkbox':
$fieldHtml = Forms::getCheckboxHtml( $fieldname, $defaultValue );
break;
case 'switch':
$fieldHtml = Forms::getSwitchHtml( $fieldname, $defaultValue );
break;
case 'timezone':
$fieldHtml = Forms::getTimezoneHtml( $defaultValue );
break;
case 'file':
$fieldHtml = Forms::getFileHtml( $fieldname );
break;
default:
Debug::error( "unknown field type: $type" );
break;
}
$html .= '<div class="mb-3 row">';
$html .= '<label for="' . $fieldname . '" class="col-lg-6 col-form-label text-start text-lg-end">' . $fieldTitle . '</label>';
$html .= '<div class="col-lg-6">';
$html .= $fieldHtml;
$html .= '</div>';
if ( 'file' === $type ) {
$html .= '<div class="mb-3 row">';
$html .= '<h4 class="col-lg-6 col-form-label text-start text-lg-end">Current Image</h4>';
$html .= '<div class="col-lg-6">';
$html .= '<img alt="preferred image" src="{ROOT_URL}' . $defaultValue . '" class="img-circle img-fluid p-2">';
$html .= '</div>';
}
$html .= '</div>';
return Template::parse( $html );
}
public function convertFormToArray( $fillMissing = true, $defaultsOnly = true ) {
$prefsArray = [];
foreach ( self::$preferences as $name => $details ) {
if ( true === $fillMissing ) {
if ( true !== $defaultsOnly && !empty( App::$activePrefs[$name] ) ) {
$prefsArray[$name] = App::$activePrefs[$name];
} else {
$prefsArray[$name] = $details['default'];
}
}
if ( Input::exists( $name ) ) {
$prefsArray[$name] = Input::post( $name );
}
if ( 'file' == $details['type'] ) {
if ( Input::exists( $name ) ) {
$folder = UPLOAD_DIRECTORY . App::$activeUser->username . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR;
$upload = Upload::image( $name, $folder );
if ( $upload ) {
$route = str_replace( APP_ROOT_DIRECTORY, '', $folder );
$prefsArray[$name] = $route . Upload::last();
} else {
Issues::add( 'error', [ 'There was an error with your upload.' => Check::userErrors() ] );
unset( $prefsArray[$name] );
}
}
}
if ( 'checkbox' == $details['type'] ) {
if ( Input::exists( $name ) ) {
$prefsArray[$name] = true;
} else {
$prefsArray[$name] = false;
}
}
}
return $prefsArray;
}
public function getDefaultPreferencesArray() {
if ( self::$preferences === false ) {
Debug::warn( 'Preferences not loaded.' );
return false;
}
$prefsArray = [];
foreach ( self::$preferences as $name => $details ) {
$tempPrefsArray = $this->normalizePreferenceArray( $name, $details );
$prefsArray[$name] = $tempPrefsArray['default'];
}
return $prefsArray;
}
public function normalizePreferenceArray( $name, $prefsArray ) {
if ( !is_array( $prefsArray ) ) {
Debug::warn( 'Preference array was not an array.' );
return false;
}
if ( !isset( $prefsArray['type'] ) ) {
if ( isset( $prefsArray['options'] ) ) {
$prefsArray['type'] = 'select';
} else {
$prefsArray['type'] = 'text';
}
}
if ( !isset( $prefsArray['pretty'] ) ) {
$prefsArray['pretty'] = ucfirst( $name );
}
if ( !isset( $prefsArray['default'] ) ) {
$prefsArray['default'] = '';
}
if ( ( empty( $prefsArray['avatar'] ) ) || ( $prefsArray['avatar'] == 'defaultAvatar.png' ) ) {
$prefsArray['avatar'] = IMAGE_DIRECTORY . 'defaultAvatar.png';
}
if ( !isset( $prefsArray['options'] ) ) {
$prefsArray['options'] = null;
}
return $prefsArray;
}
/**
* Removes an existing preference from the $preferences array.
*
* @param {string} [$name]
* @param {bool} [$save]
* @return {bool}
*/
public function remove( $name, $save = false ) {
if ( self::$preferences === false ) {
Debug::warn( 'Preferences not loaded.' );
return false;
}
if ( !isset( self::$preferences[$name] ) ) {
Debug::error( "Preference does not exist: $name" );
return false;
}
unset( self::$preferences[$name] );
if ( $save === true ) {
return $this->save( true );
}
return true;
}
}