borisbaer: PHP function: Wie umgehe ich, dass eine Variable jedes Mal erneut definiert werden muss?

0 60

PHP function: Wie umgehe ich, dass eine Variable jedes Mal erneut definiert werden muss?

borisbaer
  • php
  1. 0
    Rolf B
    1. 0
      borisbaer
      1. 1
        Raketenwilli
        • php
        • programmiertechnik
        • programmplanung
        1. 0
          borisbaer
          1. 0
            Raketenwilli
            1. 0
              borisbaer
              1. 0
                Raketenwilli
                1. 0
                  borisbaer
                  1. 0
                    borisbaer
                    1. 0
                      Raketenwilli
                      1. 0
                        borisbaer
                        1. 1

                          PHP-Syntax: Anführungszeichen

                          Gunnar Bittersmann
                          • php
                          1. 0
                            Der Martin
                            • programmierstil
                            • syntax
                            1. 1
                              Raketenwilli
                              1. 0
                                Der Martin
                              2. 0

                                Mein höchstpersönlicher Monk bricht aus mir heraus

                                Auge
                                • menschelei
                                • programmierstil
                                • syntax
                                1. 0
                                  Gunnar Bittersmann
                                  • menschelei
                                  1. 0
                                    Auge
                                2. 0
                                  Raketenwilli
                              3. 0
                                borisbaer
                            2. 0
                              Gunnar Bittersmann
                          2. 0
                            borisbaer
                        2. 0
                          Tabellenkalk
                          1. 0
                            Raketenwilli
                          2. 1
                            Gunnar Bittersmann
                            • php
                            • programmierstil
                            1. 0
                              Tabellenkalk
                              1. 0
                                Gunnar Bittersmann
                            2. 0
                              borisbaer
                              1. 0

                                Sollte, hyperliquide Prüfung

                                Raketenwilli
                                1. 0
                                  Raketenwilli
                                  1. 0
                                    Rolf B
                                    1. 1
                                      Raketenwilli
                                2. 0
                                  borisbaer
                                  1. 0
                                    Raketenwilli
                                    1. 0
                                      Rolf B
                                      1. 0
                                        Raketenwilli
                                        1. 0
                                          Rolf B
                                        2. 0
                                          Der Martin
                                          • dateisystem
                                          • meinung
                                          1. 0
                                            Gunnar Bittersmann
                                            • cms
                                            • dateisystem
                                      2. 0
                                        borisbaer
                              2. 1
                                Rolf B
                                1. 0
                                  borisbaer
                                  1. 0
                                    Rolf B
                                    1. 0
                                      Tabellenkalk
                                    2. 0
                                      Der Martin
                                      • menschelei
                        3. 1
                          Rolf B
                          1. 0
                            Der Martin
    2. 0
      Der Martin
      1. 0
        borisbaer
        1. 0
          Der Martin
          1. 0
            borisbaer
            1. 0
              Der Martin
              1. 0
                Rolf B
        2. 1
          Gunnar Bittersmann
          • aria
          • php
          1. 1
            Gunnar Bittersmann
            • php
            • sicherheit
          2. 0
            borisbaer
            1. 0
              Gunnar Bittersmann
  2. 0
    Rolf B
    1. 0
      Gunnar Bittersmann
      • barrierefreiheit

Hallo zusammen,

ich möchte verhindern, dass ich bei den im Bild unten dargestellten Funktionen jedes Mal die Variable $current erneut definieren muss. Meine Versuche, diese Variable von „außen“ einzuspeisen (wie es bspw. dieses Tutorial zeigt) waren leider nicht von Erfolg gekrönt.

Ich wäre für jede Hilfe dankbar!

