chore: reformat and clean up PHP templates, snippets, and configurations

Standardized code formatting across multiple files for improved readability and consistency.
This commit is contained in:
2025-06-29 10:59:56 +02:00
parent f36f69082d
commit 2bf81134c7
12 changed files with 523 additions and 348 deletions
+75 -45
View File
@@ -1,54 +1,84 @@
<?php
// Daten abrufen und deserialisieren
$url = 'https://www.schachbund.de/php/dewis/verein.php?zps=25318&format=array';
$data = @file_get_contents($url);
$players = $data ? @unserialize($data) : [];
function safe($val) {
return $val === null || $val === false || $val === '' || $val === 'N' ? '-' : htmlspecialchars($val);
}
// Daten abrufen und deserialisieren
$url = 'https://www.schachbund.de/php/dewis/verein.php?zps=25318&format=array';
$data = @file_get_contents($url);
$players = $data ? @unserialize($data) : [];
// Nach DWZ absteigend sortieren
if ($players && is_array($players)) {
usort($players, function($a, $b) {
$dwzA = isset($a['dwz']) && is_numeric($a['dwz']) ? (int)$a['dwz'] : 0;
$dwzB = isset($b['dwz']) && is_numeric($b['dwz']) ? (int)$b['dwz'] : 0;
return $dwzB <=> $dwzA;
});
}
function safe($val)
{
return $val === null || $val === false || $val === '' || $val === 'N'
? '-' : htmlspecialchars($val);
}
// Nach DWZ absteigend sortieren
if ($players && is_array($players)) {
usort($players, function ($a, $b) {
$dwzA = isset($a['dwz']) && is_numeric($a['dwz']) ? (int)$a['dwz']
: 0;
$dwzB = isset($b['dwz']) && is_numeric($b['dwz']) ? (int)$b['dwz']
: 0;
return $dwzB <=> $dwzA;
});
}
?>
<section class="py-24 bg-sf_grau-50">
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
<table class="min-w-full border border-sf_blau-200 rounded-xl overflow-hidden">
<thead class="bg-sf_blau-600 text-white font-bold">
<tr>
<th class="px-3 py-2">Platz</th>
<th class="px-3 py-2">Mitgl.</th>
<th class="px-3 py-2">Titel</th>
<th class="px-3 py-2">Name</th>
<th class="px-3 py-2">DWZ</th>
<th class="px-3 py-2">ELO</th>
</tr>
</thead>
<tbody>
<?php if ($players && is_array($players)): ?>
<?php $platz = 1; foreach ($players as $p): ?>
<tr class="even:bg-sf_grau-100 odd:bg-white">
<td class="px-3 py-2 text-center"><?php echo $platz++; ?></td>
<td class="px-3 py-2 text-center"><?php echo safe($p['mglnr']); ?></td>
<td class="px-3 py-2 text-center"><?php echo safe($p['titel']); ?></td>
<td class="px-3 py-2 font-semibold text-xl text-sf_blau-500 hover:text-sf_gelb-300">
<a href="http://www.schachbund.de/spieler.html?pkz=<?php echo safe($p['id']); ?>" target="_blank">
<?php echo safe($p['nachname'] . ', ' . $p['vorname']); ?></td>
<table class="min-w-full border border-sf_blau-200 rounded-xl overflow-hidden">
<thead class="bg-sf_blau-600 text-white font-bold">
<tr>
<th class="px-3 py-2">Platz</th>
<th class="px-3 py-2">Mitgl.</th>
<th class="px-3 py-2">Titel</th>
<th class="px-3 py-2">Name</th>
<th class="px-3 py-2">DWZ</th>
<th class="px-3 py-2">ELO</th>
</tr>
</thead>
<tbody>
<?php
if ($players && is_array($players)): ?>
<?php
$platz = 1;
foreach ($players as $p): ?>
<tr class="even:bg-sf_grau-100 odd:bg-white">
<td class="px-3 py-2 text-center"><?php
echo $platz++; ?></td>
<td class="px-3 py-2 text-center"><?php
echo safe($p['mglnr']); ?></td>
<td class="px-3 py-2 text-center"><?php
echo safe($p['titel']); ?></td>
<td class="px-3 py-2 font-semibold text-xl text-sf_blau-500 hover:text-sf_gelb-300">
<a href="http://www.schachbund.de/spieler.html?pkz=<?php
echo safe($p['id']); ?>"
target="_blank">
<?php
echo safe(
$p['nachname'].', '
.$p['vorname'],
); ?></td>
</a>
<td class="px-3 py-2 text-right text-xl"><?php echo safe($p['dwz']); ?>-<?php echo safe($p['dwzindex']); ?></td>
<td class="px-3 py-2 text-right text-xl"><?php echo safe($p['fideelo']); ?></td>
<td class="px-3 py-2 text-right text-xl"><?php
echo safe($p['dwz']); ?>
-<?php
echo safe($p['dwzindex']); ?></td>
<td class="px-3 py-2 text-right text-xl"><?php
echo safe($p['fideelo']); ?></td>
</tr>
<?php
endforeach; ?>
<?php
else: ?>
<tr>
<td colspan="6" class="px-3 py-4 text-center text-red-500">
Keine Daten verfügbar.
</td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr><td colspan="6" class="px-3 py-4 text-center text-red-500">Keine Daten verfügbar.</td></tr>
<?php endif; ?>
</tbody>
</table>
</div>
<?php
endif; ?>
</tbody>
</table>
</div>
</section>
+9 -8
View File
@@ -1,13 +1,13 @@
<?php
/*
Snippets are a great way to store code snippets for reuse
or to keep your templates clean.
/*
Snippets are a great way to store code snippets for reuse
or to keep your templates clean.
This footer snippet is reused in all templates.
This footer snippet is reused in all templates.
More about snippets:
https://getkirby.com/docs/guide/templates/snippets
*/
More about snippets:
https://getkirby.com/docs/guide/templates/snippets
*/
?>
<footer class="bg-sf_grau-400 w-full" data-pgc-define="footer"
@@ -132,7 +132,8 @@
<!--Grid-->
<div class="py-7 border-t border-gray-700">
<div class="flex items-center justify-center">
<span class="text-base text-sf_gray-700">&copy; 2025 - <a href="https://www.schachfreunde-badsteben.de/">Schachfreunde Bad Steben </a></span>
<span class="text-base text-sf_gray-700">&copy; 2025 - <a
href="https://www.schachfreunde-badsteben.de/">Schachfreunde Bad Steben </a></span>
</div>
</div>
</div>
+23 -23
View File
@@ -1,15 +1,15 @@
<?php
/*
Snippets are a great way to store code snippets for reuse
or to keep your templates clean.
/*
Snippets are a great way to store code snippets for reuse
or to keep your templates clean.
This header snippet is reused in all templates.
It fetches information from the `site.txt` content file
and contains the site navigation.
This header snippet is reused in all templates.
It fetches information from the `site.txt` content file
and contains the site navigation.
More about snippets:
https://getkirby.com/docs/guide/templates/snippets
*/
More about snippets:
https://getkirby.com/docs/guide/templates/snippets
*/
?>
<!DOCTYPE html>
@@ -20,21 +20,21 @@
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<?php
/*
In the title tag we show the title of our
site and the title of the current page
*/
/*
In the title tag we show the title of our
site and the title of the current page
*/
?>
<title><?= $site->title()->esc() ?> | <?= $page->title()->esc() ?></title>
<?php
/*
Stylesheets can be included using the `css()` helper.
Kirby also provides the `js()` helper to include script file.
More Kirby helpers: https://getkirby.com/docs/reference/templates/helpers
*/
/*
Stylesheets can be included using the `css()` helper.
Kirby also provides the `js()` helper to include script file.
More Kirby helpers: https://getkirby.com/docs/reference/templates/helpers
*/
?>
@@ -44,11 +44,11 @@
]) ?>
<?php
/*
The `url()` helper is a great way to create reliable
absolute URLs in Kirby that always start with the
base URL of your site.
*/
/*
The `url()` helper is a great way to create reliable
absolute URLs in Kirby that always start with the
base URL of your site.
*/
?>
+196 -133
View File
@@ -1,112 +1,139 @@
<?php
// URL der öffentlichen ICS-Datei
define('CAL_URL', 'https://calendar.google.com/calendar/ical/jv1bq94un3ivoa8ka0rk9ngq4k%40group.calendar.google.com/public/basic.ics');
// ICS-Datei laden
$ics = @file_get_contents(CAL_URL);
if (!$ics) {
echo '<div class="text-red-600">Kalender konnte nicht geladen werden.</div>';
return;
}
// URL der öffentlichen ICS-Datei
define(
'CAL_URL',
'https://calendar.google.com/calendar/ical/jv1bq94un3ivoa8ka0rk9ngq4k%40group.calendar.google.com/public/basic.ics',
);
// Termine parsen
function parse_ics($ics) {
$lines = explode("\n", $ics);
$events = [];
$event = [];
$inEvent = false;
foreach ($lines as $line) {
$line = trim($line);
if ($line === 'BEGIN:VEVENT') {
$inEvent = true;
$event = [];
} elseif ($line === 'END:VEVENT') {
$inEvent = false;
$events[] = $event;
} elseif ($inEvent) {
// Property kann Parameter enthalten, z.B. DTSTART;TZID=Europe/Berlin:20240701T19000000
$parts = explode(':', $line, 2);
if (count($parts) === 2) {
$key = $parts[0];
$val = $parts[1];
// Nur den eigentlichen Property-Namen extrahieren
$key = strtoupper(preg_replace('/;.+$/', '', $key));
$event[$key] = $val;
}
// ICS-Datei laden
$ics = @file_get_contents(CAL_URL);
if ( ! $ics) {
echo '<div class="text-red-600">Kalender konnte nicht geladen werden.</div>';
return;
}
// Termine parsen
function parse_ics($ics)
{
$lines = explode("\n", $ics);
$events = [];
$event = [];
$inEvent = false;
foreach ($lines as $line) {
$line = trim($line);
if ($line === 'BEGIN:VEVENT') {
$inEvent = true;
$event = [];
} elseif ($line === 'END:VEVENT') {
$inEvent = false;
$events[] = $event;
} elseif ($inEvent) {
// Property kann Parameter enthalten, z.B. DTSTART;TZID=Europe/Berlin:20240701T19000000
$parts = explode(':', $line, 2);
if (count($parts) === 2) {
$key = $parts[0];
$val = $parts[1];
// Nur den eigentlichen Property-Namen extrahieren
$key = strtoupper(preg_replace('/;.+$/', '', $key));
$event[$key] = $val;
}
}
return $events;
}
function format_ics_date($date) {
// Unterstützt sowohl ganztägige als auch Zeitangaben
if (strpos($date, 'T') !== false) {
$dt = DateTime::createFromFormat('Ymd\THis', substr($date, 0, 15));
return $dt ? $dt->format('d.m.Y H:i') : $date;
} else {
$dt = DateTime::createFromFormat('Ymd', $date);
return $dt ? $dt->format('d.m.Y') : $date;
}
}
return $events;
}
$events = parse_ics($ics);
// Nur Events mit DTSTART berücksichtigen
$events = array_filter($events, function($event) {
return isset($event['DTSTART']) && !empty($event['DTSTART']);
});
// Nach Datum sortieren
usort($events, function($a, $b) {
return strcmp($a['DTSTART'], $b['DTSTART']);
});
function format_ics_date($date)
{
// Unterstützt sowohl ganztägige als auch Zeitangaben
if (strpos($date, 'T') !== false) {
$dt = DateTime::createFromFormat('Ymd\THis', substr($date, 0, 15));
// Aktuelles Datum
$today = (new DateTime())->format('Ymd');
// Nur zukünftige Termine anzeigen
$future_events = array_filter($events, function($event) use ($today) {
return isset($event['DTSTART']) && $event['DTSTART'] >= $today;
});
// --- Deutsche Monatsnamen ---
$de_months = [
'01' => 'Januar', '02' => 'Februar', '03' => 'März', '04' => 'April', '05' => 'Mai', '06' => 'Juni',
'07' => 'Juli', '08' => 'August', '09' => 'September', '10' => 'Oktober', '11' => 'November', '12' => 'Dezember'
];
// --- Gruppierung aller Termine nach Jahr und Monat für die Sidebar ---
function group_events_by_year_month($events) {
$grouped = [];
foreach ($events as $event) {
if (!isset($event['DTSTART'])) continue;
$date = $event['DTSTART'];
$year = substr($date, 0, 4);
$month = substr($date, 4, 2);
$grouped[$year][$month][] = $event;
}
krsort($grouped); // Jahre absteigend
foreach ($grouped as &$months) {
krsort($months); // Monate absteigend
}
return $grouped;
}
$all_events_grouped = group_events_by_year_month($events);
// --- Filter aus URL ---
$filter_jahr = $_GET['jahr'] ?? null;
$filter_monat = $_GET['monat'] ?? null;
if ($filter_jahr && $filter_monat) {
$filtered_events = array_filter($events, function($event) use ($filter_jahr, $filter_monat) {
$date = $event['DTSTART'] ?? '';
return substr($date, 0, 4) === $filter_jahr && substr($date, 4, 2) === $filter_monat;
});
} elseif ($filter_jahr) {
$filtered_events = array_filter($events, function($event) use ($filter_jahr) {
$date = $event['DTSTART'] ?? '';
return substr($date, 0, 4) === $filter_jahr;
});
return $dt ? $dt->format('d.m.Y H:i') : $date;
} else {
$filtered_events = $future_events;
$dt = DateTime::createFromFormat('Ymd', $date);
return $dt ? $dt->format('d.m.Y') : $date;
}
}
$events = parse_ics($ics);
// Nur Events mit DTSTART berücksichtigen
$events = array_filter($events, function ($event) {
return isset($event['DTSTART']) && ! empty($event['DTSTART']);
});
// Nach Datum sortieren
usort($events, function ($a, $b) {
return strcmp($a['DTSTART'], $b['DTSTART']);
});
// Aktuelles Datum
$today = (new DateTime())->format('Ymd');
// Nur zukünftige Termine anzeigen
$future_events = array_filter($events, function ($event) use ($today) {
return isset($event['DTSTART']) && $event['DTSTART'] >= $today;
});
// --- Deutsche Monatsnamen ---
$de_months = [
'01' => 'Januar',
'02' => 'Februar',
'03' => 'März',
'04' => 'April',
'05' => 'Mai',
'06' => 'Juni',
'07' => 'Juli',
'08' => 'August',
'09' => 'September',
'10' => 'Oktober',
'11' => 'November',
'12' => 'Dezember',
];
// --- Gruppierung aller Termine nach Jahr und Monat für die Sidebar ---
function group_events_by_year_month($events)
{
$grouped = [];
foreach ($events as $event) {
if ( ! isset($event['DTSTART'])) {
continue;
}
$date = $event['DTSTART'];
$year = substr($date, 0, 4);
$month = substr($date, 4, 2);
$grouped[$year][$month][] = $event;
}
krsort($grouped); // Jahre absteigend
foreach ($grouped as &$months) {
krsort($months); // Monate absteigend
}
return $grouped;
}
$all_events_grouped = group_events_by_year_month($events);
// --- Filter aus URL ---
$filter_jahr = $_GET['jahr'] ?? null;
$filter_monat = $_GET['monat'] ?? null;
if ($filter_jahr && $filter_monat) {
$filtered_events = array_filter($events, function ($event) use ($filter_jahr, $filter_monat) {
$date = $event['DTSTART'] ?? '';
return substr($date, 0, 4) === $filter_jahr && substr($date, 4, 2) === $filter_monat;
});
} elseif ($filter_jahr) {
$filtered_events = array_filter($events, function ($event) use ($filter_jahr) {
$date = $event['DTSTART'] ?? '';
return substr($date, 0, 4) === $filter_jahr;
});
} else {
$filtered_events = $future_events;
}
?>
<section class="py-24 bg-sf_grau-50">
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 flex flex-col md:flex-row gap-8">
@@ -115,27 +142,54 @@
<div class="bg-white rounded-lg shadow p-4">
<h2 class="text-lg font-semibold mb-3">Termine nach Jahr/Monat</h2>
<ul class="space-y-1">
<?php foreach ($all_events_grouped as $year => $months): ?>
<li class="mb-2">
<div class="flex items-center">
<a href="?jahr=<?php echo $year; ?>" class="font-bold text-sf_blau-600 focus:outline-none flex items-center group<?php if ($filter_jahr === $year && !$filter_monat) echo ' underline'; ?><?php if ($filter_jahr === $year && !$filter_monat) echo ' selected'; ?>" onclick="event.stopPropagation(); openYear('<?php echo $year; ?>')">
<span><?php echo $year; ?></span>
</a>
<button type="button" class="ml-1 focus:outline-none" onclick="toggleYear('<?php echo $year; ?>')">
<svg class="w-4 h-4 transition-transform" id="arrow-<?php echo $year; ?>" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/></svg>
</button>
</div>
<ul class="ml-4 mt-1 hidden" id="months-<?php echo $year; ?>">
<?php foreach ($months as $month => $evts): ?>
<li>
<a href="?jahr=<?php echo $year; ?>&monat=<?php echo $month; ?>" class="text-sf_blau-500 hover:underline<?php if ($filter_jahr === $year && $filter_monat === $month) echo ' font-bold underline selected'; ?>">
<?php echo $de_months[$month]; ?> (<?php echo count($evts); ?>)
<?php
foreach ($all_events_grouped as $year => $months): ?>
<li class="mb-2">
<div class="flex items-center">
<a href="?jahr=<?php
echo $year; ?>"
class="font-bold text-sf_blau-600 focus:outline-none flex items-center group<?php
if ($filter_jahr === $year && ! $filter_monat) {
echo ' underline';
} ?><?php
if ($filter_jahr === $year && ! $filter_monat) {
echo ' selected';
} ?>" onclick="event.stopPropagation(); openYear('<?php
echo $year; ?>')">
<span><?php
echo $year; ?></span>
</a>
</li>
<?php endforeach; ?>
</ul>
</li>
<?php endforeach; ?>
<button type="button" class="ml-1 focus:outline-none" onclick="toggleYear('<?php
echo $year; ?>')">
<svg class="w-4 h-4 transition-transform" id="arrow-<?php
echo $year; ?>" fill="none" stroke="currentColor" stroke-width="2"
viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg>
</button>
</div>
<ul class="ml-4 mt-1 hidden" id="months-<?php
echo $year; ?>">
<?php
foreach ($months as $month => $evts): ?>
<li>
<a href="?jahr=<?php
echo $year; ?>&monat=<?php
echo $month; ?>" class="text-sf_blau-500 hover:underline<?php
if ($filter_jahr === $year && $filter_monat === $month) {
echo ' font-bold underline selected';
} ?>">
<?php
echo $de_months[$month]; ?> (<?php
echo count($evts); ?>)
</a>
</li>
<?php
endforeach; ?>
</ul>
</li>
<?php
endforeach; ?>
</ul>
</div>
<script>
@@ -150,6 +204,7 @@
arrow.style.transform = '';
}
}
function openYear(year) {
var ul = document.getElementById('months-' + year);
var arrow = document.getElementById('arrow-' + year);
@@ -162,9 +217,11 @@
</aside>
<!-- Hauptinhalt Termine -->
<div class="md:w-3/4 w-full">
<?php if (empty($filtered_events)): ?>
<?php
if (empty($filtered_events)): ?>
<div class="text-gray-500">Keine Termine gefunden.</div>
<?php else: ?>
<?php
else: ?>
<div class="overflow-x-auto">
<table class="min-w-full border border-gray-200 bg-white rounded-lg shadow">
<thead>
@@ -175,27 +232,33 @@
</tr>
</thead>
<tbody>
<?php foreach ($filtered_events as $event): ?>
<?php
foreach ($filtered_events as $event): ?>
<?php
$start = $event['DTSTART'] ?? '';
$end = $event['DTEND'] ?? '';
$summary = $event['SUMMARY'] ?? '';
$start = $event['DTSTART'] ?? '';
$end = $event['DTEND'] ?? '';
$summary = $event['SUMMARY'] ?? '';
$location = $event['LOCATION'] ?? '';
$desc = $event['DESCRIPTION'] ?? '';
$date = format_ics_date($start);
$time = (str_contains($start, 'T')) ? substr($date, 11) : 'ganztägig';
$date = substr($date, 0, 10);
$desc = $event['DESCRIPTION'] ?? '';
$date = format_ics_date($start);
$time = (str_contains($start, 'T')) ? substr($date, 11) : 'ganztägig';
$date = substr($date, 0, 10);
?>
<tr class="hover:bg-gray-50">
<td class="py-2 px-4 border-b whitespace-nowrap"><?php echo htmlspecialchars($date); ?></td>
<td class="py-2 px-4 border-b whitespace-nowrap"><?php echo htmlspecialchars($time); ?></td>
<td class="py-2 px-4 border-b"><?php echo htmlspecialchars($summary); ?></td>
<td class="py-2 px-4 border-b whitespace-nowrap"><?php
echo htmlspecialchars($date); ?></td>
<td class="py-2 px-4 border-b whitespace-nowrap"><?php
echo htmlspecialchars($time); ?></td>
<td class="py-2 px-4 border-b"><?php
echo htmlspecialchars($summary); ?></td>
</tr>
<?php endforeach; ?>
<?php
endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
<?php
endif; ?>
</div>
</div>
<style>
+8 -4
View File
@@ -7,15 +7,19 @@
<div class="w-full max-w-lg">
<p class="lg:pt-0 pt-6 text-xl"><?= $page->heroText() ?></p>
<?php if ($page->heroButton()->isNotEmpty()): ?>
<?php
if ($page->heroButton()->isNotEmpty()): ?>
<div class="mt-6 flex flex-wrap gap-4 md:mt-8">
<a href="<?= $page->buttonLink() ?>" class="hover:cursor-pointer hover:text-sf_gelb-500" target="_blank">
<button class="rounded-button inline-flex gap-3 items-center justify-center whitespace-nowrap transition-all duration-200 ease-in-out disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none border border-border-primary text-text-primary bg-background-primary px-6 py-3" title="Kontakt" type="button">
<a href="<?= $page->buttonLink() ?>" class="hover:cursor-pointer hover:text-sf_gelb-500"
target="_blank">
<button class="rounded-button inline-flex gap-3 items-center justify-center whitespace-nowrap transition-all duration-200 ease-in-out disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none border border-border-primary text-text-primary bg-background-primary px-6 py-3"
title="Kontakt" type="button">
<?= $page->heroButton() ?>
</button>
</a>
</div>
<?php endif ?>
<?php
endif ?>
</div>
</div>