218 lines
3.7 KiB
PHP
218 lines
3.7 KiB
PHP
<?php
|
|
/**
|
|
* app/lib/helpers.php
|
|
*
|
|
* Zentrale Hilfsfunktionen
|
|
* - Output-Escaping
|
|
* - Redirects
|
|
* - Flash-Messages
|
|
* - Request-Helper
|
|
* - Allgemeine Utilities
|
|
*
|
|
* KEINE Business-Logik
|
|
*/
|
|
|
|
/**
|
|
* Sitzungs-Keys
|
|
*/
|
|
const FLASH_SESSION_KEY = 'flash_messages';
|
|
|
|
/* =========================
|
|
* Output / Sicherheit
|
|
* ========================= */
|
|
|
|
/**
|
|
* HTML-Escaping
|
|
*
|
|
* @param string|null $value
|
|
* @return string
|
|
*/
|
|
function e(?string $value): string
|
|
{
|
|
if ($value === null) {
|
|
return '';
|
|
}
|
|
|
|
return htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
|
|
}
|
|
|
|
/* =========================
|
|
* Redirects
|
|
* ========================= */
|
|
|
|
/**
|
|
* HTTP Redirect
|
|
*
|
|
* @param string $url
|
|
* @param int $code
|
|
*/
|
|
function redirect(string $url, int $code = 302): void
|
|
{
|
|
if (!headers_sent()) {
|
|
header('Location: ' . $url, true, $code);
|
|
}
|
|
|
|
exit;
|
|
}
|
|
|
|
/* =========================
|
|
* Flash Messages
|
|
* ========================= */
|
|
|
|
/**
|
|
* Flash-Message setzen
|
|
*
|
|
* @param string $type (success, error, info)
|
|
* @param string $message
|
|
*/
|
|
function flash(string $type, string $message): void
|
|
{
|
|
if (session_status() !== PHP_SESSION_ACTIVE) {
|
|
session_start();
|
|
}
|
|
|
|
if (!isset($_SESSION[FLASH_SESSION_KEY])) {
|
|
$_SESSION[FLASH_SESSION_KEY] = [];
|
|
}
|
|
|
|
$_SESSION[FLASH_SESSION_KEY][] = ['type' => $type, 'message' => $message];
|
|
}
|
|
|
|
/**
|
|
* Flash-Messages abrufen & löschen
|
|
*
|
|
* @return array
|
|
*/
|
|
function getFlashes(): array
|
|
{
|
|
if (session_status() !== PHP_SESSION_ACTIVE) {
|
|
session_start();
|
|
}
|
|
|
|
$messages = $_SESSION[FLASH_SESSION_KEY] ?? [];
|
|
unset($_SESSION[FLASH_SESSION_KEY]);
|
|
|
|
return $messages;
|
|
}
|
|
|
|
/* =========================
|
|
* Request Helper
|
|
* ========================= */
|
|
|
|
/**
|
|
* POST-Wert holen
|
|
*
|
|
* @param string $key
|
|
* @param mixed $default
|
|
* @return mixed
|
|
*/
|
|
function post(string $key, $default = null)
|
|
{
|
|
return $_POST[$key] ?? $default;
|
|
}
|
|
|
|
/**
|
|
* GET-Wert holen
|
|
*
|
|
* @param string $key
|
|
* @param mixed $default
|
|
* @return mixed
|
|
*/
|
|
function get(string $key, $default = null)
|
|
{
|
|
return $_GET[$key] ?? $default;
|
|
}
|
|
|
|
/**
|
|
* Prüfen, ob Request POST ist
|
|
*
|
|
* @return bool
|
|
*/
|
|
function isPost(): bool
|
|
{
|
|
return ($_SERVER['REQUEST_METHOD'] ?? '') === 'POST';
|
|
}
|
|
|
|
/* =========================
|
|
* Validierung
|
|
* ========================= */
|
|
|
|
/**
|
|
* Prüft auf leeren Wert
|
|
*
|
|
* @param mixed $value
|
|
* @return bool
|
|
*/
|
|
function isEmpty($value): bool
|
|
{
|
|
if (is_string($value)) {
|
|
return trim($value) === '';
|
|
}
|
|
|
|
return empty($value);
|
|
}
|
|
|
|
/* =========================
|
|
* Pfade / URLs
|
|
* ========================= */
|
|
|
|
/**
|
|
* Baut eine URL zur App
|
|
*
|
|
* @param string $path
|
|
* @return string
|
|
*/
|
|
function url(string $path = ''): string
|
|
{
|
|
if ($path === '') {
|
|
$path = '/';
|
|
}
|
|
|
|
if (preg_match('~^([a-z]+:)?//~i', $path)) {
|
|
return $path;
|
|
}
|
|
|
|
$script = $_SERVER['SCRIPT_NAME'] ?? '';
|
|
$baseDir = rtrim(strtr(dirname($script), '\\\\', '/'), '/');
|
|
|
|
if ($baseDir === '.' || $baseDir === '\\\\') {
|
|
$baseDir = '';
|
|
}
|
|
|
|
$segment = ltrim($path, '/');
|
|
$prefix = $baseDir === '' ? '' : $baseDir;
|
|
|
|
if ($segment === '') {
|
|
return $prefix === '' ? '/' : $prefix;
|
|
}
|
|
|
|
return ($prefix === '' ? '' : $prefix) . '/' . $segment;
|
|
}
|
|
|
|
/* =========================
|
|
* Debug / Entwicklung
|
|
* ========================= */
|
|
|
|
/**
|
|
* Dump & Die (nur Dev)
|
|
*
|
|
* @param mixed $value
|
|
*/
|
|
function dd($value): void
|
|
{
|
|
echo '<pre>';
|
|
var_dump($value);
|
|
echo '</pre>';
|
|
exit;
|
|
}
|
|
|
|
/* =========================
|
|
* Sonstiges
|
|
* ========================= */
|
|
|
|
// TODO: Weitere Helfer nach Bedarf
|
|
// - Datum formatieren
|
|
// - Bytes → MB
|
|
// - UUID erzeugen
|
|
// - SVG-Koordinaten normalisieren
|