csvxml/functions/functions.php

180 lines
5.3 KiB
PHP

<?PHP
/**
* Generic collection of functions used in CSVXML.
*
* @file
*
* @author
*/
declare(strict_types = 1);
// Set autoloader
\error_reporting(E_ALL);
\ini_set('display_errors', "1");
\spl_autoload_register("mdCsvxmlAutoloader");
# \set_exception_handler("mdExceptionHandler");
# \set_error_handler("mdErrorHandler", E_ALL);
require_once __DIR__ . '/../inc/constants.php';
require_once __DIR__ . '/../vendor/autoload.php';
/**
* Autoloader for museum-digital.org.
*
* @param string $className Name of the class to load.
*
* @return void
*/
function mdCsvxmlAutoloader(string $className):void {
// Try using class map as defined through /scripts/buildClassMap.php
if (isset(AUTOLOAD_CLASS_MAP[$className])) {
include AUTOLOAD_CLASS_MAP[$className];
return;
}
// Fallback: Load classes by autoload directories
foreach (AUTOLOAD_DIRS as $classDir) {
if (\file_exists("$classDir/$className.php")) {
include "$classDir/$className.php";
return;
}
}
}
/**
* Own error handler: Set to enforce exit on any error.
*
* @param integer $errno Error number.
* @param string $string Error message.
* @param string $file File in which the error occured.
* @param integer $line Line number.
*
* @return void
*/
function mdErrorHandler(int $errno, string $string, string $file, int $line):void {
$getStr = [];
foreach ($_GET as $key => $value) {
if (is_array($value)) continue;
$getStr[] = $key . "=" . $value;
}
$userMsg = "";
if (isset($_SESSION['anmnam'])) $userMsg .= " User: " . $_SESSION["anmnam"];
if (isset($_SESSION['username'])) $userMsg .= " (" . $_SESSION["username"] . ")";
if ($userMsg) $userMsg = " |--" . $userMsg;
$errorMsg = "";
if (!empty($_SERVER) && !empty($_SERVER["HTTP_HOST"])) {
$errorPage = $_SERVER['PHP_SELF'] . "?" . implode("&", $getStr);
$errorPageFull = "https://" . $_SERVER["HTTP_HOST"] . $errorPage;
$errorMsg = "*$errno (<a href='https://www.google.de/search?q=php+" . str_replace(" ", "+", $string) . "'>$string</a>) at $file: line_ $line _";
$errorMsg .= $userMsg;
$errorMsg .= " |-- Error generating page: <a href='$errorPageFull'>$errorPage</a>";
$errorMsg .= " |-- Used RAM / Peak RAM / Allowed: " . MD_STD::human_filesize(memory_get_usage()) . " / " . MD_STD::human_filesize(memory_get_peak_usage()) . " / " . ini_get("memory_limit");
$errorMsg = str_replace(PHP_EOL, " ", $errorMsg);
error_log($errorMsg);
}
if ($errno == E_ERROR) exit;
}
/**
* Exception handler to also be able to handle custom exceptions.
*
* @param Throwable $exception Exception.
*
* @return void
*/
function mdExceptionHandler(Throwable $exception):void {
$formatErrorPage = function(string $errorMsg = "", string $versionName = "") :string {
if (PHP_SAPI === "cli") {
return $errorMsg . PHP_EOL;
}
$output = '<!DOCTYPE html>
<html id="errorPage">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<meta name="description" content="Validate import CSV files for museum-digital" />
<link rel="manifest" href="./manifest.webmanifest" />
<link rel="stylesheet" type="text/css" href="assets/css/csvxml.min.css" />
<meta name="theme-color" content="#aa4400" />
<meta name="robots" content="noindex" />
<link rel="shortcut icon" sizes="128x128" href="assets/img/mdlogo-csvxml.svg" />';
$output .= '
<title>Error :: ';
$output .= $versionName;
$output .= '</title>
</head>
<body>
<main>
<img src="/assets/img/mdlogo-csvxml.svg" alt="" />
<p>' . $errorMsg . '</p>
<nav>
<a href="index.php?t=home">Home</a>
<a href="index.php?t=museum">Museum</a>
<a href="index.php?t=collection">Collection</a>
<a href="index.php?t=exhibitions_overview">Exhibition</a>
<a href="index.php?t=events">Event</a>
<a href="index.php?t=topics">Topics</a>
<a href="index.php?t=listen&sv=+&done=yes">Objects</a>
</nav>
<nav>
<a href="index.php?t=kontakt">Contact</a>
<a href="index.php?t=impressum">Impressum</a>
<a href="index.php?t=privacy">Privacy Policy</a>
</nav>
</main>
</body>
</html>';
return $output;
};
$errorReporter = new MDErrorReporter("md:csvxml", "bugs-csvxml@museum-digital.de");
$errorCategory = MDErrorReporter::categorizeError($exception);
http_response_code(404);
switch ($errorCategory) {
case MDErrorReporter::MD_ERROR_KNOWN:
if (isset($_GET["output"]) and $_GET['output'] === "json") {
header('Content-type: application/json');
$output = [
"status" => "Error",
"msg" => $exception->getMessage(),
];
echo MD_STD::json_encode($output);
exit;
}
echo $formatErrorPage($exception->getMessage(), "");
exit;
default:
$errorReporter->sendErrorReport($exception, "joshua@museum-digital.de");
echo $formatErrorPage("Uncaught exception ...<br />Our team has been notified and will get to fixing this error shortly.", "");
exit;
}
}