akzeptierte Antworten

  1. Hallo borisbaer,

    bitte stelle den Sourcecode als Text zur Verfügung. Für den Screenshot sind meine Augen ungeeignet.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf,

      klar doch:

      <?php
      
      // n a v . i n c
      
      function beginNav() { ?>
      
      	<nav id="page">
      
      <?php }
      
      function endNav() { ?>
      
      	</nav>
      
      <?php }
      
      function game() { if (!empty($_GET['subpage'])) { $current = $_GET['subpage']; } ?>
      
      	<a class="<?= $current === null || $current === 'game' ? 'current' : ''; ?>" href="game">Spiel</a>
      
      <?php }
      
      function releases() { if (!empty($_GET['subpage'])) { $current = $_GET['subpage']; } ?>
      
      	<a class="<?= $current === 'releases' ? 'current' : ''; ?>" href="releases">Releases</a>
      
      <?php }
      
      function merchandise() { if (!empty($_GET['subpage'])) { $current = $_GET['subpage']; } ?>
      
      	<a class="<?= $current === 'merchandise' ? 'current' : ''; ?>" href="merchandise">Me<span style="letter-spacing: .115em;">r</span>cha<span style="letter-spacing: .105em;">n</span>dise</a>
      
      <?php }
      
      function guides() { if (!empty($_GET['subpage'])) { $current = $_GET['subpage']; } ?>
      
      	<a class="<?= $current === 'guides' ? 'current' : ''; ?>" href="guides"><span style="letter-spacing: .105em;">Gu</span>ides</a>
      
      <?php }
      
      function emulation() { if (!empty($_GET['subpage'])) { $current = $_GET['subpage']; } ?>
      
      	<a class="<?= $current === 'emulation' ? 'current' : ''; ?>" href="emulation">Emula<span style="letter-spacing: .115em;">t</span>ion</a>
      
      <?php }
      
      function mods() { if (!empty($_GET['subpage'])) { $current = $_GET['subpage']; } ?>
      
      	<a class="<?= $current === 'mods' ? 'current' : ''; ?>" href="mods">Mods</a>
      
      <?php }
      
      function maps() { if (!empty($_GET['subpage'])) { $current = $_GET['subpage']; } ?>
      
      	<a class="<?= $current === 'maps' ? 'current' : ''; ?>" href="maps">Maps</a>
      
      <?php }
      
      function savegame() { if (!empty($_GET['subpage'])) { $current = $_GET['subpage']; } ?>
      
      	<a class="<?= $current === 'savegame' ? 'current' : ''; ?>" href="savegame">S<span style="letter-spacing: .105em;">a</span>vegame</a>
      
      <?php }
      
      1. Du hast da einen Konstruktionsfehler. Die Funktionen lassen sich zu einer zusammenfassen, bei denen Du 2 Werte übergibst: Das Link-Ziel und den Link-Text.

        <?php 
        function getNavLink( $LinkTarget, $Linktext ) { 
            $current = '';
            if ( isset( $_GET['subpage'] ) ) { 
                 if  ( $LinkTarget == $_GET['subpage'] ) { 
                     $current = 'class="current" ';
                 }
            } else {
                 if  ( $LinkTarget == 'game' ) {
                     $current = 'class="current" ';
                 }
            }
        	  return   '<a '
                   . $current
                   . 'href="'
                   . $LinkTarget
                   . '">'
                   . $Linktext
                   . '</a>';
        }
        ?>
        

        Im Template-Teil dann:

        <?=getNavLink('game', 'Game' ); ?>
        <?=getNavLink('releases', 'Releases' ); ?>
        <?=getNavLink('merchandise', 'Me<span style="letter-spacing: .115em;">r</span>cha<span style="letter-spacing: .105em;">n</span>dise' ); ?>
        

        Das ist doch viel einfacher - oder?

        Ich habe hier mal die wichtigen Anmerkungen von Gunnar außer Acht gelassen… Aber von der wilden Durchmischung von HTML, CSS und PHP musst Du dringend weg, weil Du dabei das jeweilige Ziel aus den Augen verlierst und es Dir selbst schwer machst.

        1. Das ist doch viel einfacher - oder?

          In der Tat, vielen Dank! 🙂

          Mit return hat es allerdings nicht funktioniert, ich musste stattdessen echo schreiben.

          Ich habe hier mal die wichtigen Anmerkungen von Gunnar außer Acht gelassen…

          Auf welche Anmerkungen beziehst du dich? Zur Barrierefreiheit? Die hervorgehobenen Links habe ich mittlerweile auf aria-current="page" umgestellt.

          Aber von der wilden Durchmischung von HTML, CSS und PHP musst Du dringend weg, weil Du dabei das jeweilige Ziel aus den Augen verlierst und es Dir selbst schwer machst.

          Das verstehe ich nicht ganz. Wie soll man denn sonst vorgehen? Man mischt doch immer HTML, CSS und PHP. Ich sehe keine Alternative.

          1. Das ist doch viel einfacher - oder?

            In der Tat, vielen Dank! 🙂

            Mit return hat es allerdings nicht funktioniert, ich musste stattdessen echo schreiben.

            Du muss das

            <?=getNavLink(

            nur ohne zuätzliche Leerzeichen screiben... dann geht es ohne echo.

            Das verstehe ich nicht ganz. Wie soll man denn sonst vorgehen? Man mischt doch immer HTML, CSS und PHP. Ich sehe keine Alternative.

            Das kommt noch... Les mal über Templates (php), Klassen und Id (CSS, HTML) nach.

            1. Hallo Raketenwilli,

              Du muss das

              <?=getNavLink(

              nur ohne zuätzliche Leerzeichen screiben... dann geht es ohne echo.

              danke, wieder was gelernt!

              Das kommt noch... Les mal über Templates (php), Klassen und Id (CSS, HTML) nach.

              Ja, PHP-Templates schaue ich mir gerade an. Mit Klassen meinst du wahrscheinlich PHP-Klassen, oder? Hat das was mit OOP zu tun? Ich schätze, du denkst an was ganz Anderes als ich, wenn du von Id im Zusammenhang mit CSS und HTML sprichst.

              1. Mit Klassen meinst du wahrscheinlich PHP-Klassen, oder?

                HTML-Klassen, denen man mit CSS ein Aussehen verpasst. Mit PHP hat das erst mal nur sehr wenig zu tun, außer dass man die Klassennamen natürlich in PHP vergeben kann.

                Ist ja alles nur Text…

                1. HTML-Klassen, denen man mit CSS ein Aussehen verpasst. Mit PHP hat das erst mal nur sehr wenig zu tun, außer dass man die Klassennamen natürlich in PHP vergeben kann.

                  Ach so, na ja, HTML-Klassen und CSS sind nichts Neues für mich. Deswegen dachte ich, du meinst Klassen in PHP. Ich bin gerade dabei, PHP-Templates zu erstellen.

                  Eine Sache noch: Irgendwie funktioniert der Teil deines Codes nicht, der einen leeren URL-Parameter handhaben soll:

                  <?php
                  function navAnchor( $href, $name ) {
                  	$current = '';
                      if ( !empty( $_GET['subpage'] ) )
                          if  ( $href === $_GET['subpage'] )
                              $current = 'aria-current="page" ';
                      else
                          if ( $href === 'game' )
                              $current = 'aria-current="page" ';
                      echo '<a ' . 'href="' . $href . '"' . $current . '>' . $name . '</a>';
                  }
                  ?>
                  
                  <nav id="page">
                      <?php
                      $subpages = $_SERVER['DOCUMENT_ROOT'] . '/pages/' . $uri[1] . '/' . $uri[2] . '/subpages/';
                      if ( file_exists( $path = $subpages . 'game.php' ) ) navAnchor( 'game', 'Spiel' );
                      if ( file_exists( $path = $subpages . 'releases.php' ) ) navAnchor( 'releases', 'Releases' );
                      if ( file_exists( $path = $subpages . 'merchandise.php' ) ) navAnchor( 'merchandise', 'Me<span style="letter-spacing: .115em;">r</span>cha<span style="letter-spacing: .105em;">n</span>dise' );
                      if ( file_exists( $path = $subpages . 'guides.php' ) ) navAnchor( 'guides', '<span style="letter-spacing: .105em;">Gu</span>ides' );
                      if ( file_exists( $path = $subpages . 'emulation.php' ) ) navAnchor( 'emulation', 'Emula<span style="letter-spacing: .115em;">t</span>ion' );
                      if ( file_exists( $path = $subpages . 'mods.php' ) ) navAnchor( 'mods', 'Mods' );
                      if ( file_exists( $path = $subpages . 'maps.php' ) ) navAnchor( 'maps', 'Maps' );
                      if ( file_exists( $path = $subpages . 'savegame.php' ) ) navAnchor( 'savegame', 'S<span style="letter-spacing: .105em;">a</span>vegame' );
                      ?>
                  </nav>
                  

                  /games/demons-souls/ sollte ja eigentlich $current bei 'game' setzen, wenn empty( $_GET['subpage'], tut es aber leider nicht. Ich sehe jedoch keinen Fehler im Code.

                  1. Eine Sache noch: Irgendwie funktioniert der Teil deines Codes nicht, der einen leeren URL-Parameter handhaben soll:

                    Okay, vergiss es, es war nur ein Fehler meinerseits. Scheinbar darf ich die geschweiften Klammern bei dem if und else statement nicht weglassen in diesem Fall. 😬

                    1. Du schreibst gern sehr viel, aber echt gern immer wieder nacheinander das selbe:

                      Warum übernimmst Du nicht das…

                      if ( file_exists( $path = $subpages . 'savegame.php' ) )
                      

                      in die Funktion navAnchor()??? Da hast Du doch 'savegame' schon drin. Für den Rest der Liste gilt das selbe…

                      1. Du schreibst gern sehr viel, aber echt gern immer wieder nacheinander das selbe:

                        Ja, ich wollte das noch irgendwann zusammenfassen. ^^

                        Warum übernimmst Du nicht das…

                        if ( file_exists( $path = $subpages . 'savegame.php' ) )
                        

                        in die Funktion navAnchor()??? Da hast Du doch 'savegame' schon drin. Für den Rest der Liste gilt das selbe…

                        Hier mein Ergebnis:

                        <?php
                        
                        function navAnchor( $href, $name, $uri ) {
                        
                        	$current = '';
                        
                            if ( !empty( $_GET['subpage'] ) ) {
                                if  ( $href === $_GET['subpage'] )
                                    $current = 'aria-current="page"';
                            } else {
                                if ( $href === 'game' )
                                    $current = 'aria-current="page"';
                            }
                        
                            $subpages = $_SERVER['DOCUMENT_ROOT'] . '/pages/' . $uri[1] . '/' . $uri[2] . '/subpages/';
                        
                            if ( file_exists( $subpages . $href . '.php' ) )
                                return '<a ' . 'href="' . $href . '" ' . $current . '>' . $name . '</a>';
                        
                        }
                        
                        ?>
                        
                        <nav id="page">
                        
                            <?=navAnchor( 'game', 'Spiel', $uri );?>
                            <?=navAnchor( 'releases', 'Releases', $uri );?>
                            <?=navAnchor( 'merchandise', 'Merchandise', $uri );?>
                            <?=navAnchor( 'guides', 'Guides', $uri );?>
                            <?=navAnchor( 'emulation', 'Emulation', $uri );?>
                            <?=navAnchor( 'mods', 'Mods', $uri );?>
                            <?=navAnchor( 'maps', 'Maps', $uri );?>
                            <?=navAnchor( 'savegame', 'Savegame', $uri );?>
                        
                        </nav>
                        

                        Ich habe das jetzt mal so übernommen, wie du es ersprünglich geschrieben hast: mit einem return statt eines echo. Anschließend initialisiere ich die Funktionen mit <?=, wie du ja meintest. Was ist denn eigentlich sinnvoller: Jedes mal <?= ?> zu schreiben oder einfach <?php ?> und alle Funktionen rein? Ich verstehe leider noch nicht so ganz den Sinn hinter diesen verschiednen Möglichkeiten, PHP-Code zu beginnen.

                        1. @@borisbaer

                          return '<a ' . 'href="' . $href . '" ' . $current . '>' . $name . '</a>';
                          

                          Das ist schrecklich unleserlicher Code.

                          Mit dem Unterschied zwischen einfachen und doppelten Anführungszeichen in PHP bist du vertraut?

                          return "<a href='$href' $current>$name</a>";
                          

                          🖖 Живіть довго і процвітайте

                          PS: Und das betrifft alle Stellen, wo du einen . machst.

                          PPS: In JavaScript wäre das Äquivalent
                          return `<a href="${href}" ${current}>${name}</a>`;

                          --
                          When the power of love overcomes the love of power the world will know peace.
                          — Jimi Hendrix
                          1. Hallo,

                            return '<a ' . 'href="' . $href . '" ' . $current . '>' . $name . '</a>';
                            

                            Das ist schrecklich unleserlicher Code.

                            ich sehe das nicht so.

                            return "<a href='$href' $current>$name</a>";
                            

                            Das liest sich für dich besser?

                            Okay, das ist noch ein relativ einfaches Beispiel, das für mich in beiden Schreibweisen gut zu erkennen ist. Wenn es aber etwas komplexer wird, komme ich mit sequentiellen Ausdrücken (wie die Stringverkettung im ersten Beispiel) besser zurecht als mit verschachtelten. Es sei denn, die verschachtelten Sub-Terme sind mir ihrerseits so vertraut, dass ich ihren Zweck oder ihre Aussage sofort auf einen Blick erkenne.

                            Sequentiell formulierte Terme kann man der Lesbarkeit zuliebe auch gut mehrzeilig schreiben. Aber dann bitte mit dem entscheidenden Operator am Anfang der Folgezeile, nicht am Zeilenende. Sonst ist der Vorteil der schnellen Erkennbarkeit wieder futsch.

                            Einen schönen Tag noch
                             Martin

                            --
                            Nein, Esel sind nicht störrisch. Sie wissen es einfach nur besser.
                            1. Das ist schrecklich unleserlicher Code.

                              Sequentiell formulierte Terme kann man der Lesbarkeit zuliebe auch gut mehrzeilig schreiben. Aber dann bitte mit dem entscheidenden Operator am Anfang der Folgezeile, nicht am Zeilenende. Sonst ist der Vorteil der schnellen Erkennbarkeit wieder futsch.

                              Jepp. Vor allem wenn das Ergebnis etwas wie ein „String, der formalen Vorschriften unterliegt“ sein soll. Hier soll das Ergebnis gültiges und auch sonst richtiges HTML sein.

                              Gründe:

                              • Ich kann sowas gut lesen, auch bei den derzeitigen Temperaturen.
                              • Ich bin nach dem Lesen und Deuten, erst recht Editieren eines so verketteten Strings nicht urlaubsreif. Das könnte man vergleichen mit der Situation beim Erfassen „einfacher Sprache“ oder eines Raketenkastensatzes.
                              • 😍 Im Hinblick auf die Grammatik übrigens auch mit dem Schreiben eines ebensolchenwelchen.
                              • Zudem lassen sich bei dieser Schreibweise (die ich nicht grundlos gezeigt habe) auch Einfügungen - z.b. ein htmlentities() um eine Variable - sogar für einen Schluderer wie ich es bin - sehr einfach und auf Anhieb richtig verbauen.
                              • Schon in der Grundschule hat man solche Schreibweisen beim Rechnen ohne Taschenrechner kennengelernt…

                              Zur Erinnerung: So sah das aus:

                                27
                              +  2
                              +  1
                              + 13
                              ----
                              = 63
                              ====
                              

                              Allerdings hatte ich gehofft, dass der borisbär das sieht, überlegt warum der Raketenheini wohl solche „umständliche Kunststücke“, macht - und dann selbst darauf kommt, dass man SOWAS prima lesen und editieren kann.

                              • Auf die Performance - das hatten wir hier im Forum mal getestet, gemessen, vergleichen und diskutiert - hat der Verkettungsoperator kaum keinen negativen Einfluss.

                              Aber: „Naja. Jedes Gehirn funktioniert halt etwas anders.“(¹)


                              ¹) Das will ich strikt neutral verstanden wissen! Ich z.B. notiere quasi (es gibt ganz wenige Ausnahmen) STETS die geschweiften Klammern um Blöcke (z.b. nach if). Auch wenn da nur eine Anweisung drin steht. Denn ich halte mich nämlich selbst für „blöd“ genug um bei deren Fehlen eine Ursache für künftige Fehler zu verorten (ausdrücklich nicht: zu „vermuten“.)

                              1. Hallo,

                                Sequentiell formulierte Terme kann man der Lesbarkeit zuliebe auch gut mehrzeilig schreiben. Aber dann bitte mit dem entscheidenden Operator am Anfang der Folgezeile, nicht am Zeilenende. Sonst ist der Vorteil der schnellen Erkennbarkeit wieder futsch.

                                Jepp. Vor allem wenn das Ergebnis etwas wie ein „String, der formalen Vorschriften unterliegt“ sein soll. Hier soll das Ergebnis gültiges und auch sonst richtiges HTML sein.

                                was das Ergebnis sein soll, spielt da für meine Betrachtung gar keine Rolle. Das kann ein String sein, der korrektes HTML enthalten soll, aber ebensogut ein komplexer boolscher Ausdruck oder eine berechnete Referenz (in C: ein Zeiger) auf irgendein Objekt.

                                Ich halte mich beim Programmieren normalerweise an die Fausregel: Ein Denkschritt, eine Zeile. Wird ein Ausdruck so komplex, dass ich ihn nicht mehr "mit einem Blick" verstehen kann, werden halt zwei oder mehr Zeilen daraus.
                                Zu viel aufteilen ist aber auch wieder schlecht: Wird ein Ausdruck, der für mich leicht erfassbar ist, unnötig aufgeteilt, verliere ich den Überblick bzw. mir geht der Zusammenhang flöten.

                                Aber: „Naja. Jedes Gehirn funktioniert halt etwas anders.“

                                Eben. Mancher macht dank Hyperthreading Brain den eingesprungenen Dreisatz in einem Takt, ein anderer muss das Schritt für Schritt nachvollziehen.

                                • Schon in der Grundschule hat man solche Schreibweisen beim Rechnen ohne Taschenrechner kennengelernt…

                                Zur Erinnerung: So sah das aus:

                                  27
                                +  2
                                +  1
                                + 13
                                ----
                                = 63
                                ====
                                

                                Genau. Später nannte man das dann "untereinander addieren" (in Abgrenzung zum einzeiligen Notieren einer Addition).

                                • Auf die Performance - das hatten wir hier im Forum mal getestet, gemessen, vergleichen und diskutiert - hat der Verkettungsoperator kaum keinen negativen Einfluss.

                                Und selbst wenn: Solange der Unterschied nur gering ist, bin ich eher für gute Lesbarkeit - was bei meinem Programmer Brain oft (nicht immer) gleichzeitig gute Effizienz bedeutet.

                                Einen schönen Tag noch
                                 Martin

                                --
                                Nein, Esel sind nicht störrisch. Sie wissen es einfach nur besser.
                              2. Hallo

                                Zur Erinnerung: So sah das aus:

                                  27
                                +  2
                                +  1
                                + 13
                                ----
                                = 63
                                ====
                                

                                Sorry, das triggert mich jetzt doch. So …

                                  27
                                +  2
                                +  1
                                + 13
                                ----
                                ≠ 63
                                ====
                                

                                … oder so …

                                  27
                                +  2
                                +  1
                                + 13
                                ----
                                = 43
                                ====
                                

                                … ist's richtig. 😆😉

                                Tschö, Auge

                                --
                                200 ist das neue 35.
                                1. @@Auge

                                  … oder so …

                                    27
                                  +  2
                                  +  1
                                  + 13
                                  ----
                                  = 43
                                  ====
                                  

                                  … ist's richtig. 😆😉

                                  Kommt da als Antwort nicht 42 raus? 😆

                                  🖖 Живіть довго і процвітайте

                                  --
                                  When the power of love overcomes the love of power the world will know peace.
                                  — Jimi Hendrix
                                  1. Hallo

                                    … oder so …

                                      27
                                    +  2
                                    +  1
                                    + 13
                                    ----
                                    = 43
                                    ====
                                    

                                    … ist's richtig. 😆😉

                                    Kommt da als Antwort nicht 42 raus? 😆

                                    Nachdem ich vor dem Abschicken des Vorpostings zehnmal nachgerechnet habe, um nicht als Möchtegern-Monk dazustehen, bin ich mir sicher, dass Jörg für dein Wunschergebnis einfach die falschen Summanden vorgegeben hat. 😁

                                    Tschö, Auge

                                    --
                                    200 ist das neue 35.
                                2. Zur Erinnerung: So sah das aus:

                                  Monk bricht aus mir heraus

                                  Öhm. Ich hab nur behauptet, dass es so aussah. Nicht das es richtig sei.

                              3. Allerdings hatte ich gehofft, dass der borisbär das sieht, überlegt warum der Raketenheini wohl solche „umständliche Kunststücke“, macht - und dann selbst darauf kommt, dass man SOWAS prima lesen und editieren kann.

                                Es ist mir gleich positiv aufgefallen und ich habe auch den Vorteil darin erkannt, es allerdings aus Platzgründen erst mal in eine Zeile geschrieben mit dem Vorhaben, es später wieder untereinander zu schreiben.

                            2. @@Der Martin

                              Das ist schrecklich unleserlicher Code.

                              ich sehe das nicht so.

                              Du bist eben anders. Das kennen wir ja. 😉

                              return "<a href='$href' $current>$name</a>";
                              

                              Das liest sich für dich besser?

                              Na sowas von besser.

                              Schon die ganzen Anführungszeichen bei der anderen Variante sind eine Qual. Vergiss da mal eins oder mach eins zu viel – viel Spaß bei der Fehlersuche. (Wer Syntaxhighlighting einsetzt, der bescheißt. 😜)

                              Sequentiell formulierte Terme kann man der Lesbarkeit zuliebe auch gut mehrzeilig schreiben.

                              Die anderen auch:

                              return "
                                <a href='$href' $current>
                                  $name
                                </a>
                              ";
                              

                              (In Javascript mit `` ebenfalls.)

                              🖖 Живіть довго і процвітайте

                              --
                              When the power of love overcomes the love of power the world will know peace.
                              — Jimi Hendrix
                          2. Mit dem Unterschied zwischen einfachen und doppelten Anführungszeichen in PHP bist du vertraut?

                            Ja, prinzipiell schon, allerdings hatte ich das bisher noch nicht verwendet, deswegen kam es mir nicht in den Sinn. Danke für den Hinweis!

                        2. Hallo,

                          Was ist denn eigentlich sinnvoller:

                          Sinnvoll ist vor allem das, was funktioniert und dein 6 Monate älteres Ich auch immer noch versteht… (Stichwort Kommentare und Dokumentation)

                          Jedes mal <?= ?> zu schreiben oder einfach <?php ?> und alle Funktionen rein? Ich verstehe leider noch nicht so ganz den Sinn hinter diesen verschiednen Möglichkeiten, PHP-Code zu beginnen.

                          Das <?= ?> ist grade in Templates beliebt, d.h. du schreibst das HTML-Gerüst und fügst per <?= ?> dann die veränderlichen Dinge dort rein.

                          So wie du es vorführst, soll der PHP-Interpreter starten, eine Funktion ausführen, sich beenden, wieder starten, eine Funktion ausführen, sich beenden, wieder starten, eine Funktion ausführen, sich beenden, wieder starten, eine Funktion ausführen, usw.

                          Da wird vermutlich im Hintergrund automatisch optimiert, aber schön ist anders…

                          Gruß
                          Kalk

                          1. So wie du es vorführst, soll der PHP-Interpreter starten, eine Funktion ausführen, sich beenden, wieder starten, eine Funktion ausführen, sich beenden, wieder starten, eine Funktion ausführen, sich beenden, wieder starten, eine Funktion ausführen, usw.

                            Da wird vermutlich im Hintergrund automatisch optimiert, aber schön ist anders…

                            Der PHP-Interpreter beendet sich da gar nicht, sondern macht einfach ein Passthrue für den nicht als PHP markierten Text. Das wird also schon beim Parsen erledigt.

                            Zudem interpretiert PHP nicht zeilenweise wie anno Asbach der BASIC- Interpreter.

                            Gruß vom See.

                          2. @@Tabellenkalk

                            Das <?= ?> ist grade in Templates beliebt, d.h. du schreibst das HTML-Gerüst und fügst per <?= ?> dann die veränderlichen Dinge dort rein.

                            Da wird vermutlich im Hintergrund automatisch optimiert, aber schön ist anders…

                            In Templates (Views, … oder wie immer man das in $Framework nennt) ist genau das schön. PHP als Template-Sprache.

                            Man sollte Markup-Tags nicht mit PHP echo generieren.

                            Nicht

                            <ol>
                            <?php
                            foreach ($list as $item) {
                              echo "<li>$item</li>";
                            }
                            ?>
                            </ol>
                            

                            sondern

                            <ol>
                              <?php foreach ($list as $item): ?>
                                <li><?= $item ?></li>
                              <?php endforeach; ?>
                            </ol>
                            

                            🖖 Живіть довго і процвітайте

                            --
                            When the power of love overcomes the love of power the world will know peace.
                            — Jimi Hendrix
                            1. Hallo,

                              Das <?= ?> ist grade in Templates beliebt, d.h. du schreibst das HTML-Gerüst und fügst per <?= ?> dann die veränderlichen Dinge dort rein.

                              Da wird vermutlich im Hintergrund automatisch optimiert, aber schön ist anders…

                              In Templates (Views, … oder wie immer man das in $Framework nennt) ist genau das schön.

                              Indem du meinen Text nur teilweise zitierst, verdrehst du meine Aussage ins Gegenteil. Das „schön ist anders“ bezog sich auf einen von dir weggelassenen, wesentlichen Teil.

                              Gruß
                              Kalk

                              1. @@Tabellenkalk

                                Indem du meinen Text nur teilweise zitierst, verdrehst du meine Aussage ins Gegenteil. Das „schön ist anders“ bezog sich auf einen von dir weggelassenen, wesentlichen Teil.

                                Du meinst den Teil?

                                So wie du es vorführst, soll der PHP-Interpreter starten, eine Funktion ausführen, sich beenden, wieder starten, eine Funktion ausführen, sich beenden, wieder starten, eine Funktion ausführen, sich beenden, wieder starten, eine Funktion ausführen, usw.

                                Da hat doch Raketenwilli schon alles gesagt, was dazu zu sagen wäre.

                                🖖 Живіть довго і процвітайте

                                --
                                When the power of love overcomes the love of power the world will know peace.
                                — Jimi Hendrix
                            2. Man sollte Markup-Tags nicht mit PHP echo generieren.

                              Meinst du etwa so?

                              <?php
                              
                              function navAnchor( $href, $name, $uri ) {
                              
                              	$current = '';
                              
                                  if ( !empty( $_GET['subpage'] ) ) {
                              
                                      if  ( $href === $_GET['subpage'] )
                              
                                          $current = 'aria-current="page"';
                              
                                  } else {
                              
                                      if ( $href === 'game' )
                              
                                          $current = 'aria-current="page"';
                              
                                  }
                              
                                  $subpages = $_SERVER['DOCUMENT_ROOT'] . '/pages/' . $uri[1] . '/' . $uri[2] . '/subpages/';
                              
                                  if ( file_exists( $subpages . $href . '.php' ) ): ?>
                              
                                      <a href="<?= $href ?>" <?= $current ?>><?= $name ?></a>
                              
                                  <?php endif;
                              
                              } ?>
                              
                              1. Man sollte Markup-Tags nicht mit PHP echo generieren.

                                Meinst du etwa so?

                                Das Wort „sollte“ bedeutet, dass es Gründe geben kann, die dem entgegen stehen. Ich nenne einen: Die Übersichtlichkeit.

                                In dem Zusammenhang mal eine Frage ...

                                Ich sehe im Hinblick auf das später eingefügte if ( file_exists () ) keine rechte Notwendigkeit. Das die Dateien existieren gehört ja zum Programm, wenn diese fehlen, dann ist das ein Fehler, die sind nicht „nice to have“. Ebenso könntest Du also durch das Skript prüfen, ob überhaupt PHP und der Apache Webserver installiert ist, ob letzterer auch als Elternprozess von PHP läuft und ob der Server überhaupt genug Rechenleistung und RAM mitbringt um alle diese Prüfungen in vertretbarer Zeit durchzuführen… Du kannst auch noch alle Dateien signieren lassen und diese Signaturen bis herunter zum Kernel und zum Bootmanager checken. (TPM)

                                • Warum also das if ( file_exists () ) - Geraffel?
                                1. wenn Du Dich aber daran halten willst, gar kein Markup mit PHP auszugeben, dann bitte hier entlang:

                                  <?php 
                                  function IsCurrent( $LinkTarget ) { 
                                      if ( ! empty( $_GET['subpage'] ) ) { 
                                           if  ( $LinkTarget == $_GET['subpage'] ) { 
                                               return 'current';
                                           }
                                      } else {
                                           if  ( $LinkTarget == 'game' ) {
                                               return 'current';
                                           }
                                      }
                                      return  '';
                                  }
                                  
                                  ### Nur für die Simulation/Tests ###
                                  #$_GET['subpage']='';
                                  #$_GET['subpage']='game';
                                  #$_GET['subpage']='mods';
                                  ####################################
                                  
                                  ?>
                                  
                                  <a class="<?=IsCurrent('game');?>" href="game">Spiel</a>
                                  <a class="<?=IsCurrent('releases');?>" href="releases">Releases</a>
                                  <a class="<?=IsCurrent('merchandise');?>" href="merchandise">Me<span style="letter-spacing: .115em;">r</span>cha<span style="letter-spacing: .105em;">n</span>dise</a>
                                  <a class="<?=IsCurrent('guides');?>" href="guides"><span style="letter-spacing: .105em;">Gu</span>ides</a>
                                  <a class="<?=IsCurrent('emulation');?>" href="emulation">Emula<span style="letter-spacing: .115em;">t</span>ion</a>
                                  <a class="<?=IsCurrent('mods');?>" href="mods">Mods</a>
                                  <a class="<?=IsCurrent('maps');?>" href="maps">Maps</a>
                                  <a class="<?=IsCurrent('savegame');?>" href="savegame">S<span style="letter-spacing: .105em;">a</span>vegame</a>
                                  

                                  PHP-Code im Template sollte nämlich vor allem auch kurz sein und ergo möglichst keine Strukturen beinhalten Es bringt überhaupt nichts wenn einfache „Sachen“ im Template zu einem Riesen-Programm ausarten.

                                  Denn immerhin will der PHP-Progger ja das Template-Geraffel an den UI-Fritze delegieren :-). Wenn man dem das nicht mehr einfach erklären kann muss man wieder alles selbst machen.

                                  1. Hallo Raketenwilli,

                                    ich würde gern ein Zehntel-Minus geben... ein Ganzes ist zu viel.

                                    Da musst Du nochmal ran. Es sollte definitiv aria-current='page' sein, der Zugänglichkeit wegen. Im Übrigen - fast gleicher Zeitpunkt, also zwei Doofe und ein Gedanke 😉

                                    Rolf

                                    --
                                    sumpsi - posui - obstruxi
                                    1. Da musst Du nochmal ran. Es sollte definitiv aria-current='page' sein,

                                      Hm. Dann wird es ja noch kürzer.

                                      <?php 
                                      function IsCurrent( $LinkTarget ) { 
                                          if ( ! empty( $_GET['subpage'] ) ) { 
                                               return ( $LinkTarget == $_GET['subpage'] );
                                          } else {
                                               return  ( $LinkTarget == 'game' );
                                          }
                                      }
                                      
                                      ### Nur für die Simulation/Tests ###
                                      #$_GET['subpage']='';
                                      #$_GET['subpage']='game';
                                      $_GET['subpage']='mods';
                                      ####################################
                                      ?>
                                      
                                      <a<?=IsCurrent('game')?' aria-current="page"':'';?> href="game">Spiel</a>
                                      <a<?=IsCurrent('releases')?' aria-current="page"':'';?> href="releases">Releases</a>
                                      <a<?=IsCurrent('merchandise')?' aria-current="page"':'';?> href="merchandise">Me<span style="letter-spacing: .115em;">r</span>cha<span style="letter-spacing: .105em;">n</span>dise</a>
                                      <a<?=IsCurrent('guides')?' aria-current="page"':'';?> href="guides"><span style="letter-spacing: .105em;">Gu</span>ides</a>
                                      <a<?=IsCurrent('emulation')?' aria-current="page"':'';?> href="emulation">Emula<span style="letter-spacing: .115em;">t</span>ion</a>
                                      <a<?=IsCurrent('mods')?' aria-current="page"':'';?> href="mods">Mods</a>
                                      <a<?=IsCurrent('maps')?' aria-current="page"':'';?> href="maps">Maps</a>
                                      <a<?=IsCurrent('savegame')?' aria-current="page"':'';?> href="savegame">S<span style="letter-spacing: .105em;">a</span>vegame</a>
                                      

                                      Output:

                                      <a href="game">Spiel</a>
                                      <a href="releases">Releases</a>
                                      <a href="merchandise">Me<span style="letter-spacing: .115em;">r</span>cha<span style="letter-spacing: .105em;">n</span>dise</a>
                                      <a href="guides"><span style="letter-spacing: .105em;">Gu</span>ides</a>
                                      <a href="emulation">Emula<span style="letter-spacing: .115em;">t</span>ion</a>
                                      <a aria-current="page" href="mods">Mods</a>
                                      <a href="maps">Maps</a>
                                      <a href="savegame">S<span style="letter-spacing: .105em;">a</span>vegame</a>
                                      
                                2. Ich sehe im Hinblick auf das später eingefügte if ( file_exists () ) keine rechte Notwendigkeit. Das die Dateien existieren gehört ja zum Programm, wenn diese fehlen, dann ist das ein Fehler, die sind nicht „nice to have“.

                                  Nun, der Gedanke war, dass ich diese Nav in jede subpage einbinde, aber nicht jede subpage wird immer alle Tabs haben, z.B. könnte es sein, dass es den Punkt Emulation gar nicht gibt, weil das Spiel ohnehin nur auf PC verfügbar ist. Auf die Weise würde der Vorgang automatisiert. Ist die Datei gar nicht im Ordner subpages, dann wird sie in der Nav auch gar nicht angezeigt.

                                  1. Nun, der Gedanke war, dass ich diese Nav in jede subpage einbinde, aber nicht jede subpage wird immer alle Tabs haben, z.B. könnte es sein, dass es den Punkt Emulation gar nicht gibt, weil das Spiel ohnehin nur auf PC verfügbar ist.

                                    Du willst mir jetzt und hier sagen, dass Du für jedes Spiel eine eigene Struktur von Webseiten schaffen willst? Ernsthaft? Für mich klingt das nach einem … Nein: NICHT nach einem guten Plan, sondern als hättest Du erstmal angefangen und dann hier und da mal über dieses und jenes - aber nie über einen Plan - nachgedacht.

                                    was man - statt verschiedener Unterordner zu nutzen, - machen kann, wäre, einen Array zu definieren:

                                    $gameSettings['Spiel_A']['sites']=[
                                       'game',
                                       'releases',
                                       'maps',
                                        ...
                                       'savegame' 
                                    ];
                                    
                                    $gameSettings['Spiel_B']['sites']=[
                                       'game',
                                       'maps',
                                        ...
                                       'savegame' 
                                    ];
                                    

                                    und mit

                                    <?php if( in_array( 'releases', $gameSettings[ $game ]['sites'] ) ): ?>
                                    <a<?=IsCurrent('releases')?' aria-current="page"':'';?> href="releases">Releases</a>
                                    <?php endif; ?>
                                    

                                    zu prüfen.

                                    und bringe in $gameSettings auch andere Eigenschaften unter - oder definiere das als Objekt statt als Array oder nutze bereits ein existierendes Array oder ein Objekt in welchem Du bereits andere Eigenschaften der Spiele speicherst.

                                    Du solltest also erst einmal die Datenbasis planen: Was haben die Spiele gemeinsam und worin unterscheiden sich diese?

                                    Und wo kommt denn dieses $_GET['subpage'] dann her?

                                    1. Hallo Raketenwilli,

                                      was man - statt verschiedener Unterordner zu nutzen, - machen kann, wäre, einen Array zu definieren:

                                      Weiß nicht, das find ich auch nicht so doll.

                                      Ich persönlich würde ja versuchen, Daten und Darstellung zu trennen und die Darstellung nach Bedarf aus den Daten zu generieren - was natürlich eine ordentliche Abstraktion ist.

                                      Man kann aber auch - so wie Selfhtml bis zur Version 8.x - die Bereiche in Dateien ablegen und sie verknüpfen. Da ist eine einheitliche Struktur mit einheitlichem Steuercode drumrum nicht verkehrt, und dass dann Teile fehlen können - warum nicht. Ein Selfhtml 8.2 hätte beispielsweise für das Javascript-Objekt "String" einen Unterordner in "Objekte" haben können, und darin wären dann HTML Dateien pro Methode. Und zur Anzeige wird alles eingesammelt, statt die Verlinkung hart zu programmieren (was man natürlich wiederum cachen kann).

                                      Du solltest also erst einmal die Datenbasis planen:

                                      Mir scheint, das hat er getan, ist aber mit einem Konzept unterwegs, das von deiner Idee abweicht.

                                      Rolf

                                      --
                                      sumpsi - posui - obstruxi
                                      1. Hallo Raketenwilli,

                                        was man - statt verschiedener Unterordner zu nutzen, - machen kann, wäre, einen Array zu definieren:

                                        Weiß nicht, das find ich auch nicht so doll.

                                        Ich persönlich würde ja versuchen, Daten und Darstellung zu trennen und die Darstellung nach Bedarf aus den Daten zu generieren - was natürlich eine ordentliche Abstraktion ist.

                                        Naja. Ich hab ja nicht geschrieben, dass er die Daten ins eigentliche Programm schreiben soll. (Deshalb im gezeigten Quelltext auch die Trennung) Aber an irgendeiner Stelle muss das Programm die Daten haben. Hier wäre wohl eine zu inkludierende Datei - oder Datenquelle (ich bin mir aber fast sicher, dass Datenbank keine ideale Lösung für „alles“ ist) - für die Konfiguration angemessen.

                                        Das kann direktes PHP sein, aber auch jedes andere geeignete Format (ini, json, yaml, csv, ...) - da kommt es wohl darauf an, wer diese anlegen und pflegen soll.

                                        Womöglich hätte ich ein paar Worte dazu schreiben sollen.

                                        Und zur Anzeige wird alles eingesammelt

                                        Just für den Missbrauch des Dateisystems als Datenbank habe ich mal böse Kritik bekommen …

                                        1. Hallo Raketenwilli,

                                          Aber an irgendeiner Stelle muss das Programm die Daten haben.

                                          Ja, das ist doch der Punkt. Muss es sie explizit haben? Oder kann es sie sich herleiten (z.B. über Existenz von "Objekten" (also Dateien oder Rows in einer DB).

                                          Wenn Daten implizit vorhanden sind, muss ich sie nicht nochmal explizit notieren. Die explizite Form kann das Programm selbst erzeugen. Entweder bei jedem Durchlauf, oder nur gelegentlich und mit einem Cache-Speicher, falls die implizite Gewinnung aufwändig ist.

                                          Rolf

                                          --
                                          sumpsi - posui - obstruxi
                                        2. Hallo,

                                          Just für den Missbrauch des Dateisystems als Datenbank habe ich mal böse Kritik bekommen …

                                          mit welcher Begründung?

                                          Abhängig von der Anwendung kann das meiner Meinung nach eine ziemlich gute Idee sein. Dateizugriffe sind etwas, was im Computerbetrieb sehr häufig stattfindet. Man darf deshalb davon ausgehen, dass Dateisystemfunktionen und -strukturen sehr effizient angelegt und hochgradig optimiert sind. Wenn man also kein DBMS nutzen kann oder möchte (z.B. weil das dann noch ein weiterer Dienst ist, der Ressourcen braucht) und keine hochkomplexen Datenstrukturen hat, kann das Dateisystem eine sehr gute Alternative sein.

                                          Einen schönen Tag noch
                                           Martin

                                          --
                                          Nein, Esel sind nicht störrisch. Sie wissen es einfach nur besser.
                                          1. @@Der Martin

                                            Wenn man also kein DBMS nutzen kann oder möchte (z.B. weil das dann noch ein weiterer Dienst ist, der Ressourcen braucht) und keine hochkomplexen Datenstrukturen hat, kann das Dateisystem eine sehr gute Alternative sein.

                                            So nutzt auch das CMS Kirby (Wikipedia) kein DBMS, sondern das Dateisystem.

                                            🖖 Живіть довго і процвітайте

                                            PS: ([Wikipedia](https://de.wikipedia.org/wiki/Kirby_(CMS)))
                                            3 ) hintereinander in verschiedenen Kontexten – wenn der Kontextwechsel da mal gutgeht!

                                            --
                                            When the power of love overcomes the love of power the world will know peace.
                                            — Jimi Hendrix
                                      2. Hallo Rolf,

                                        Ich persönlich würde ja versuchen, Daten und Darstellung zu trennen und die Darstellung nach Bedarf aus den Daten zu generieren - was natürlich eine ordentliche Abstraktion ist.

                                        das versuche ich. Aber die Daten werden momentan einfach über PHP inkludiert bzw. sind die Strings in einer PHP-Datei als Variablen festgelegt.

                                        Für die subpage Spiel bspw. habe ich folgendermaßen Darstellung und Daten getrennt:

                                        <?php
                                        
                                        include $_SERVER['DOCUMENT_ROOT'] . '/includes/subpages/game.inc.php';
                                        
                                        beginSubpage();
                                        
                                        beginTable();
                                        
                                        rowHeader( $PLATFORM ); str( $PLAYSTATION3 ); endRow();
                                        rowHeader( $DEVELOPER ); str( $FROMSOFTWARE ); endRow();
                                        rowHeader( $RELEASEDATE ); str( $JAPAN . $D05 . $M01 . $Y2009 ); str( $NORTHAMERICA . $D06 . $M10 . $Y2009 ); str( $EUROPE . $D25 . $M06 . $Y2010 ); endRow();
                                        rowHeader( $PUBLISHER ); str( $JAPAN . $SONYCOMPUTERENTERTAINMENT ); str( $NORTHAMERICA . $ATLUSUSA ); str( $EUROPE . $BANDAINAMCOGAMES ); endRow();
                                        rowHeader( $GENRE ); str( $ACTIONROLEPLAYINGGAME ); endRow();
                                        rowHeader( $THEME ); str( $FANTASY ); endRow();
                                        rowHeader( $MODE ); str( $SINGLEPLAYER . $separator . $ONLINEMULTIPLAYER ); endRow();
                                        rowHeader( $CONTROLS ); str( $SIXAXIS . $separator . $DUALSHOCK3 ); endRow();
                                        rowHeader( $MEDIUM ); str( $BLURAYDISC ); endRow();
                                        rowHeader( $DISTRIBUTION ); str( $RETAIL ); endRow();
                                        rowHeader( $AGERATING ); str( $ESRBM . $separator . $PEGI16 . $separator . $USK16 ); endRow();
                                        rowHeader( $AUDIOLANGUAGE ); str( $ENGLISH ); endRow();
                                        rowHeader( $SCREENLANGUAGE ); str( $GERMAN . $separator . $ENGLISH . $separator . $FRENCH . $separator . $ITALIAN . $separator . $SPANISH ); endRow();
                                        
                                        endTable();
                                        
                                        container( 'demons-souls', 'Demon’s Souls', $SOULS );
                                        
                                        beginTags();
                                        
                                        tag( $THIRDPERSON );
                                        tag( $CHARACTERCREATION );
                                        tag( $DARKFANTASY );
                                        tag( $REPLAYABILITY );
                                        tag( $SOULSLIKE );
                                        
                                        endTags();
                                        
                                        endSubpage();
                                        
                                        ?>
                                        

                                        Eine bessere Möglichkeit kenne ich momentan nicht.

                              2. Hallo borisbaer,

                                ja, die Montage des a Elements ist jetzt besser.

                                Ich hätte - als urlaubender Späteinsteiger im Thread, aber auch noch ein paar andere Hinweise.

                                Die Parameter sind nach den Umstellungen irreführend benannt.

                                • $href ist keine URL, sondern der Unterseitenname und die URL baust Du daraus zusammen. Ich würde $href in $subpageName umbenennen.
                                • $name ist kein Name, sondern ein HTML-formatierter Name. Ich hatte schon Luft geholt, um das fehlende htmlspecialchars anzumeckern - aber das geht ja nicht weil Du da deine Spezialtypographie einsetzt. Man KÖNNTE (muss nicht) $name in $nameHtml umbenennen, um klarzumachen, dass dieser Wert nicht durch den Kontextwechsel darf.
                                • $uri ist die Grundlage für die Bestimmung des Subpage-Ordners. Das könnte man auch herausziehen - vermutlich brauchst Du das öfter. Du kannst $subpages nur einmal ermitteln und dem Wert an navAnchor übergeben, statt ihn jedesmal neu zu bestimmen. Die Aufgabe "Ermittle den Order der Subpages" gehört meiner Meinung nach nicht in eine Funktion "Erzeuge einen Navigationsanker" - das sind getrennte Aufgaben und damit widerspricht das dem Single Responsibility Principle (SRP).

                                Dieser Codeteil

                                    if ( !empty( $_GET['subpage'] ) ) {
                                
                                        if  ( $href === $_GET['subpage'] )
                                
                                            $current = 'aria-current="page"';
                                
                                    } else {
                                
                                        if ( $href === 'game' )
                                
                                            $current = 'aria-current="page"';
                                
                                    }
                                

                                hat für mich ebenfalls einen SRP-Smell. Das ist die Ermittlung der angeforderten Subpage, mit Zuweisung eines Defaults falls keine angefordert ist. Abhängig davon wird das aria-current Attribut hinzugefügt. Das sind getrennte Aufgaben. Ich würde eine weitere Funktion schreiben und navAnchor so ändern:

                                <?php
                                function getSubpageName()
                                {
                                   if ( empty ( $_GET['subpage'] ) )
                                      return "game";
                                   return $_GET['subpage'];
                                }
                                
                                function navAnchor($anchorSubpageName, $nameHtml, $subpagesFolder)
                                {
                                   $current = getSubpageName() == $anchorSubpageName 
                                                ? 'aria-current="page"'
                                                : "";
                                
                                    if ( file_exists( $subpagesFolder . $anchorSubpageName . '.php' ) ): ?>
                                
                                        <a href="<?= $anchorSubpageName ?>" <?= $current ?>><?= $nameHtml ?></a>
                                
                                    <?php endif;
                                } 
                                

                                Just my 2 cents...

                                Rolf

                                --
                                sumpsi - posui - obstruxi
                                1. Die Parameter sind nach den Umstellungen irreführend benannt.

                                  • $href ist keine URL, sondern der Unterseitenname und die URL baust Du daraus zusammen. Ich würde $href in $subpageName umbenennen.

                                  Danke für den Hinweis!

                                  • $name ist kein Name, sondern ein HTML-formatierter Name. Ich hatte schon Luft geholt, um das fehlende htmlspecialchars anzumeckern - aber das geht ja nicht weil Du da deine Spezialtypographie einsetzt. Man KÖNNTE (muss nicht) $name in $nameHtml umbenennen, um klarzumachen, dass dieser Wert nicht durch den Kontextwechsel darf.

                                  Ist ein HTML-formatierter Name nicht dennoch ein Name? Was meinst du mit Kontextwechsel?

                                  • $uri ist die Grundlage für die Bestimmung des Subpage-Ordners. Das könnte man auch herausziehen - vermutlich brauchst Du das öfter. Du kannst $subpages nur einmal ermitteln und dem Wert an navAnchor übergeben, statt ihn jedesmal neu zu bestimmen. Die Aufgabe "Ermittle den Order der Subpages" gehört meiner Meinung nach nicht in eine Funktion "Erzeuge einen Navigationsanker" - das sind getrennte Aufgaben und damit widerspricht das dem Single Responsibility Principle (SRP).

                                  Das ist ein guter Tipp, danke! Ich wusste auch bisher nichts von diesem SRP, aber ergibt Sinn.

                                  Dieser Codeteil

                                      if ( !empty( $_GET['subpage'] ) ) {
                                  
                                          if  ( $href === $_GET['subpage'] )
                                  
                                              $current = 'aria-current="page"';
                                  
                                      } else {
                                  
                                          if ( $href === 'game' )
                                  
                                              $current = 'aria-current="page"';
                                  
                                      }
                                  

                                  hat für mich ebenfalls einen SRP-Smell. Das ist die Ermittlung der angeforderten Subpage, mit Zuweisung eines Defaults falls keine angefordert ist. Abhängig davon wird das aria-current Attribut hinzugefügt. Das sind getrennte Aufgaben. Ich würde eine weitere Funktion schreiben und navAnchor so ändern:

                                  <?php
                                  function getSubpageName()
                                  {
                                     if ( empty ( $_GET['subpage'] ) )
                                        return "game";
                                     return $_GET['subpage'];
                                  }
                                  
                                  function navAnchor($anchorSubpageName, $nameHtml, $subpagesFolder)
                                  {
                                     $current = getSubpageName() == $anchorSubpageName 
                                                  ? 'aria-current="page"'
                                                  : "";
                                  
                                      if ( file_exists( $subpagesFolder . $anchorSubpageName . '.php' ) ): ?>
                                  
                                          <a href="<?= $anchorSubpageName ?>" <?= $current ?>><?= $nameHtml ?></a>
                                  
                                      <?php endif;
                                  } 
                                  

                                  Wird gemacht! 👌

                                  1. Hallo borisbaer,

                                    Ist ein HTML-formatierter Name nicht dennoch ein Name?

                                    Ja, aber...

                                    Was meinst du mit Kontextwechsel?

                                    Uh oh. Lasst ihn leben, Brüder! (m/w/d)
                                    Erstmal Basislektüre...

                                    Wenn Du irgendwelche Texte aus einer Quelle liest und sie in eine HTML Seite ausgeben willst, ändert sich der Kontext dieser Daten.

                                    Von "raw data" nach "Text in einer HTML Seite". Damit dieser Kontextwechsel gelingt und Dir nicht die Seite schrottet, z.B. weil ein unschuldiges < im Text steht, musst Du jeden Text, den Du irgendwoher bekommst, mit htmlspecialchars behandeln, bevor Du ihn zum Browser schickst. Bei Text, der im PHP steht, ist das nicht zwingend nötig, den siehst Du ja und kannst deshalb wissen, ob er Dir die Seite kaputt macht oder nicht.

                                    Der Unterschied zwischen einem Namen und einem HTML-formatierten Namen ist, dass Du den Namen mit htmlspecialchars behandeln musst und den HTML-formatierten Namen nicht mit htmlspecialchars behandeln darfst. Weil der HTML-formatierte Name bereits im HTML Kontext ist.

                                    Ein anderer Kontextwechsel wäre z.B. Benutzereingabe zu SQL Query.

                                    Rolf

                                    --
                                    sumpsi - posui - obstruxi
                                    1. Hallo,

                                      Was meinst du mit Kontextwechsel?

                                      Uh oh. Lasst ihn leben, Brüder! (m/w/d)

                                      ach menno!

                                      Gruß
                                      Kalk

                                    2. Hallo,

                                      Was meinst du mit Kontextwechsel?

                                      Uh oh. Lasst ihn leben, Brüder! (m/w/d)

                                      okay, because it's you ...

                                      Einen schönen Tag noch
                                       Martin

                                      --
                                      Nein, Esel sind nicht störrisch. Sie wissen es einfach nur besser.
                        3. Hallo borisbaer,

                          Was ist denn eigentlich sinnvoller: Jedes mal <?= ?> zu schreiben oder einfach <?php ?>

                          Dazu möchte ich noch was nachtragen.

                          <?= ?> schließt einen PHP Ausdruck ein, kein Statement. D.h. man kann auf diese Weise einen einzelnen Wert ausgeben, aber keine PHP Funktion definieren oder Logik benutzen.

                          Was natürlich einer Prise Salz bedarf: eine anonyme Funktion ist natürlich möglich, und Logik geht mit dem ?: Operator - aber es ist eben kein freies PHP Programmieren. Letztlich ist
                          <?= ... ?>
                          eine Kurzform von
                          <?php echo ...; ?>
                          und verlangt auch, dass an genau dieser Stelle im PHP Gesamtkontext ein echo Befehl möglich ist.

                          Ein in <?php ... ?> eingeschlossener Code muss dagegen vollständige PHP Statements enthalten. Mann kann sich vorstellen, dass das, was zwischen ?> und <?php steht, mittels echo ausgegeben wird (und zwar 1:1, ohne Variablenersetzung), d.h. an der Stelle, wo ich einen <?php ... ?> Block beende, muss syntaktisch ein echo Befehl zulässig sein. Ob PHP an dieser Stelle tatsächlich intern einen echo Befehl erzeugt oder die Sache irgendwie optimiert, weiß ich nicht. Es ist auch irrelevant.

                          Der Begriff "vollständig" ist wiederum salzbedürftig. Man kann argumentieren, dass ein if oder foreach ohne den abhängigen Statementblock nicht vollständig sei. Für die Belange eines <?php ?> Konstrukts ist ein if (...) oder foreach (...) aber vollständig genug. (plus Doppelpunkt und end... Statement für gute Programmierung).

                          Rolf

                          --
                          sumpsi - posui - obstruxi
                          1. Hallo Rolf,

                            <?= ?> schließt einen PHP Ausdruck ein, kein Statement.

                            ja, das ist ein wichtiger Unterschied.

                            Ein in <?php ... ?> eingeschlossener Code muss dagegen vollständige PHP Statements enthalten.

                            Nein. Ein einfacher Ausdruck ist auch erlaubt. Ein Ausdruck ist nämlich strenggenommen auch schon ein Statement. Sowas hier:

                            <?php
                            17+4;
                            ?>
                            

                            Ist sinnlos, wirkungslos, aber erlaubt.

                            Der Begriff "vollständig" ist wiederum salzbedürftig. Man kann argumentieren, dass ein if oder foreach ohne den abhängigen Statementblock nicht vollständig sei.

                            Ja, das ist meines Wissens ein Syntaxfehler.

                            Einen schönen Tag noch
                             Martin

                            --
                            Nein, Esel sind nicht störrisch. Sie wissen es einfach nur besser.
    2. Hallo,

      bitte stelle den Sourcecode als Text zur Verfügung.

      das wäre mal ein Anfang, aber noch lange nicht ausreichend.

      Für den Screenshot sind meine Augen ungeeignet.

      Meine auch. In schwarz-blau-gelbem Pixelbrei eine Schrift mit etwa 1.5px Größe entziffern zu wollen, ist völlig hoffnungslos.

      Und darüber hinaus: Beschreibe bitte, was du eigentlich vorhast - also nicht technisch, sondern was du eigentlich erreichen willst. Das Folgeposting mit dem Quellcode gibt leider keinerlei Aufschluss, wofür der Code gut sein soll oder was er eigentlich tun soll.

      Einen schönen Tag noch
       Martin

      --
      Мир для України.
      1. Hallo Martin,

        sorry, wenn das nicht klar geworden ist.

        Also, in dem obigen Quellcode definiere ich bei jeder function (außer den ersten beiden) die Variable $current:

        if (!empty($_GET['subpage'])) { $current = $_GET['subpage']; }
        

        Das tue ich, weil ich im Folgenden diese Variable benötige, nämlich bspw. an dieser Stelle:

        <a class="<?= $current === 'releases' ? 'current' : ''; ?>" href="releases">Releases</a>
        

        Wenn also der aktuelle URL-Parameter mit dem jeweiligen if clause für $current übereinstimmt, dann bekommt dieser Link die class current, wird also hervorgehoben.

        Der ganze Quellcode wird übrigens per php include eingefügt und wenn ich versuche, die Variable $current als globale Variable außerhalb der function zu definieren, dann kommt die Fehlermeldung, die Variable $current sei nicht definiert, sprich die function kommt nicht an diese globale Variable ran und ich frage mich, warum.

        Ich hoffe, das war etwas verständlicher.

        1. Hallo borisbaer,

          sorry, wenn das nicht klar geworden ist.

          alles gut - das ist ein typischer Fall von Betriebsblindheit: Du kennst dein Projekt, du kennst deinen Code, und du weißt, was du an welcher Stelle und mit welcher Methode erreichen willst. Andere wissen das nicht und müssen raten.

          Also, in dem obigen Quellcode definiere ich bei jeder function (außer den ersten beiden) die Variable $current:

          if (!empty($_GET['subpage'])) { $current = $_GET['subpage']; }
          

          Das tue ich, weil ich im Folgenden diese Variable benötige, nämlich bspw. an dieser Stelle:

          <a class="<?= $current === 'releases' ? 'current' : ''; ?>" href="releases">Releases</a>
          

          Das schreit doch nach einer globalen Definition.

          Der ganze Quellcode wird übrigens per php include eingefügt und wenn ich versuche, die Variable $current als globale Variable außerhalb der function zu definieren, dann kommt die Fehlermeldung, die Variable $current sei nicht definiert, sprich die function kommt nicht an diese globale Variable ran und ich frage mich, warum.

          Hast du denn auch daran gedacht, sie mit dem Schlüsselwort global in die Funktion(en) zu importieren?

          Aber Funktionen, die auf globale Variablen zugreifen, sind sowieso unschön. Wie wär's, wenn du $current im globalen Scope definierst und als Parameter an die Funktionen übergibst, die diesen Wert brauchen? Dann wäre nur im globalen Scope, der ja sowieso alles zusammenklebt, ein bisschen "Magic", aber alle Funktionen wären autark.

          Einen schönen Tag noch
           Martin

          --
          Мир для України.
          1. Hallo Martin,

            Das schreit doch nach einer globalen Definition.

            Hast du denn auch daran gedacht, sie mit dem Schlüsselwort global in die Funktion(en) zu importieren?

            habe ich bisher nicht versucht, da hier einem davon abgeraten wird, wenn ich das richtig verstehe: Seit PHP 8.1.0 wird der Schreibzugriff auf das gesamte $GLOBALS-Array nicht mehr unterstützt.

            Aber Funktionen, die auf globale Variablen zugreifen, sind sowieso unschön. Wie wär's, wenn du $current im globalen Scope definierst und als Parameter an die Funktionen übergibst, die diesen Wert brauchen? Dann wäre nur im globalen Scope, der ja sowieso alles zusammenklebt, ein bisschen "Magic", aber alle Funktionen wären autark.

            Also, übergeben würde ich den Paramter dann so, oder?

            <?php
            
            function game($current) { ?>
            
            	<a class="<?= $current === null || $current === 'game' ? 'current' : ''; ?>" href="game">Spiel</a>
            
            <?php }
            

            Aber wo ist denn dieser global scope? Ich bin noch nicht wirklich sehr vertraut mit PHP. In JavaScript wäre er ja außerhalb aller functions, aber bei PHP habe ich keine Ahnung.

            1. Hallo,

              Hast du denn auch daran gedacht, sie mit dem Schlüsselwort global in die Funktion(en) zu importieren?

              habe ich bisher nicht versucht

              schade, denn das ist notwendig, um aus einer Funktion heraus auf globale Variablen zugreifen zu können.

              da hier einem davon abgeraten wird, wenn ich das richtig verstehe: Seit PHP 8.1.0 wird der Schreibzugriff auf das gesamte $GLOBALS-Array nicht mehr unterstützt.

              Möglicherweise hast du das missverstanden. Erstens geht es tatsächlich nur um das Schreiben auf $_GLOBALS, zweitens ist der direkte Zugriff auf $_GLOBALS ja etwas "unbequem", und wenn man schon globale Variablen verwenden möchte, finde ich das explizite Bekanntmachen innerhalb der Funktion mit dem global-Keyword sauberer. Dann darfst du auch schreibend darauf zugreifen (auch wenn das bei mir immer ein bisschen Zähneknirschen hervorruft).

              Aber Schreibzugriff brauchst du ja in deinem Fall auch gar nicht.

              Aber Funktionen, die auf globale Variablen zugreifen, sind sowieso unschön. Wie wär's, wenn du $current im globalen Scope definierst und als Parameter an die Funktionen übergibst, die diesen Wert brauchen? Dann wäre nur im globalen Scope, der ja sowieso alles zusammenklebt, ein bisschen "Magic", aber alle Funktionen wären autark.

              Also, übergeben würde ich den Paramter dann so, oder?

              <?php
              
              function game($current) { ?>
              
              	<a class="<?= $current === null || $current === 'game' ? 'current' : ''; ?>" href="game">Spiel</a>
              
              <?php }
              

              Genau. Und beim Aufruf der Funktion game() dann auch den Wert übergeben.

              Aber wo ist denn dieser global scope?

              Das ist sozusagen alles, was sich außerhalb aller Funktionen und Klassen abspielt.

              Ich bin noch nicht wirklich sehr vertraut mit PHP. In JavaScript wäre er ja außerhalb aller functions, aber bei PHP habe ich keine Ahnung.

              Das ist in PHP ganz genauso. Der Unterschied ist, dass eine Funktion in Javascript auf globale Daten zugreifen darf, ohne dass man das extra regeln müssten; in PHP muss man es explizit erlauben.

              Einen schönen Tag noch
               Martin

              --
              Мир для України.
              1. Hallo,

                Das schreit doch nach einer globalen Definition.

                wenn man schon globale Variablen verwenden möchte, finde ich das explizite Bekanntmachen innerhalb der Funktion mit dem global-Keyword sauberer

                Abe es ist immer noch der Unterschied zwischen Ölschmier an den Fingern und triefendem Schmodder. $_GLOBALS sollte man einfach ignorieren. Und globale Variablen dringend vermeiden.

                Ich muss aber auch eingestehen, dass es in PHP ohne radikale Objektorientierung mühsam ist, auf globale Variablen zu verzichten.

                $current === null || $current === 'game' ? 'current' : ''

                Hier würde ich definitiv dazu raten, $current bei der Initialisierung gleich auf 'game' zu setzen, wenn nichts drinsteht. Die Funktionen für die Menüpunkte werden von irgendwas aufgerufen. Dieses irgendwas sollte selbst eine Funktion sein (build_menu oder ähnlich), und in build_menu sollte sowas stehen wie

                   $current = $_GET['subpage'] ?? 'game';  // <-- NULL gar nicht erst entstehen lassen!
                   $menus = [ 'game', 'releases', 'merchandise', ...., 'savegame' ];
                   if (!in_array($current, $menus))
                      $current = 'game';
                   for ($menus as $menu) {
                      ("menu_$menu)($current == $menu);
                   }
                   ...
                
                   function menu_game($isCurrent)
                   {
                ?>
                     <a <?= $isCurrent ? 'aria-current="page"' : '' ?> href='...'>Game</a>
                <?php
                   }
                

                Der Funktionsaufruf mit ("menu_$menu)() funktioniert ab PHP 7.

                • Name der Funktion ist vom externen Namen entkoppelt. Wenn auch nur leicht. Noch besser wäre eine echte Map.
                • Subpage wird geprüft, ob es ein gültiger Name ist
                • Prüfung, ob der Menüpunkt die aktuelle Seite ist, ist zentralisiert und aus den Menüfunktionen entfernt

                Mit der Map meine ich:

                   $menus = [ 'game' => 'menu_game',
                              'releases' => 'menu_releases',
                              'merchandise' => 'menu_mechandise',
                              ....,
                              'savegame' => 'menu_savegame' 
                            ];
                   if (!array_key_exists($current, $menus))
                      $current = 'game';
                
                   for ($menus as $menuId => $menuHandler) {
                      $menuHandler($current == $menuId);
                   }
                

                Je länger man über etwas nachdenkt, desto mehr Abstraktionen fallen einem ein...

                Rolf

                --
                sumpsi - posui - obstruxi
        2. @@borisbaer

          if (!empty($_GET['subpage'])) { $current = $_GET['subpage']; }
          

          Das tue ich, weil ich im Folgenden diese Variable benötige, nämlich bspw. an dieser Stelle:

          <a class="<?= $current === 'releases' ? 'current' : ''; ?>" href="releases">Releases</a>
          

          Das Umkopieren von $_GET['subpage'] in eine Variable macht keinen Sinn. Du verwendest einfach bei jedem Vergleich $_GET['subpage'] und gut ist.

          Wenn also der aktuelle URL-Parameter mit dem jeweiligen if clause für $current übereinstimmt, dann bekommt dieser Link die class current, wird also hervorgehoben.

          Verwende aria-current="page".

          Eine Klasse current brauchst du dann nicht; du kannst den Attributselektor [aria-current="page"] zum Stylen verwenden. (Ein Klassenselektor ist auch nur eine andere Schreibweise für einen Attributselektor.)

          Was du nicht tun solltest: die aktuelle Seite verlinken. Stattdessen den Link auf den Hauptinhalt setzen (also genau dorthin, wo auch der Skip-Link hinführt).

          Live und in Schwarz/Weiß zu sehen, wo nie ein Mensch zuvor gewesen ist. Das PHP-Script, das die Seiten generiert, kann man sich auch ansehen.

          Ich hab letztens was darüber erzählt, zu sehen ist das auf Folie 7.

          Wenn es dir nicht behagt, wiederholt $_GET['subpage'] zu verwenden und damit immer wieder dasselbe zu tun, kannst du das auch mit einer Schleife machen; so in etwa:

          <?php
          $subpages = [
            [ 'title' => 'Spiel', 'path' => 'game' ],];
          ?>
          
          <nav>
            <ul>
          <?php foreach ($subpages as $subpage): ?>
              <li>
                <a
            <?php if ($subpage['path'] == $_GET['subpage']): ?>
                  href="#main"
                  aria-current="page"
            <?php elseif: ?>
                  href="$subpage['path']"
            <?php endif; ?>
                >
                  <?php echo htmlspecialchars($subpage['title']); ?>
                </a>
              </li>
          <?php endforeach; ?>
            </ul>
          </nav>
          

          🖖 Живіть довго і процвітайте

          --
          When the power of love overcomes the love of power the world will know peace.
          — Jimi Hendrix
          1. @@Gunnar Bittersmann

                    href="$subpage['path']"
            

            Na so’n Quatsch. Das sollte heißen:

                    href="<?php echo $subpage['path']; ?>"
            
                    <?php echo htmlspecialchars($subpage['title']); ?>
            

            Der Beispielcode ist inkonsistent.

            Wenn sichergestellt ist, dass der Inhalt von $subpages vollständig unter Kontrolle der Seitenautoren ist und da keine Daten von außerhalb reinkommen können, dann muss $subpage['title'] nicht durch htmlspecialchars() laufen.

            Sollte das jedoch nicht der Fall sein, dann muss auch $subpage['path'] abgesichert werden:

                    href="<?php echo htmlspecialchars($subpage['path']); ?>"
            

            🖖 Живіть довго і процвітайте

            --
            When the power of love overcomes the love of power the world will know peace.
            — Jimi Hendrix
          2. Hallo Gunnar,

            Das Umkopieren von $_GET['subpage'] in eine Variable macht keinen Sinn. Du verwendest einfach bei jedem Vergleich $_GET['subpage'] und gut ist.

            das habe ich anfangs sogar gemacht, aber dann wurde immer eine Fehlermeldung angezeigt, wenn der URL-Parameter subpage oben leer war, also bspw. http://games.local/games/demons-souls/ statt http://games.local/games/demons-souls/games. Die Fehlermeldung lautet:

            Warning: Undefined array key current

            Sobald ein URL-Parameter drin steht, funktioniert es wieder ohne Fehlermeldung.

            Verwende aria-current="page".

            Eine Klasse current brauchst du dann nicht; du kannst den Attributselektor [aria-current="page"] zum Stylen verwenden. (Ein Klassenselektor ist auch nur eine andere Schreibweise für einen Attributselektor.)

            Das werde ich auf jeden Fall ausprobieren, danke!

            Was du nicht tun solltest: die aktuelle Seite verlinken. Stattdessen den Link auf den Hauptinhalt setzen (also genau dorthin, wo auch der Skip-Link hinführt).

            Ich verstehe, das werde ich noch ändern.

            Live und in Schwarz/Weiß zu sehen, wo nie ein Mensch zuvor gewesen ist. Das PHP-Script, das die Seiten generiert, kann man sich auch ansehen.

            Ich hab letztens was darüber erzählt, zu sehen ist das auf Folie 7.

            Sehr interessant! Vielen Dank, dass ich mir das anschauen darf. Ich studiere das beizeiten auf jeden Fall mal genauer. Vor allem auch der generelle Aufbau der Seite mit PHP ist wirklich spannend. Ich habe oft das Gefühl, ich kriege deutlich mehr Einsicht, wenn ich mir richtige Projekte von anderen Menschen anschaue.

            Wenn es dir nicht behagt, wiederholt $_GET['subpage'] zu verwenden und damit immer wieder dasselbe zu tun, kannst du das auch mit einer Schleife machen;

            Ja, ist eine Überlegung wert. Allerdings versuche ich das wohl tatsächlich eher mit aria-current zu lösen, ist wohl sauberer.

            1. @@borisbaer

              Wenn es dir nicht behagt, wiederholt $_GET['subpage'] zu verwenden und damit immer wieder dasselbe zu tun, kannst du das auch mit einer Schleife machen;

              Ja, ist eine Überlegung wert. Allerdings versuche ich das wohl tatsächlich eher mit aria-current zu lösen, ist wohl sauberer.

              Das Eine hat mit dem Anderen nichts zu tun.

              Du kannst entweder eine Schleife über ein vorher definiertes Array machen oder if … elseif … elseif … else … (oder switch { case … case … default …}).

              Bei beiden Varianten setzt du für den jeweils aktuellen Menüpunkt href="#main (o.ä.) und aria-current="page"; für alle anderen Menüpunkte href` auf die jeweilige Unterseite.

              🖖 Живіть довго і процвітайте

              --
              When the power of love overcomes the love of power the world will know peace.
              — Jimi Hendrix
  2. Hallo borisbaer,

    du kannst die Generierung der "current page" Markierung in eine Funktion auslagern. So zum Beispiel:

       function mark_current_subpage($subpage_id) {
          return (($_GET['subpage'] ?? 'game') == $subpage_id)
              ?  "aria-current='page'"
              : "";
       }
       
       function game()
       {
    ?>
    	<a <?= mark_current_subpage('game') ?> href="game">Spiel</a>
    <?php 
       }
    

    Das ?? ist der "Null-Koaleszenz" Operator (null coalescing). Er liefert einen Defaultwert, wenn ein Wert NULL ist oder ein Array-Eintrag nicht existiert. Ich habe 'game' als Defaultwert gesetzt, weil das bei Dir die Defaultseite zu sein scheint, wenn als subpage nichts geliefert wird.

    Auf diese Weise lässt sich die Generierung der current-page Markierung auf einen Einzeiler reduzieren. Ob Du nun Gunnars Vorschlag folgst und aria-current='page' setzt oder bei class='current' bleibst, ist deine Entscheidung.

    Im CSS kannst Du das aria-current Attribut so prüfen:

    a[aria-current=page] {
       ...
    }
    

    Statt in einer Funktion jedesmal neu zu ermitteln, ob subpage gesetzt ist, könntest Du das auch einmal tun, an der Stelle, wo Du das Menü generierst. Ob das sinnvoll ist, hängt davon ab, ob das nur eine einzige Stelle ist oder ob sich das durch den Code verteilt.

    Aber wenn's nur eine Stelle ist, kannst Du den Namen der angeforderten Subpage einmal ermitteln und dann den Funktionen, die den Link erzeugen, als Parameter übergeben.

    ODER Du machst eine Klasse, die die Menü-Methoden enthält, und setzt dort den Namen der aktuellen Seite als Eigenschaft ein.

    Du hast die Wahl der Qual.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. @@Rolf B

      Ob Du nun Gunnars Vorschlag folgst und aria-current='page' setzt oder bei class='current' bleibst, ist deine Entscheidung.

      Warum erweckst du hier den Eindruck, die Hervorhebung der aktuellen Seite im Menü sei nur für sehende Nutzer von Belang und könnte anderen Nutzern vorenthalten werden? 😠

      🖖 Живіть довго і процвітайте

      --
      When the power of love overcomes the love of power the world will know peace.
      — Jimi Hendrix