VivienSchiller: Verlinkung ausgehend von Seitennamen

Hallo ihr Lieben,

ich sitze grade an einer PHP-Seite und frage mich ob es möglich ist immer zur alphabetisch nächsten Seite zu verlinken.

Also angenommen ich befinde mich auf der Seite "index.php" dort soll es einen "Weiter"-Pfeil geben, der auf die alphabetisch nächste Seite im Ordner verlinkt. Also beispielsweise ist die nächste Seite "kontakt.php". Wenn ich in diesem Ordner aber die Datei "jetzt.php" erstelle, soll in der "index.php" OHNE manuelle Änderung des Codes die Datei "jetzt.php" verlinkt sein statt "kontakt.php".

Falls dies nicht möglich ist, ginge es mit numerischer Dateibenennung? Und für alphabetisch und numerisch: kann man dies auch umkehren (alphabetisch/numerisch nach oben gehen)?

Lieber Grüße und Danke im voraus

  1. Hallo VivienSchiller,

    ich sitze grade an einer PHP-Seite und frage mich ob es möglich ist immer zur alphabetisch nächsten Seite zu verlinken.

    Ja, das ist möglich.

    Also angenommen ich befinde mich auf der Seite "index.php" dort soll es einen "Weiter"-Pfeil geben, der auf die alphabetisch nächste Seite im Ordner verlinkt. Also beispielsweise ist die nächste Seite "kontakt.php". Wenn ich in diesem Ordner aber die Datei "jetzt.php" erstelle, soll in der "index.php" OHNE manuelle Änderung des Codes die Datei "jetzt.php" verlinkt sein statt "kontakt.php".

    Falls du eine Liste der Dateien händisch pflegen möchtest, wäre der programmiertechnische Aufwand wesentlich geringer. Wenn nicht musst du zunächst eine solche Liste erstellen und sie alphabetisch ordnen.

    Dann ermittelst du die Stelle, an der in dieser Liste die aktuelle Datei steht (k) und suchst die Dateien, die an den Stellen k-1 und k+1 stehen. Du musst dir noch überlegen, was passieren soll, wenn es keinen Vorgänger bzw. Nachfolger gibt. Ggf. musst du diese Fälle separat betrachten.

    Bis demnächst
    Matthias

    --
    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
    1. Hallo Matthias,

      erstmal danke. Eigentlich recht simpel, aber an einer derartige Lösung hatte ich gar nicht gedacht. Wenn ich es über eine Liste regle erübrigt sich auch die alphabetische Reihenfolge für mich. Trotzdem habe ich ein paar Rückfragen.

      Dann ermittelst du die Stelle, an der in dieser Liste die aktuelle Datei steht (k) und suchst die Dateien, die an den Stellen k-1 und k+1 stehen. Du musst dir noch überlegen, was passieren soll, wenn es keinen Vorgänger bzw. Nachfolger gibt. Ggf. musst du diese Fälle separat betrachten.

      Welches Datei-Format hätte diese Liste idealerweise? Würde eine einfache Textdatei mit allen Dateien untereinander nicht reichen?

      Liebe Grüße

      1. Hallo VivienSchiller,

        Welches Datei-Format hätte diese Liste idealerweise? Würde eine einfache Textdatei mit allen Dateien untereinander nicht reichen?

        Ob idealerweise weiß ich nicht, aber ich würde ein php-Array erstellen, das bereits alle notwendigen Informationen (url, linktext) enthält.

        Bis demnächst
        Matthias

        --
        Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
      2. @@VivienSchiller

        Welches Datei-Format hätte diese Liste idealerweise?

        Ein bereits weit verbreitetes, universell einsetzbares: JSON.

        [
          ["/preamble", "Präambel"],
          ["/article1", "Artikel 1"],
          ["/article2", "Artikel 2"],["/article30", "Artikel 30"]
        ]
        

        oder (noch besser):

        [
          {
            "url": "/preamble",
            "title": "Präambel"
          },
          {
            "url": "/article1",
            "title": "Artikel 1"
          },
          {
            "url": "/article2",
            "title": "Artikel 2"
          },{
            "url": "/article30",
            "title": "Artikel 30"
          }
        ]
        

        Würde eine einfache Textdatei mit allen Dateien untereinander nicht reichen?

        Wenn du mit „einfache Textdatei“ sowas meintest, ja. Aber die Datenstruktur (Zuordnung URL – Seitentitel) muss das Format abbilden.

        LLAP 🖖

        --
        „Wenn du eine weise Antwort verlangst, musst du vernünftig fragen.“ —Johann Wolfgang von Goethe
      3. @VivienSchiller @Matthias Apsel @Gunnar Bittersmann

        Ich habe mal die beiden vorgeschlagenen Varianten zur Demonstration/Inspiration zusammengestöpselt.

        Alle Dateien liegen im gleichen Verzeichnis.

        index.php, kontakt.php, journal.php und dergleichen:

        <h1>index.php</h1>
        
        <?php
        require __DIR__ . '/_navigation.php';
        echo createNavigation(basename(__FILE__));
        ?>
        

        _navigation.php:

        <?php
        
        /**
         * @param $activeFile
         * @return string
         */
        function createNavigation($activeFile)
        {
            // Hier je nach gewünschtem Mechanismus eine Zeile auskommentieren
        
            //$list = _generateListFromDirectory(__DIR__);
            $list = _generateListFromFile(__DIR__ . '/list.json');
        
            return _createNavigationFromList($activeFile, $list);
        }
        
        /**
         * @param $file
         * @return array
         */
        function _generateListFromFile($file)
        {
            $ret = json_decode(file_get_contents($file), true);
        
            return (is_array($ret)) ? $ret : array();
        }
        
        /**
         * @param $dir
         * @return array
         */
        function _generateListFromDirectory($dir)
        {
            // Liste aller *.php-Dateien im Verzeichnis ermitteln. Einträge, die mit
            // "_" beginnen, ignorieren
        
            $tmp = glob($dir . '/*.php');
        
            $files = array();
        
            foreach ($tmp as $item) {
                $basename = basename($item);
        
                if ('_' === substr($basename, 0, 1)) {
                    continue;
                }
        
                $files[] = array(
                    'url'   => $basename,
                    'title' => pathinfo($basename, PATHINFO_FILENAME)
                );
            }
        
            return $files;
        }
        
        /**
         * @param $file
         * @param array $list
         * @return string
         */
        function _createNavigationFromList($file, array $list)
        {
            // Wenn keine Einträge in Liste, Rückgabe
        
            $count = count($list);
        
            if (0 === $count) {
                return '<p>Keine Einträge in Liste.</p>';
            }
        
            // Wenn aktive Datei nicht in Liste, Rückgabe
        
            $pos = -1;
        
            foreach ($list as $index => $item) {
                if ($file === $item['url']) {
                    $pos = $index;
                    break;
                }
            }
        
            if (-1 === $pos) {
                return '<p>Datei nicht in Liste.</p>';
            }
        
            // Wenn aktive Datei einzige in Liste, Rückgabe
        
            if (1 === $count) {
                return '<p>Keine weiteren Dateien in Liste.</p>';
            }
        
            // Vorherige/nächste Datei in Liste ermitteln (-1, wenn letzte/erste)
        
            $prev = ($pos > 0)          ? $list[$pos - 1] : array();
            $next = ($pos < $count - 1) ? $list[$pos + 1] : array();
        
            // HTML-Ausgabe der Navigation zusammenbauen (exaktes HTML-Markup und CSS
            // und dergleichen bitte nicht auf die Goldwaage legen)
        
            $escape = function ($s) {
                return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
            };
        
            $ret = '';
        
            if (!empty($prev)) {
                $ret .= sprintf(
                    '<a class="nav nav-prev" href="%1$s" title="Zurück zu: %2$s">&larr; %2$s</a>',
                    $escape($prev['url']),
                    $escape($prev['title'])
                );
            }
        
            if (!empty($next)) {
                $ret .= sprintf(
                    '<a class="nav nav-next" href="%1$s" title="Weiter nach: %2$s">%2$s &rarr;</a>',
                    $escape($next['url']),
                    $escape($next['title'])
                );
            }
        
            $ret = '<p>' . $ret . '</p>';
        
            $styles = <<<'CSS'
        .nav {
            padding: 5px;
            margin: 5px;
            text-decoration: none;
            border: 1px solid #ccc;
            border-radius: 3px;
        }
        CSS;
        
            $ret .= '<style>' . $styles . '</style>';
        
            return $ret;
        }
        

        list.json:

        [
          { "url": "journal.php", "title": "Journal" },
          { "url": "foo.php",     "title": "Foo" },
          { "url": "kontakt.php", "title": "Kontakt" },
          { "url": "index.php",   "title": "Index" }
        ]
        
        1. Mini-Korrektur:

          // Vorherige/nächste Datei in Liste ermitteln (-1, wenn letzte/erste)
          

          Muss „leer“ heißen, nicht „-1“.

          (Die „-1“ war noch von vorher, als die Liste nur Dateinamen enthielt, keine Arrays.)

        2. Ich habe mal die beiden vorgeschlagenen Varianten zur Demonstration/Inspiration zusammengestöpselt.

          Vielen Dank erstmal für die Mühe! Ich habe diesen Code jetzt übernommen und stoße auf folgendes Problem:

          Alle Dateien liegen im gleichen Verzeichnis.

          index.php, kontakt.php, journal.php und dergleichen: [...]

          Tun sie auch bei mir.

          list.json:

          Sieht bei mir derzeit so aus:

          [
            { "url": "index.php", "title": "Startseite" },
            { "url": "inhalt.php", "title": "Inhaltsverzeichnis" }
          ]
          

          Die Navigation gibt mir am Ende aber aus: "Keine Einträge in Liste."

          Woran liegt das?

          1. Kann ich spontan leider nicht beantworten. Versuch es mal mit Debugging:

  2. Kannst du kurz den Anwendungsfall dafür erläutern?

    1. @@mermshaus

      Kannst du kurz den Anwendungsfall dafür erläutern?

      Lineares Navigieren durch die Information, d.h. Lesen des Inhalts der Website von Anfang bis Ende.

      So wie es früher™ in der SELFHTML-Doku war: jede Seite[1] hatte einen Link zur vorigen und zur nächsten Seite.

      LLAP 🖖

      --
      „Wenn du eine weise Antwort verlangst, musst du vernünftig fragen.“ —Johann Wolfgang von Goethe

      1. außer die erste bzw. letzte ↩︎

      1. @VivienSchiller @Gunnar Bittersmann

        Ich frage, weil es beispielsweise in so einem Fall (sofern der vorliegt) wahrscheinlich sinnvoller ist, über einen Front-Controller-Ansatz zu gehen (z. B. index.php mit ?page=<filename>[1]) und die Navigation somit an einer zentralen Stelle im Layout zu berechnen/erstellen und dann jeweils den konkreten Content zusätzlich zu laden.

        Umgekehrt müsste man redundant in jede Inhaltsseite so was wie…

        <?php
        require __DIR__ . '/../lib/navigation.php';
        echo generateNavigation(__FILE__);
        ?>
        

        einfügen. Das wird je nach Anzahl der Dateien oder je nachdem, was man sonst noch so vorhaben könnte, gern mal unpraktisch beziehungsweise fehleranfällig, weil der Code gegebenenfalls an mehreren Stellen verändert werden muss.


        1. Die URLs können mit Rewriting auch anders aussehen. ↩︎

  3. Hallo ihr Lieben,

    ich sitze grade an einer PHP-Seite und frage mich ob es möglich ist immer zur alphabetisch nächsten Seite zu verlinken.

    Du brauchst eine Konfiguration wo für jede Seite ein paar Eigenschaften festgelegt sind. So kennt jede Seite z.B. ihren Titel und den Ordner in den sie hineingehört. Damit baut der Code den Link zur nächsten Seite ein.

    Oder in die WebSite-Konfiguration für die Seite den Nachfolger händisch selbst eintragen z.B. next = \di.html und den Rest erledigt der für die betreffende Seite zuständige Code.

    Das A und O ist eine Konfiguration. MfG

  4. Hallo und guten Tag,

    ich will meinen Senf auch nicht alleine essen und Dir/Euch deshalb etwas davon abgeben. ;-)

    Diese Unsitte, eine zentralisierte Seitenverwaltung für ein passives Web einzusetzen, halte ich so langsam für Überdenkenswert bzw. abschaffungswürdig:

    http://example.org/index.php?page=721347

    Und wenn man dann noch diese Art der Verlinkung wieder mühevoll zurückentwickelt, um wieder sprechende Links zu haben, dann halte ich das für noch überflüssiger.

    Sinnvoller würde ich ein System finden, in dem alle Dokumente mit ihrem Zubehör in Verzeichnissen untergebracht werden. Um eine einheitliche Navigation automatisch zu erzeugen, kann man dann einen eigenen kleinen Crawler aufrufen, der alle domaininternen Links und alle externen Links aus den Seiten zusammensammelt. Die überarbeitete Liste kann man dann überall automatisch einbinden, wo sie erwünscht ist. Früher nannte man sowas Sitemap.

    Und die letzte Frage wie immer zum Schluss: warum muss man für gut gemachte und informative Websites überhaupt ein Menu haben? Das macht den ganzen Auftritt doch eigentlich nur langweilig ;-)

    Grüße
    TS

    --
    es wachse der Freifunk
    http://freifunk-oberharz.de
    1. Sinnvoller würde ich ein System finden, in dem alle Dokumente mit ihrem Zubehör in Verzeichnissen untergebracht werden. Um eine einheitliche Navigation automatisch zu erzeugen, kann man dann einen eigenen kleinen Crawler aufrufen, der alle domaininternen Links und alle externen Links aus den Seiten zusammensammelt. Die überarbeitete Liste kann man dann überall automatisch einbinden, wo sie erwünscht ist. Früher nannte man sowas Sitemap.

      Noch besser sind virtuelle Ordner, weil: Wird eine Seite in einen anderen vituellen Ordner verschoben, bleibt der URL der Seite unverändert. Das handhabe ich schon seit Jahren so und selbstverständlich steht und fällt sowas mit einer Konfiguration -- die für den wahlfreien Zugriff komplett im Hauptspeicher liegt. Man könnte auch sagen: Die Konfiguration ist die Projektverwaltung: Ein Blick da rein zeigt dem Verwalter wo seine Seiten eingeordnet sind. Und ein sitemap da raus zu ziehen ist dann auch kein Thema mehr sondern nur noch eine Frage der Konfiguration:

      [/sitemap.xml]
      class=Sitemap
      no_sitemap=1
      

      Was zu tun ist, das bischen XML erzeugen, das erledigt die an den URL gebundene Klasse. Und selbstverständlich will auch ein Suchmaschinenbetreiber ein menschenlesbare Menu bzw. eine griffige Navigation auf jeder Seite vorfinden.

      MfG, schönen Sonntag.

    2. Diese Unsitte, eine zentralisierte Seitenverwaltung für ein passives Web einzusetzen, halte ich so langsam für Überdenkenswert bzw. abschaffungswürdig:

      "passives Web"? Was das?

      http://example.org/index.php?page=721347

      Und wenn man dann noch diese Art der Verlinkung wieder mühevoll zurückentwickelt, um wieder sprechende Links zu haben, dann halte ich das für noch überflüssiger.

      Häh?

      Sinnvoller würde ich ein System finden, in dem alle Dokumente mit ihrem Zubehör in Verzeichnissen untergebracht werden.

      Im Dateisystem? Für ein Projekt mit 10 Seiten vielleicht, aber bei was "Richtigem"???

      Und die letzte Frage wie immer zum Schluss: warum muss man für gut gemachte und informative Websites überhaupt ein Menu haben? Das macht den ganzen Auftritt doch eigentlich nur langweilig ;-)

      Ich muss mich wiederholen: Häh?