Website-fabianschieder/index.php

177 lines
6.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
/*
* Absolute Webpfade verwenden!
* Ordnerstruktur im Webroot:
* /icons/...
* /style.css
*/
$projects = [
"privat" => [
[
"title" => "Gitea",
"description" => "Mein privates Git-Repository Quellcode, Projekte & mehr.",
"url" => "/git",
"logo" => "/icons/gitea.svg",
"color" => "#609926"
],
[
"title" => "Nextcloud",
"description" => "Meine persönliche Cloud Dateien, Kalender & Kontakte.",
"url" => "/nextcloud",
"logo" => "/icons/nextcloud.svg",
"color" => "#0082c9"
],
],
"schule" => [
[
"title" => "Geizkragen.store",
"description" => "Schulprojekt Ein Online-Shop für Schnäppchenjäger.",
"url" => "https://geizkragen.store",
"logo" => "/icons/geizkragen.png",
"color" => "#e8281e",
"external" => true
],
],
"dienste" => [
[
"title" => "Home Assistant",
"description" => "Meine Smart-Home-Zentrale Automatisierungen & Geräte.",
"url" => "http://homeassistant.fabianschieder.com",
"logo" => "/icons/homeassistant.svg",
"color" => "#18BCF2",
"external" => true
],
[
"title" => "NAS",
"description" => "Mein Netzwerkspeicher Daten & Backups.",
"url" => "http://nas.fabianschieder.com",
"logo" => "/icons/nas.svg",
"color" => "#a855f7",
"external" => true
],
],
];
/**
* Optional: Prüft serverseitig, ob die Logo-Datei existiert.
* Verhindert Broken Images.
*/
function logoExists(string $webPath): bool {
$base = rtrim($_SERVER['DOCUMENT_ROOT'] ?? '/var/www/fabianschieder.com', '/');
$full = $base . '/' . ltrim($webPath, '/');
return is_file($full);
}
// ── DEBUG: Entferne diesen Block nach dem Testen ──────────────────────────
if (isset($_GET['debug'])) {
echo '<pre style="background:#111;color:#0f0;padding:1em;position:fixed;top:0;left:0;z-index:9999;font-size:12px;">';
echo "DOCUMENT_ROOT: " . ($_SERVER['DOCUMENT_ROOT'] ?? 'nicht gesetzt') . "\n";
echo "PHP __FILE__: " . __FILE__ . "\n";
echo "PHP dirname: " . dirname(__FILE__) . "\n\n";
$testIcons = ['/icons/gitea.svg', '/icons/nextcloud.svg', '/icons/geizkragen.png', '/icons/homeassistant.svg', '/icons/nas.svg'];
foreach ($testIcons as $icon) {
$base = rtrim($_SERVER['DOCUMENT_ROOT'] ?? '/var/www/fabianschieder.com', '/');
$full = $base . '/' . ltrim($icon, '/');
$alt = dirname(__FILE__) . '/' . ltrim($icon, '/');
echo $icon . "\n";
echo " via DOCUMENT_ROOT → " . $full . "" . (is_file($full) ? "✅ OK" : "❌ nicht gefunden") . "\n";
echo " via dirname → " . $alt . "" . (is_file($alt) ? "✅ OK" : "❌ nicht gefunden") . "\n\n";
}
echo '</pre>';
}
// ── END DEBUG ─────────────────────────────────────────────────────────────
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fabian Schieder</title>
<link rel="stylesheet" href="/style.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
</head>
<body>
<div class="background-blur"></div>
<header>
<div class="avatar">FS</div>
<h1>Fabian Schieder</h1>
<p class="tagline">Entwickler · Schüler · Macher</p>
</header>
<main>
<?php foreach ($projects as $category => $items): ?>
<section>
<h2 class="category-title">
<?php
switch ($category) {
case "privat":
echo '<i class="fas fa-lock"></i> Privat';
break;
case "schule":
echo '<i class="fas fa-graduation-cap"></i> Schule';
break;
case "dienste":
echo '<i class="fas fa-network-wired"></i> Dienste';
break;
}
?>
</h2>
<div class="cards">
<?php foreach ($items as $project): ?>
<a
href="<?= htmlspecialchars($project['url'], ENT_QUOTES) ?>"
class="card"
<?= !empty($project['external']) ? 'target="_blank" rel="noopener noreferrer"' : '' ?>
style="--accent: <?= htmlspecialchars($project['color'], ENT_QUOTES) ?>;"
>
<div class="card-icon">
<?php if (!empty($project['logo'])): ?>
<?php
// Prüfe zuerst via DOCUMENT_ROOT, dann via dirname(__FILE__)
$base1 = rtrim($_SERVER['DOCUMENT_ROOT'] ?? '', '/') . '/' . ltrim($project['logo'], '/');
$base2 = dirname(__FILE__) . '/' . ltrim($project['logo'], '/');
$logoOk = is_file($base1) || is_file($base2);
?>
<?php if ($logoOk): ?>
<img
src="<?= htmlspecialchars($project['logo'], ENT_QUOTES) ?>"
alt="<?= htmlspecialchars($project['title'], ENT_QUOTES) ?> Logo"
class="card-logo"
>
<?php else: ?>
<i class="fas fa-folder" title="Logo nicht gefunden: <?= htmlspecialchars($project['logo'], ENT_QUOTES) ?>"></i>
<?php endif; ?>
<?php else: ?>
<i class="fas fa-folder"></i>
<?php endif; ?>
</div>
<div class="card-body">
<h3><?= htmlspecialchars($project['title'], ENT_QUOTES) ?></h3>
<p><?= htmlspecialchars($project['description'], ENT_QUOTES) ?></p>
</div>
<div class="card-arrow">
<i class="fas fa-arrow-right"></i>
</div>
</a>
<?php endforeach; ?>
</div>
</section>
<?php endforeach; ?>
</main>
<footer>
<p>&copy; <?= date('Y') ?> Fabian Schieder — Alle Rechte vorbehalten.</p>
</footer>
</body>
</html>