Rolf B: Wie rufe ich mit URL-Parametern dynamisch Inhalte auf?

Beitrag lesen

problematische Seite

Hallo Martin,

Ein einfaches else würde genügen,

nein, genügt nicht, weil es ja ein zweistufiges if ist. Es gibt unterschiedliche Auslöser für den Einsatz des Default-Tab.

Wenn man auf Flags verzichten will, und mindestens PHP 7 hat, könnte man mit Hilfe des null coalescing Operator ?? die Sache schick machen. Ich würde dann aber auch noch ein paar Funktionen benutzen.

function getTabFile($pageName)
{
   if ($pageName == null)
      return null;

   if (preg_match("/^[a-z]+$/i", $pageName) != 1)
      return null;

   $fileName = getTabFileName($pageName);
   if (file_exists($fileName))
      return $fileName;

   return null;
}

function getDefaultTabFile()
{
   return getTabFileName('default');
}

function getTabFileName($tab)
{
   return __DIR__ . "/page/$tab.php";
}

include (getTabFile($_GET['page'] ?? null) ?? getDefaultTabFile());

Von innen nach außen:

$x = $_GET['page'] ?? null ist die Kurzfassung von

if (empty($_GET['page']))
   $x = null;
else
   $x = $_GET['page']);

Man nennt das ?? den "null coalescing operator" - der kommt aus C# und Java und ist eine kompakte Methode, für NULL einen Alternativwert zu erzeugen. In diesem Fall ist die Alternative wieder null, der Zweck des ?? ist lediglich, einen fehlenden page Eintrag im $_GET nicht als Fehler aufscheinen zu lassen.

Die Funktion getTabFile bekommt den so ermittelten Tab-Namen als Parameter und prüft der Reihe nach:

  • ist er null - gib null zurück. Was dann passiert, schreibe ich gleich.
  • passt er auf das zulässige Namensmuster. Wenn nicht, gib null zurück
  • Bilde nun den Dateinamen für den Tab. Gibt's die Datei, gib den Namen zurück. Der Dateiname wird mit Hilfe einer Funktion gebildet, weil das in der nächsten Funktion auch gebraucht wird. DRY Code - Don't Repeat Yourself.
  • Sonst gib Null zurück

Heißt also: getTabFile liefert entweder den Namen einer zulässigen Tab-Datei, oder NULL. Und nun kommt ein weiterer ?? Operator, der das behandelt:

getTabFile(...) ?? getDefaultTab()

Die Funktion getDefaultTab() hat die Aufgabe, den Namen des Default-Tabs zurückzugeben. Im einfachsten Fall ist das eine Konstante, wie oben gezeigt. Im Ergebnis habe ich also nun den vom Client angegebenen Tab-Namen validiert und als Dateiname umgewandelt, oder den Default-Tab als Dateinamen. Und das wird dann an include weitergegeben.

include ( getTabFile(...) ?? getDefaultTab() );

Wenn man den Default-Tab flexibler benennen möchte, wird es komplizierter. Wenn der Default-Name bspw. game.default.tab ist, dann muss getTabFile damit umgehen können. Der Browser würde das game Tab anfordern, und der Dateiname könnte nun game.default.php oder game.php heißen. Man müsste nun beide Dateinamen abfragen. Und getDefaultTab müsste im page-Ordner mit glob oder scandir oder opendir/readdir/closedir nach einer Datei zum Muster "*.default.php" suchen. Geht natürlich, ist aber lästig. Ich persönlich würde das nicht tun. Der Client kann ja gerne ein Tab namens 'game' anfordern. Aber eine game.php Datei gibt's nicht, und er bekommt die default.php - fertig.

Rolf

--
sumpsi - posui - obstruxi
0 75

Wie rufe ich mit URL-Parametern dynamisch Inhalte auf?

borisbaer
  • url
  1. 0
    TS
    • ajax
    • client-server
    • url
    1. 0
      borisbaer
  2. 0
    dedlfix
    1. 0
      borisbaer
      1. 0
        Samuel fiedler
        • javascript
        • php
        • url
        1. 0
          Der Martin
          • php
          • url
        2. 0
          Rolf B
          1. 0
            borisbaer
            1. 0
              Rolf B
              1. 0
                borisbaer
                1. 0
                  Rolf B
                  1. 0
                    borisbaer
                    1. 0
                      Rolf B
                      1. 0
                        borisbaer
                        1. 0
                          tk
                          • php
                          • url
                          1. 0
                            borisbaer
                        2. 0
                          Rolf B
                          1. 0
                            borisbaer
                            1. 0
                              Rolf B
                      2. 1
                        tk
                        • php
                        • url
                        1. 0
                          Rolf B
                          1. 0
                            borisbaer
                            1. 0
                              Der Martin
                              1. 0
                                Rolf B
                                1. 0
                                  borisbaer
                                  1. 0
                                    Rolf B
                                    1. 0
                                      borisbaer
                                      1. 0
                                        Rolf B
                                        1. 0
                                          borisbaer
                                          1. 0
                                            Rolf B
                                            1. 0
                                              borisbaer
                                            2. 0
                                              borisbaer
                                              1. 0
                                                Rolf B
                                                1. 0
                                                  borisbaer
                                                  1. 0
                                                    Rolf B
                                                    1. 0
                                                      borisbaer
                                                      1. 0
                                                        Rolf B
                                                        1. 0
                                                          borisbaer
                                                          1. 0
                                                            borisbaer
                                                            1. 0
                                                              Rolf B
                                                              1. 0
                                                                borisbaer
                                                                1. 0
                                                                  Rolf B
                                                                  1. 0
                                                                    borisbaer
                                                            2. 0
                                                              Rolf B
                                                              1. 0
                                                                borisbaer
                                                                1. 0
                                                                  Rolf B
                                                                  1. 0
                                                                    borisbaer
                                                                    1. 0
                                                                      Rolf B
                                                                      1. 0
                                                                        borisbaer
                                                                        1. 0
                                                                          Rolf B
                                                                          1. 0
                                                                            klawischnigg
                                                                            1. 0
                                                                              Rolf B
                                                                              1. 0
                                                                                klawischnigg
                                                                                1. 0
                                                                                  Rolf B
                                                                          2. 1
                                                                            borisbaer
                                2. 0
                                  Der Martin
                                  1. 0
                                    Rolf B
                                    1. 0
                                      Der Martin
                                      1. 0
                                        Rolf B
                                        1. 0
                                          Der Martin
                                          1. 0
                                            Rolf B
                            2. 0
                              Tabellenkalk
                              1. 0
                                borisbaer
        3. 0
          borisbaer
  3. 0
    Rolf B
    1. 0
      borisbaer
      1. 0
        Rolf B
        1. 0
          borisbaer
          1. 0
            Rolf B
            1. 0
              borisbaer
              1. 1
                Rolf B
                1. 0
                  borisbaer
                  1. 0
                    Rolf B
                    1. 0
                      borisbaer