Ansprechende Typografie←▼→Wenn die Katzenklappe zufriert

buoa,php,web

Chronologische Navigation

Erstellt: 29.03.2022 Lesedauer 1 - 2 Min.

Für BUOA! wollte ich schon länger eine „Blätter-Funktion“, mit der ich mich selbst in den Artikeln vor und zurück bewegen kann. Hinterher eigentlich ziemlich einfach.

Neben der Themenseite bietet die omnipräsenten Suche ein schnelles Auffinden von Information. Doch das erfordert immer proaktives Suchen. Das blättern durch die Artikel, anlesen, weiterblättern – vergleichbar mit einem Buch – fehlte. Bisher.

Mit der Umstellung von BUOA! auf OffSiteEdit ging das immer mal wieder durch den Kopf. Damit Artikel ein „echtes“ Datum haben, bekommen sie mit den integrierten Funktionen von OffSiteEdit entsprechende Daten als Meta-Tags. Das Datei-Datum hat nämlich selten bis nie etwas mit dem Erstell- oder letzten Bearbeitungsdatum gemein.

Da es „nur Dateien“ ohne Datenbank gibt, musste ein bisschen PHP her, mit dem die Nachbarn eines Artikels aufgespürt werden. Dafür wird aus der aktuellen Seite das für sie gültige Datum ermittelt. Das kann im Tag published stehen, der jedoch von modified geschlagen werden kann. Bei älteren Dokumenten kann published fehlen – es gab eine Zeit vor OffSiteEdit. Außerdem kann es an einem Tag mehrere Artikel geben.

Ausgehend vom Dateidatum werden deshalb Erstellungs- und Änderungsdatum geprüft und daran hängt die Speicherzeit der Datei und der Titel:

$aktuell = $_SERVER["DOCUMENT_ROOT"].$_SERVER["REQUEST_URI"].'.php';
preg_match("/<title>(.+)<\/title>/siU", file_get_contents($aktuell), $matches);
$titel = (Trim($matches[1]) ? Trim($matches[1]) : '') ;
$curdat = date("Y-m-d", filemtime($aktuell));
$curdat = Isset($cur['published']) ? $cur['published'] : $curdat;
$curdat = Isset($cur['modified']) ? $cur['modified'] : $curdat;
$curdat .= date (' H:i:s', filemtime($aktuell)) . $titel;

Der angehängte Titel gewährleistet die Eindeutigkeit für den (auftretenden) Fall identische Zeitangaben in den übrigen Dateien, aus denen mit einer Suche die gleichen Daten extrahiert werden:

$items = glob('./*{php,html}', GLOB_BRACE);
$i = 0;
foreach ($items as $item){         
  if ($item == "index.php" or $item == "." or is_dir($item)){   }
  else {
     preg_match("/<title>(.+)<\/title>/siU", file_get_contents($item), $matches);
     if ($matches) {
        $Datei[$i]['titel'] = $matches[1];
        $Datei[$i]['pfad'] = pathinfo($item, PATHINFO_DIRNAME) .'/'. pathinfo($item, PATHINFO_FILENAME);
        $Datei[$i]['comp'] = date ('Y-m-d', filemtime($item));
        $tags = get_meta_tags($item);
        $Datei[$i]['comp'] = (Isset($tags['published'])) ? $tags['published'] : $Datei[$i]['comp'];
        $Datei[$i]['comp'] = (Isset($tags['modified'])) ? $tags['modified'] : $Datei[$i]['comp'];
        $Datei[$i]['comp'] .= date (' H:i:s', filemtime($item)) . $Datei[$i]['titel'];
     }
  $i++;
  } 
}

Der compare-Eintrag macht die Sortierung und Suche übersichtlich, bei der die aktuelle Datei gesucht wird. Damit steht fest, wer Vorgänger und Nachfolger ist. Ist die aktuelle Datei „erster“ oder „letzter“ wird das bei der Ausgabe berücksichtigt. Wenn erforderlich wird der Titel so gekürzt, dass er einzeilig bleibt.

array_multisort (array_column($Datei, 'comp'), SORT_ASC, $Datei);
$i = 0;      
foreach ($Datei As $Temp) {
   if ($Datei[$i]['comp']==$curdat) {
      Break;
   }
   $i++;
}      
$vorher = max(0,$i-1);
$nachher = min($i+1,count($items) - 1);
$Ergebnis = '<div class="' . $stil . '"><span>';
$Ergebnis .=  (($i-1)> -1) ? '<a href="'.$Datei[$vorher]['pfad'] .'" title="'.$talt.'">'. ((strlen($Datei[$vorher]['titel'])>30) ? mb_substr($Datei[$vorher]['titel'],0,30).'…' : $Datei[$vorher]['titel']).'</a>' : $dalt;
$Ergebnis .=  '</span><span>←&#x25BC;→</span><span>';
$Ergebnis .=  ($i + 1 < (count($items) - 1)) ? '<a href="'.$Datei[$nachher]['pfad'] .'" title="'.$takt.'">'.((strlen($Datei[$nachher]['titel'])>30) ? mb_substr($Datei[$nachher]['titel'],0,30).'…' : $Datei[$nachher]['titel']).'</a>' : $dakt;
$Ergebnis .= '</span></DIV>';

Mit ein paar Variablen wird der Code auf Mehrsprachigkeit vorbereitet, in eine Funktion verpackt und im Seitenbanner der Webseite noch

if ((strpos($_SERVER["REQUEST_URI"],'wiki')> 0)) {
include_once ($_SERVER["DOCUMENT_ROOT"] .);  // Skript
echo chrono('fold');

eingefügt. Eigentlich ganz einfach. Doch PHP war und wird wohl nicht mehr mein Freund. Was an der sporadischen Auseinandersetzung damit liegen könnte. Daher beschleicht mich immer das Gefühl, es könnte pfiffiger gehen. Für entsprechende Hinweise bin ich empfänglich.