From 7076343338ae3439f3c86f01144818abe8c31978 Mon Sep 17 00:00:00 2001 From: George Halkiadakis Date: Sun, 12 Mar 2023 07:16:23 +0200 Subject: add container helpers; constuct public directory-tree --- helpers/autoload.php | 43 ------ helpers/design_patterns.php | 104 -------------- helpers/error_handling.php | 119 ---------------- helpers/render.php | 338 -------------------------------------------- 4 files changed, 604 deletions(-) delete mode 100644 helpers/autoload.php delete mode 100644 helpers/design_patterns.php delete mode 100644 helpers/error_handling.php delete mode 100644 helpers/render.php (limited to 'helpers') diff --git a/helpers/autoload.php b/helpers/autoload.php deleted file mode 100644 index c4359c6..0000000 --- a/helpers/autoload.php +++ /dev/null @@ -1,43 +0,0 @@ - $basePath) { - - $file = APP_ROOT . $basePath . $classPath .'.php'; - - // if class-file exist, include it - if (file_exists($file)) { - require_once $file; - break; - } - - } - - // // Feel free to extend the fanctionality - // // example: - // // custom (exception) namespaced classes loader - // $customNSclasses = array( - // '\\George\\Class' => 'path/to/George/Class', - // '\\Mary\\Class' => 'path/to/Marias/Class', - // ... - // ); - // if array_key_exists($className) { - // require_once $customNSclasses[$className]; - // } - } -); diff --git a/helpers/design_patterns.php b/helpers/design_patterns.php deleted file mode 100644 index d66ffa9..0000000 --- a/helpers/design_patterns.php +++ /dev/null @@ -1,104 +0,0 @@ -get($key); - - } else { $data = false; } // ignore cache? pass false - - - if ($data !== false) { // if exists, serve cached data - - // if cashed data exist - // --------------------------------------------------------------------- - # if (!PRODUCTION) Benchmark::add_spot('proxy-cached'); - if ($data == '_ERROR_') return false; // previous cached error - else return $data; // previous cache () - - - } else { // else (not exist)... - - // no data on cache -> get data from Class::method( arguments ) - // --------------------------------------------------------------------- - $data = call_user_func_array($callable, $args); - - // handle newly created data - // --------------------------------------------------------------------- - - // if faulty data, return false - if ($data == false) { - - if ($cache_errors && !$do_not_cache) { // cache the error - $cache->set($key, '_ERROR_', $ttl); - } - - # if (!PRODUCTION) Benchmark::add_spot('proxy-new-error'); - return false; - } - - // store to cache - if (!$do_not_cache) { - $cache->set($key, $data, $ttl); - } - - # if (!PRODUCTION) Benchmark::add_spot('proxy-new'); - return $data; // serve data - } - -} diff --git a/helpers/error_handling.php b/helpers/error_handling.php deleted file mode 100644 index bc60968..0000000 --- a/helpers/error_handling.php +++ /dev/null @@ -1,119 +0,0 @@ -getMessage() - . " on file '". $e->getFile() . "' at line {$e->getLine()}"; - - $anom_ERRORS[] = $message; // store the error -} - - -/** - * Catch fatal error work-around - * (set_error_handler not working on fatal errors). - */ -function on_shutdown_check_for_fatal() -{ - global $anom_ERRORS; - - $error = error_get_last(); - - if ($error != null) { // ignore 'normal' system shutdowns [exit|die]() - - if ( $error["type"] == E_ERROR ) { // get as much error-info - handle_error( - $error["type"] ?? -1, - $error["message"] ?? 'unknown error', - $error["file"] ?? 'unknown file', - $error["line"] ?? -1 - ); - } - } - - if (($anom_ERRORS != [])) { - - // TODO: - // Implemetnig the design/layout of the error-messages - // output should not be an error's-handling task, thus - // shall be assigned to the Rendes/View level; - // Same about the log service channels - - // TODO: - // FORWARD ERRORS into LOG-SYSTEM - // ex. into some file... - // file_put_contents("logs/thowable.log", $message_template .PHP_EOL, FILE_APPEND); - // or ...some other channer (Email, Slack, Database etc). - // Channes can be decided according to error severity; - // a file-system error loggin for backup is recommended - // partitioniong of errors onto file-system can be useful - - // TODO: - // 1st: Log Errors - // 2nd: Show Errors - - if (PRODUCTION) { - if (!defined('VIEW_LOADED')) { - // throw a prety-error message - render_view('error/general', ['message' => 'Please forgive me, I know not what I do']); - } - - } else { - - if (!defined('VIEW_LOADED')) { - // no template loaded; render erros in general-error template - render_view('error/general', ['message' => implode("
And:
", $anom_ERRORS)]); - - } else { - echo '
- Errors:
'. implode("
And:
", $anom_ERRORS) .'
'; - } - } - } -} - - -// register callback on shutdown -register_shutdown_function( "on_shutdown_check_for_fatal" ); - -// register custom error handler callback -set_error_handler( "handle_error" ); - -// set custom exception handler function -set_exception_handler( "handle_exception" ); - -// send errors to stderr (instead of stdout) -ini_set( "display_errors", "off" ); - -// thow out all errors -error_reporting( E_ALL ); - diff --git a/helpers/render.php b/helpers/render.php deleted file mode 100644 index 9dcd34a..0000000 --- a/helpers/render.php +++ /dev/null @@ -1,338 +0,0 @@ -"; - } - -} - -/** parse_sections - * --- - * parse a group of views (sections) - * @param $sections: an array of sections - * - * each section group is an array with view, key and data properties - * + view: defines the view template/file - * + key: the variable name that view uses to parse data OR empty-string* - * * if key is an empty then $data should be an array (which - * includes all [variable-name:data] pairs utilized by the view) - * + data: holds the actual data - */ - -function parse_sections($sections) { - - foreach($sections as $sect) { - - if ($sect['key'] == '') { - render_view( $sect['view'], $sect['data'] ); - - } else { - render_view( $sect['view'], [ $sect['key'] => $sect['data']] ); - } - } -} - - -/** render function - * --- - * uses php's short-tag syntax for templating system - * extract data into template - * @param $view: view-template filename - * @param $data: data to embed into view-template - * @param $sanitize: of true then sanitize data. - * important NOTE: data is an array [key => value] - */ -function render_view($view, $data, $sanitize = false) { - - $file = VIEWS_DIRECTORY . $view . '.php'; - - if (file_exists($file)) { - if (!defined('VIEW_LOADED')) define('VIEW_LOADED', 1); - - extract( $sanitize ? sanitize_output($data) : $data ); - require( $file ); - - } else if (!PRODUCTION) { - - echo ""; - } - -} - - -/** render asap - * --- - * render_view then output code - * so that client will get html to render - * while server calculates next html - */ -function render_asap($view, $data, $sanitize = false) { - render_view($view, $data, $sanitize); - ob_flush(); -} - - -/** render text - * --- - * This function simply echoes text - * with Content-Type and Cache Headers - * @param $data : the text to echo - * @param $cType : Content-Type header - * @param $ttl : cache-contol headers; if false response is not-cached; else (int) chache for $ttl seconds - */ -function render_text( $data, $contentType = 'text/html; charset=UTF-8', $ttl = false ) { - header('Content-Type: '. $contentType); - if ($ttl) { - $ts = gmdate("D, d M Y H:i:s", time() + $ttl) . " GMT"; - header("Expires: {$ts}"); - header("Pragma: cache"); - header("Cache-Control: max-age={$ttl}"); - - } else { - $ts = gmdate("D, d M Y H:i:s") . " GMT"; - header("Expires: {$ts}"); - header("Last-Modified: {$ts}"); - header("Pragma: no-cache"); - header("Cache-Control: no-cache, must-revalidate"); - } - echo htmlspecialchars($data); -} - - -/** reply_json - * --- - * transform a php-array to json and echo to client - * Can be used for API calls - * - * @param $data : the php array) - * @param $ttl : cache-contol headers; if false response is not-cached; else chache for $ttl seconds - */ -function reply_json( $data, $ttl = false ) { - header('Content-Type: application/json'); - if ($ttl) { - $ts = gmdate("D, d M Y H:i:s", time() + $ttl) . " GMT"; - header("Expires: {$ts}"); - header("Pragma: cache"); - header("Cache-Control: max-age={$ttl}"); - - } else { - $ts = gmdate("D, d M Y H:i:s") . " GMT"; - header("Expires: {$ts}"); - header("Last-Modified: {$ts}"); - header("Pragma: no-cache"); - header("Cache-Control: no-cache, must-revalidate"); - } - echo json_encode($data, JSON_UNESCAPED_UNICODE); -} - - - - -// HELPER FUNCTIONS -// ----------------------------------------------------------------------------- - - -/** link asset - * --- - * the function defines the assets (css or js) - * to be loaded on the client (creates the HTML) - * @param $type : type of asset [css|js] - * @param $assetIDs : an array of ('assetID' => 'paramaters') - * - * example calls: - * load_asset('css', ['main' => 'media="all"', 'filters' => 'media="all"']); - * load_asset( 'js', ['jquery' => '', 'lazyloader' => 'async']); - */ -function link_asset( $type, $assetIDs, $paramatres = '' ) { - - $code = ""; // code to return - - // make sure $assetIDs is array (for coding simplicity) - if (!is_array($assetIDs)) { - $assetIDs = [ $assetIDs ]; - } - - // check asset type and construct all asset inserts - switch ($type) { - - case 'font': - foreach($assetIDs as $asset) { - $code .= "\n\t"; - } - break; - - case 'js': - foreach($assetIDs as $asset) { - $code .= "\n\t"; - } - break; - - case 'css': - default: - foreach($assetIDs as $asset) { - $code .= "\n\t"; - } - } - - echo $code; -} - - -/** sanitize_output (recursive) - * --- - * Sanitizes data that are about to rendered - * (usually when render_view() is called). - * NOTE: mitigates XSS attachs - * @param $data: (array) - */ -function sanitize_output($data) { - //// // check https://stackoverflow.com/questions/2002710/php-how-to-perform-htmlspecialchar-on-an-array-of-arrays - - //// $output = array_map("myFunc", $data); - global $secure; - - $output = array(); - foreach($data as $key => $val) { - - if (is_string($val)) { - $output[$key] = htmlspecialchars(remove_invisible_characters($val)); - - } else if (is_array($val)) { - $output[$key] = sanitize_output($val); - - } else { - $output[$key] = $val; - } - } - return $output; -} - - -/** remove_invisible_characters() - * --- - * @used by sanitize_output() - */ -function remove_invisible_characters($str, $url_encoded = TRUE) -{ - $non_displayables = array(); - - // every control character except newline (dec 10), - // carriage return (dec 13) and horizontal tab (dec 09) - if ($url_encoded) { - $non_displayables[] = '/%0[0-8bcef]/i'; // url encoded 00-08, 11, 12, 14, 15 - $non_displayables[] = '/%1[0-9a-f]/i'; // url encoded 16-31 - $non_displayables[] = '/%7f/i'; // url encoded 127 - } - - $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 - - do { - $str = preg_replace($non_displayables, '', $str, -1, $count); - } while ($count); - - return $str; -} - - -/** html - * --- - * outputs code as html - * - * @param $str (string) - * @return html5 (string) - */ -function html($str) { - if (!isset($str) || $str== null) return; - if (($str == '') || is_numeric($str)) return $str; - return htmlspecialchars_decode($str, ENT_QUOTES|ENT_HTML5); -} - - -/** set_headers - * --- - * set custom response-Headers - * - * @param $contentType - * @param $ttl: int or false) - * @param $more: array of (content-type => content-value) pairs - */ -function set_headers($contentType = 'text/html; charset=UTF-8', $ttl = false, $more = [] ) { - - // handle common content-type shorcuts - switch ($contentType) { - case 'text': - case 'html': - $contentType = 'text/html; charset=UTF-8'; - break; - case 'json': - $contentType = 'application/json; charset=utf-8'; - break; - case 'js': - $contentType = 'application/javascript; charset=utf-8'; - break; - case 'css': - $contentType = 'text/css'; - break; - default: - // $contentType stays as-is - break; - } - - // send headers - header('Content-Type: '. $contentType); - if ($ttl) { - $ts = gmdate("D, d M Y H:i:s", time() + $ttl) . " GMT"; - header("Expires: {$ts}"); - header("Pragma: cache"); - header("Cache-Control: max-age={$ttl}"); - - } else { - $ts = gmdate("D, d M Y H:i:s") . " GMT"; - header("Expires: {$ts}"); - header("Last-Modified: {$ts}"); - header("Pragma: no-cache"); - header("Cache-Control: no-cache, must-revalidate"); - } - - // send more headers - if ($more != []) { - foreach($more as $header => $value) { - header($header .': '. $value); - } - } - -} - - - -- cgit v1.2.3