apsel: Verlinke niemals auf die aktuelle Seite

Om nah hoo pez nyeetz,

bei einem etwas umfangreicheren Projekt brückentage.info würde ich das ungern händisch lösen; das Menü ist per SSI eingebunden. Eine Suche hat folgendes ergeben:

#1#
Eine reine CSS-Lösung ist nicht möglich, auch wenn hier das Gegenteil behauptet wird. So könnte man zwar den Link auf die aktuelle Seite hervorheben, aber er wäre immer noch vorhanden. Außerdem bedarf es auch für jede Seite einen CSS-Eintrag #seiten-id #menu-id bzw. ggf. #seiten-id > #menu-id.

#2#

Aber auch das lässt sich ja mit SSI oder PHP recht unproblematisch erreichen: Wenn URI des Menüpunktes = URI der aktuellen Seite, dann wird nicht verlinkt.

Live long and prosper,
Gunnar

aus einer Zeit, als die Klingonen noch englisch sprachen, also vor dem Khitomer-Massaker ;-)

Ich würd gern wissen wissen, wie das via SSI zu lösen ist. Oder auch auch per Java-Script

Matthias

--
  1. hi,

    Ich würd gern wissen wissen, wie das via SSI zu lösen ist. Oder auch auch per Java-Script

    Na so, wie Gunnar schreibt: Über URI. Genauer: Die Seite, die gerade geladen ist hat eine Adresse zur Identification, diese Adresse, der Identiyfier findet sich serverseitig in der Variablen REQUEST_URI:

    $ENV{REQUEST_URI}      # Perl
     $_SERVER[REQUEST_URI]  # PHP

    und damit kannst Du den Link automatisch ausblenden.

    Hotti

    --
    Butter is better, Betty.
    1. Hi!

      Die Seite, die gerade geladen ist hat eine Adresse zur Identification, diese Adresse, der Identiyfier findet sich serverseitig in der Variablen REQUEST_URI:

      Allerdings nur wenn der Server entsprechend konfiguriert wurde.
      Auch wenn Server normalerweise so eingestellt sind, dass REQUEST_URI zur Verfügung steht sollte man es doch noch erwähnen ;)

      Grüße, Matze

    2. Om nah hoo pez nyeetz,

      $ENV{REQUEST_URI}      # Perl
      $_SERVER[REQUEST_URI]  # PHP

      und damit kannst Du den Link automatisch ausblenden.

      da ich so etwas noch *nie* gemacht und tatsächlich sowohl von Perl als auch von PHP *Null* Ahnung habe, wäre ich für umfangreichere Hinweise dankbar.

      Matthias

      --
      1. Hallo,

        da ich so etwas noch *nie* gemacht und tatsächlich sowohl von Perl als auch von PHP *Null* Ahnung habe, wäre ich für umfangreichere Hinweise dankbar.

        Versuch mal <?PHP echo htmlspecialcharrs($_SERVER['REQUEST_URI']); ?>.
        Da hast du, vorrausgesetzt dein Server ist entsprechend eingestellt und dir steht PHP zur Verfügung, die URI des aufgerufenen Scripts.
        Inklusive aller mitgelieferten GET-Parameter.

        Grüße, Matze

  2. Hallo,

    bei einem etwas umfangreicheren Projekt brückentage.info würde ich das ungern händisch lösen; das Menü ist per SSI eingebunden. Eine Suche hat folgendes ergeben:

    #2#

    Aber auch das lässt sich ja mit SSI oder PHP recht unproblematisch erreichen: Wenn URI des Menüpunktes = URI der aktuellen Seite, dann wird nicht verlinkt.

    Ich würd gern wissen wissen, wie das via SSI zu lösen ist.

    Jeden einzelnen Menüpunkt in das Konstrukt, das Gunnar vorgeschlagen hat, einpacken:

    Wenn URI des Menüpunktes = URI der aktuellen Seite
        Schreibe {Beschriftung}
    Sonst
        Schreibe <a href="{Ziel}">{Beschriftung}</a>
    Ende Wenn

    {Ziel} und {Beschriftung} nutzte ich als Platzhalter für URI und Text des Menüpunktes, die für die Menüpunkte unterschiedlich sein werden. URI der aktuellen Seite bekommst Du aus einer Umgebungsvariablen, siehe zum Beispiel <http://de.selfhtml.org/servercgi/server/ssi.htm#uebersicht@title=SELFHTML, bekannte Server Side Includes>.

    Freundliche Grüße

    Vinzenz

    1. Om nah hoo pez nyeetz,

      Wenn URI des Menüpunktes = URI der aktuellen Seite
          Schreibe {Beschriftung}
      Sonst
          Schreibe <a href="{Ziel}">{Beschriftung}</a>
      Ende Wenn

      Diese Logik ist mir klar, was fehlt ist im Moment noch die Syntax, aber die gibts wohl auch http://de.selfhtml.org/servercgi/server/ssi.htm#uebersicht@title=hier. Das werde ich am Wochenende mal testen.

      Vielen Dank
      Matthias

      --
      1. Hi!

        Diese Logik ist mir klar, was fehlt ist im Moment noch die Syntax, aber die gibts wohl auch http://de.selfhtml.org/servercgi/server/ssi.htm#uebersicht@title=hier. Das werde ich am Wochenende mal testen.

        Dieses Tutorial könnte dir weiterhelfen: Navigation mit Server Side Includes

        FG Ulysses

        1. Om nah hoo pez nyeetz,

          Dieses Tutorial könnte dir weiterhelfen: Navigation mit Server Side Includes

          Das sieht gut aus.

          Matthias

          --
          1. Hallo Matthias,

            Dieses Tutorial könnte dir weiterhelfen: Navigation mit Server Side Includes

            Das sieht gut aus.

            es erklärt leider nicht die Syntax der verwendeten Bedingungen und macht es meiner Meinung nach komplizierter als erforderlich, weil unnötigerweise zu regulären Ausdrücken gegriffen wird. Bessere grundlegende Informationen bekommst Du bei den SSI-Developern, Conditional Expressions.

            Ich hab' mir Deine Seiten angeschaut. Deine Navigation scheint jahresabhängig zu werden und ich weiß nicht, ob Du vorhast, dies alles mit *einer* einzigen Include-Datei für alle Jahre zu erledigen, oder ob Du für jedes Jahr die Include-Datei aktualisierst.

            Du arbeitest innerhalb eines Jahres mit relativen Pfadangaben und könntest ohne Probleme auf das Präfix ./ verzichten. Davon gehe ich bei meinen Ausführungen aus.

            Ich versuche es kurz anzureißen:

            Derzeit sehen Deine Navigationspunkte so aus:

              
            <p>Ferienkalender</p>  
               <ul>  
                 <li><a href="./bw-2010.html">Baden-Württemberg</a></li>  
                 <li><a href="./by-2010.html">Bayern</a></li>  
                 <!-- weitere Menüpunkte -->  
               <ul>  
            
            

            In deiner Include-Datei kannst Du nun schreiben
            Beachte: die Umgebungsvariable DOCUMENT_NAME enthält nur den Namen der aufgerufenen Ressource - ohne Pfadangabe.
            Um sicherzustellen, dass in Ausdrücken (Expressions) Deine Variablen als Variablen behandelt werden, schreibe sie in der Form ${Variablenname}.

            <p>Ferienkalender</p>  
               <ul>  
                 <li>  
                 [code lang=apache]<!--#if expr="${DOCUMENT_NAME} = bw-2010.html" -->
            

            <!-- Lautet der Name der aufgerufenen Ressource bw-2010.html? -->
                 <!-- Punkt ist aktuelle Seite, nicht verlinken! -->
                 Baden-Württemberg
                 <!--#else -->
                 <!-- nicht die aktuelle Seite, verlinke! -->
                 <a href="bw-2010.html">Baden-Württemberg</a>
                 <!--#endif -->
                 </li>
                 <!-- analog die weiteren Menüpunkte -->
               <ul>[/code]

            Ich habe den Vergleich zweier Zeichenketten gewählt, statt einem regulären Ausdruck, was zu einfacherem Code führte. Außerdem finde ich die Logik:

            Wenn uri = aktuelle Seite
                Schreibe unverlinkten Menüpunkt
            Sonst
                Schreibe mit uri verlinkten Menüpunkt
            Ende Wenn

            "intuitiver" als den negierten Vergleich. Das ist Geschmackssache. Sonst entspricht es dem Vorgehen im von Ulysses verlinktem Tutorial.

            Verbesserungspotential ist vorhanden:
            Du möchtest die Resource umbenennen? Bereits bei diesem Schnippsel musst Du an zwei Stellen ändern. Das geht besser, indem wir eine Variable nutzen, in der wir die URI speichern:

            <p>Ferienkalender</p>  
               <ul>  
                 <li>  
                 <!--#set var="uri" value="bw-2010.html" -->  
                 <!--#if expr="${DOCUMENT_NAME} = ${uri}" -->  
                 <!-- Stimmt der Name der aufgerufenen Ressource mit dem Inhalt der Variablen uri überein? -->  
                 <!-- Punkt ist aktuelle Seite, nicht verlinken! -->  
                 Baden-Württemberg  
                 <!--#else -->  
                 <!-- nicht die aktuelle Seite, verlinke! -->  
                 <!-- Schreibe das Linkziel mit SSI -->  
                 <a href="[code lang=apache]<!--#echo var="uri" -->
            ~~~">Baden-Württemberg</a>  
                 <!--#endif -->  
                 </li>  
                 <!-- analog die weiteren Menüpunkte -->  
               <ul>[/code]  
              
            Im nächsten Schritt könnte man analog den Menütext in eine Variable packen, um nur noch an einer Stelle ändern zu müssen - und nur noch eine Stelle zu haben, Fehler zu machen :-)  
              
            Wenn Du nun noch die Jahresangabe, die in jeder URI steckt, über eine Variable steuerst, dann musst Du für jedes neue Jahr nur noch an einer einzigen Stelle eine Änderung vornehmen. Wenn Du das Jahr aus dem Pfad zum Skript ermitteln kannst, so kannst Du eine Include-Datei schreiben, die für alle Jahre gleich ist.  
              
              
            Freundliche Grüße  
              
            Vinzenz
            
            1. Om nah hoo pez nyeetz,

              Ich hab' mir Deine Seiten angeschaut. Deine Navigation scheint jahresabhängig zu werden und ich weiß nicht, ob Du vorhast, dies alles mit *einer* einzigen Include-Datei für alle Jahre zu erledigen, oder ob Du für jedes Jahr die Include-Datei aktualisierst.

              Bisher habe ich für jedes Jahr eine include.

              Vielen Dank für deine ausführliche Anleitung.

              Wenn Du nun noch die Jahresangabe, die in jeder URI steckt, über eine Variable steuerst, dann musst Du für jedes neue Jahr nur noch an einer einzigen Stelle eine Änderung vornehmen. Wenn Du das Jahr aus dem Pfad zum Skript ermitteln kannst, so kannst Du eine Include-Datei schreiben, die für alle Jahre gleich ist.

              Es wäre denkbar, die Jahresangabe in ein Attribut zu stecken. <body title="2010"> was dann fehlt, ist Syntax um den Titel auszulesen, aber ein wenig möchte ich auch noch selbst tun.

              btw. ist es eine gute Idee, den Titel zu missbrauchen oder verwendet man besser ein eigenes Attribut <body jahreszahl="2010">?

              Matthias

              --
              1. Hallo Matthias,

                Bisher habe ich für jedes Jahr eine include.
                Vielen Dank für deine ausführliche Anleitung.

                ich helfe und lerne gerne :-)

                Wenn Du nun noch die Jahresangabe, die in jeder URI steckt, über eine Variable steuerst, dann musst Du für jedes neue Jahr nur noch an einer einzigen Stelle eine Änderung vornehmen. Wenn Du das Jahr aus dem Pfad zum Skript ermitteln kannst, so kannst Du eine Include-Datei schreiben, die für alle Jahre gleich ist.

                ich meine hier: Ermitteln mit SSI!

                btw. ist es eine gute Idee, den Titel zu missbrauchen oder verwendet man besser ein eigenes Attribut <body jahreszahl="2010">?

                nicht aus dem Dokument, sondern - ähnlich wie im Tutorial angegebenen Beispiel - aus den Pfadangaben, die eine bestimmte Struktur einhalten müssen, ermitteln.

                Beispiel wäre folgende Verzeichnisstruktur, die Deiner jetztigen Verzeichnis- und Dateistruktur entspricht (auch wenn nicht alle Dateien und Verzeichnisse vorhanden sind):

                /
                |
                |- 2009/
                |      |- bw-2009.html
                |      |- by-2009.html
                |      |- ...
                |
                |- 2010/
                |      |- bw-2010.html
                |      |- by-2010.html

                Schauen wir uns ein paar Umgebungsvariablen an. Für Deinen Anwendungsfall kommen DOCUMENT_URI und DOCUMENT_NAME wie gerufen. Diese stehen bei mod_include, der Voraussetzung für SSI (unter apache) stets zur Verfügung.

                <!-- Wir schauen uns an, was es alles an Umgebungsvariablen gibt -->  
                <pre>  
                <!--#printenv -->  
                </pre>
                

                Wir schauen uns den kompletten Pfad zur aufgerufenen Ressource an und den Namen des Dokumentes:

                <p>DOCUMENT_URI: <!--#echo var="DOCUMENT_URI" --></p>
                <p>DOCUMENT_NAME: <!--#echo var="DOCUMENT_NAME" --></p>

                Wir ermitteln, ob im Pfad eine (mindestens) vierstellige Zahl vorkommt. Wenn ja, speichern wir diese vierstellige Zahl in der Variablen mit dem Namen "jahr". Dazu nutzen wir einen regulären Ausdruck mit Merken von Teilausdrücken, siehe auch http://de.selfhtml.org/perl/sprache/regexpr.htm#merken@title=SELFHTML:

                <!--#if expr="${DOCUMENT_URI} = /\/([0-9]{4,})\/${DOCUMENT_NAME}$/"  
                    <!--#set var="jahr" value="${1}" -->  
                <!--#endif -->  
                <!--#echo var="jahr" -->  
                
                

                Erläuterung des regulären Ausdrucks:

                ${DOCUMENT_URI}   # Wenn wir im Inhalt der Umgebungsvariablen DOCUMENT_URI
                = /               # Begrenzungszeichen des regulären Ausdrucks
                /                # ab irgendeinem Punkt einen Slash (den wir mit einem
                                  # Backslash maskieren müssen, weil der Slash das
                                  # Begrenzungszeichen des regulären Ausdrucks darstellt)
                                  # finden,
                (                 # Wir fangen den Teilausdruck ein
                [0-9]             # Der Teilausdruck fängt mit einer Ziffer an,
                {4,}              # es sind mindestens vier Ziffern
                                  # (damit wir kein Jahr-10000-Problem bekommen [1])
                )                 # Wir beenden das Einfangen.
                /                # nach den Ziffern folgt ein Slash (maskiert, s.o)
                ${DOCUMENT_NAME}  # gefolgt vom Inhalt der Umgebungsvariablen DOCUMENT_NAME
                                  # (siehe Variablen-Substitution),
                $                 # gefolgt vom Ende der Zeichenkette
                /                 # Ende des regulären Ausdrucks

                Den Teilausdruck, den wir fangen ist die mindestens vierstellige Zahl, die das tiefste Unterverzeichnis im Pfad der URI angibt.

                Da es der erste Teilausdruck ist, den wir einfangen, können wir später über die Variable $1 darauf zugreifen. Im Erfolgsfall speichern wir das Jahr in der Variablen jahr zwischen. Das Jahr müssen wir nur ein einziges Mal ermitteln, da im Menü alle Verweise auf das gleiche Jahr verweisen, nur unterschiedliche Bundesländer.

                Bauen wir die URI zusammen (am Beispiel von Baden-Württemberg):

                <!--#set var="uri" value="bw-${jahr}.html" -->
                An den festen Text

                bw-

                hängen wir den Inhalt der Variablen jahr und daran den festen Text

                .html

                und erfüllen so das von Dir vorgegebene Namensschema unabhängig davon, in welchem Jahresverzeichnis wir uns befinden. Siehe ebenfalls Abschnitt Variablen-Substitution in der Doku.

                <li>  
                <!-- Stimmt der Name des geladenen Dokuments mit dieser Zeichenkette überein -->  
                <!-- geben wir den Menüpunkt unverlinkt aus -->  
                <!--#if expr="${DOCUMENT_NAME} = ${uri}" -->  
                    Baden-Württemberg  
                <!--#else -->  
                    <!-- müssen wir verlinken -->  
                    <a href="[code lang=apache]<!--#echo var="uri" -->
                ~~~">Baden-Württemberg</a>  
                <!--#endif -->  
                </li>[/code]  
                  
                Andere Bundesländer analog. Dadurch, dass Du das Jahr aus dem Verzeichnis ausliest, kannst Du die gleiche Include-Datei für jedes Jahr verwenden. Verbesserungspotential ist noch genug vorhanden, unter anderem verletze ich derzeit an mindestens einer Stelle [DRY](http://de.wikipedia.org/wiki/DRY). Du willst am Wochenende noch genug Stoff zum Experimentieren haben. Viel Spass mit SSI, Du siehst, dass man damit eine Menge erreichen kann.  
                  
                  
                Freundliche Grüße  
                  
                Vinzenz  
                  
                [1] [Gunnar und seth](/archiv/2006/3/t126272/#m814810) haben mich für die Ewigkeit beeindruckt!  
                
                
                1. Om nah hoo pez nyeetz,

                  wiederholt vielen Dank für Zeit und Mühe.

                  <!--#if expr="${DOCUMENT_URI} = //([0-9]{4,})/${DOCUMENT_NAME}$/"

                  <!--#set var="jahr" value="${1}" -->
                  <!--#endif -->
                  <!--#echo var="jahr" -->

                  
                  >   
                    
                  Die ausführlichen Erläuterungen dazu habe ich verstanden. Leider gibt es die Fehlermeldung, dass ein Fehler während der Ausführung dieser Direktive aufgetreten ist. Bestimmt ist es nur eine Syntax-Geschichte. Wo gibt es denn etwas aussagekräftigere Fehlermeldungen?  
                    
                  Da es auch Dateien ohne Jahreszahl gibt, habe ich den Code wie folgt verändert:  
                  ~~~html
                  <!--#if expr="${DOCUMENT_URI} = /\/([0-9]{4,})\/${DOCUMENT_NAME}$/"  
                         <!--#set var="jahr" value="${1}" -->  
                  <!--#else -->  
                         <!--#config timefmt="%Y" -->  
                         <!--#set var="jahr" value="${DATE_LOCAL}" -->  
                  <!--#endif -->  
                  <!-- Zur Kontrolle -->  
                  <!--#echo var="jahr" -->
                  

                  mit dem Ziel, dass das aktuelle Jahr aufgerufen wird, sollte jemand z.B. die index.html anschauen.

                  Der else-Zweig ist wohl richtig, denn wenn ich nur ~~~html

                  <!--#config timefmt="%Y" -->
                         <!--#set var="jahr" value="${DATE_LOCAL}" -->

                  verwende, bekomme ich die erwartete Ausgabe.  
                    
                  Der erste Verdacht für die falsche Syntax war  
                  `<!--#set var="jahr" value="${1}" -->`{:.language-html}  
                  weil es im [Artikel zur Variablensubstituion](http://httpd.apache.org/docs/2.2/mod/mod_include.html#substitution) etwas anders aussieht. Die Veränderung zu  
                    
                  `<!--#set var="jahr" value="$1" -->`{:.language-html}  
                  ändert jedoch nichts an der Fehlermeldung ebenso wie die Änderung zu  
                  `<!--#set var="jahr" value="abcd" -->`{:.language-html}.  
                  Deshalb muss es wohl an der Bedingung liegen.  
                    
                  Matthias
                  
                  -- 
                  ![](http://www.billiger-im-urlaub.de/kreis_sw.gif)
                  
                  1. Hallo Matthias,

                    Leider gibt es die Fehlermeldung, dass ein Fehler während der Ausführung dieser Direktive aufgetreten ist.
                    Da es auch Dateien ohne Jahreszahl gibt, habe ich den Code wie folgt verändert:

                    <!--#if expr="${DOCUMENT_URI} = //([0-9]{4,})/${DOCUMENT_NAME}$/"

                    <!--#set var="jahr" value="${1}" -->
                    <!--#else -->
                           <!--#config timefmt="%Y" -->
                           <!--#set var="jahr" value="${DATE_LOCAL}" -->
                    <!--#endif -->
                    <!-- Zur Kontrolle -->
                    <!--#echo var="jahr" -->

                      
                    
                    > mit dem Ziel, dass das aktuelle Jahr aufgerufen wird, sollte jemand z.B. die index.html anschauen.  
                      
                    Ich kann das nicht nachvollziehen. Bei mir wird dieser Code anstandslos ausgeführt. Im Übrigen könntest Du den Code umschreiben:  
                      
                    1\. Schritt:  
                    Initialisiere die Variable "jahr" mit dem Standardwert, dem aktuellen Jahr.  
                    Es ist im Normalfall eine gute Idee, Variablen zu initialisieren.  
                      
                    <!--#config timefmt="%Y" -->  
                    <!--#set var="jahr" value="${DATE\_LOCAL}" -->  
                      
                    2\. Schritt:  
                      
                    Gibt es im Pfad die Jahresangabe, so nimm diese:  
                      
                    <!--#if expr="${DOCUMENT\_URI} = /\/([0-9]{4,})\/${DOCUMENT\_NAME}$/"  
                        <!--#set var="jahr" value="${1}" -->  
                    <!--#endif -->  
                      
                    3\. Schritt: Kontrollausgabe  
                      
                    
                    > <!--#echo var="jahr" -->  
                      
                      
                    Freundliche Grüße  
                      
                    Vinzenz
                    
                    1. Hallo Vinzenz,

                      bloß gut, dass gerade nicht so ein tolles Wetter ist.

                      Das ist der Quelltext des Dokumentes http://selfhtml.apsel-mv.de/2015/ssitest.html

                      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
                      <html>
                      <head>
                      <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
                      <meta http-equiv="content-language" content="de">
                      <title>ssi - test</title>
                      </head>
                      <body>
                      <p>DOCUMENT_URI: <!--#echo var="DOCUMENT_URI" --></p>
                      <p>DOCUMENT_NAME: <!--#echo var="DOCUMENT_NAME" --></p>
                      <p>
                      <!--#if expr="${DOCUMENT_URI} = //([0-9]{4,})/${DOCUMENT_NAME}$/"
                          <!--#set var="jahr" value="${1}" -->
                      <!--#endif -->
                      <!--#echo var="jahr" -->
                      </p>

                      <p>
                      <!--#config timefmt="%Y" -->
                      <!--#set var="jahr" value="${DATE_LOCAL}" -->
                      <!--#if expr="${DOCUMENT_URI} = //([0-9]{4,})/${DOCUMENT_NAME}$/"
                          <!--#set var="jahr" value="${1}" -->
                      <!--#endif -->
                      <!--#echo var="jahr" -->
                      </p>
                      </body>
                      </html>

                      Das ist das Ergebnis.

                      DOCUMENT_URI: /2015/ssitest.html

                      DOCUMENT_NAME: ssitest.html

                      [an error occurred while processing this directive] (none)

                      [an error occurred while processing this directive] 2010

                      Matthias

                      --
                      1. Om nah hoo pez nyeetz,

                        <!--#if expr="${DOCUMENT_URI} = //([0-9]{4,})/${DOCUMENT_NAME}$/"

                        Es fehlt -->

                        Matthias

                        --
                      2. Hallo,

                        bloß gut, dass gerade nicht so ein tolles Wetter ist.

                        ich kann nicht klagen. Wir hatten heute ungefähr soviel Sonne wie im Januar und Februar zusammen. Ich hab's genutzt ...

                        Freundliche Grüße

                        Vinzenz