hotti: Platzhalter Voodoo

hi,

wie weit darf eine Template-Engine selber denken? Darf eine TE den Versuch machen, Werte für dem MVC unbekannte Platzhalter zu finden?

Was meint Ihr? Immerhin könnte es ja vorkommen, dass der Designer einen Platzhalter ins Template schreibt, den der Entwickler nicht kennt...

Horst

  1. Hallo,

    wie weit darf eine Template-Engine selber denken? Darf eine TE den Versuch machen, Werte für dem MVC unbekannte Platzhalter zu finden?

    Was meint Ihr? Immerhin könnte es ja vorkommen, dass der Designer einen Platzhalter ins Template schreibt, den der Entwickler nicht kennt...

    Horst

    das würde ich aus Sicherheitsgründen (könnte ja sein User x sieht plötzlich Daten die garnicht für ihn bestimmt sind) nicht machen, dann schon eher ein Log mitlaufen lassen was sowas protokolliert und evtl. per Mail eine Nachricht sendet.

    Gruß Helmut

    1. hi,

      das würde ich aus Sicherheitsgründen (könnte ja sein User x sieht plötzlich Daten die garnicht für ihn bestimmt sind)

      Das ist ein interessanter Aspekt, aber lösbar auch für diesen Fall. Meine Templ.Eng. würde maximal schauen, ob es für einen Platzhalter %gehalt% eine gleichnamige Methode gibt, sofern sich nicht vorher bereits der MVC darum gekümmert hat ;)

      Mit anderen Worten: Ein solches Default-Verhalten erlaubt die Verwendung von Platzhaltern, die mit dem MVC gar nichts zu tun haben, beispielsweise Datumangaben (HN im %month% %year%).

      Horst

  2. Meine Herren!

    Was meint Ihr? Immerhin könnte es ja vorkommen, dass der Designer einen Platzhalter ins Template schreibt, den der Entwickler nicht kennt...

    Nä! Der Platzhalter ist offensichtlich unter falschen Annahmen eingefügt worden und das sollte man dem Anwender in aller Deutlichkeit vor Augen führen.
    Nimm mal an der Platzhalter ist nur deshalb unbekannt, weil der Designer sich vertippt hat. Deine TE geht also hin und macht auf naiv und findet irgend einen anderen Wert. Im aller schlimmsten Fall findet die TE sogar genau den richtigen Wert und der Fehler bleibt unentdeckt.

    --
    “All right, then, I'll go to hell.”
    1. Moin!

      Im aller schlimmsten Fall findet die TE sogar genau den richtigen Wert und der Fehler bleibt unentdeckt.

      Das erinnert mich an Facebook, wo man beim Einloggen eine falschgeschriebene Mailadresse nehmen kann. Das wird einem aber nicht gesagt, sondern man wird erkannt aber man muss das Passwort nochmal eingeben und wundert sich.

      --
      Signaturen sind bloed.
    2. hi,

      Nä! Der Platzhalter ist offensichtlich unter falschen Annahmen eingefügt worden und das sollte man dem Anwender in aller Deutlichkeit vor Augen führen.

      Abstrakt gesehen geht es um Default-Werte.

      Nimm mal an der Platzhalter ist nur deshalb unbekannt, weil der Designer sich vertippt hat. Deine TE geht also hin und macht auf naiv und findet irgend einen anderen Wert. Im aller schlimmsten Fall findet die TE sogar genau den richtigen Wert und der Fehler bleibt unentdeckt.

      Nein, soweit wirds nicht kommen. Der Fehler muss ja ersteinmal programmiert werden ;)

      Horst

      1. Mahlzeit,

        Abstrakt gesehen geht es um Default-Werte.

        Die sollten aber explizit angefordert werden. Wenn nur der Platzhalter im Template steht, muss der mindestens ne Notice werfen.
        Nur wenn der Platzhalter einen Defaultwert erzwingt (so macht es z.B. Smarty3) sollte ein solcher benutzt werden.

        "Denken" sollte eine TE nur soweit, wie es der Programmierer explizit erlaubt. Rumraten sollte ihr verboten werden.

        --
        42
        1. hi,

          Die sollten aber explizit angefordert werden. Wenn nur der Platzhalter im Template steht, muss der mindestens ne Notice werfen.
          Nur wenn der Platzhalter einen Defaultwert erzwingt (so macht es z.B. Smarty3) sollte ein solcher benutzt werden.

          Ja, so habe ich das auch bisher.

          "Denken" sollte eine TE nur soweit, wie es der Programmierer explizit erlaubt. Rumraten sollte ihr verboten werden.

          Korrekt. Auch das eigenmächtige Rumsuchen in Datenbanken nach Werten, die irgendwie Ähnlichkeiten mit dem Namen des Platzhalters haben... wäre ja noch schöner ;)

          Horst

          --
          Wenn Baumaschinen denken würden... So ein Scheißdreck, dachte der Bagger, da bumse ich lieber die Schneefräse.
      2. Meine Herren!

        Nä! Der Platzhalter ist offensichtlich unter falschen Annahmen eingefügt worden und das sollte man dem Anwender in aller Deutlichkeit vor Augen führen.

        Abstrakt gesehen geht es um Default-Werte.

        Abstrakt gesehen verstehe ich die Fragestellung nicht. Wenn ein Standard-Wert zu einem Platzhalter existiert, ist der Platzhalter nicht unbekannt.

        --
        “All right, then, I'll go to hell.”
        1. Mahlzeit,

          Abstrakt gesehen verstehe ich die Fragestellung nicht. Wenn ein Standard-Wert zu einem Platzhalter existiert, ist der Platzhalter nicht unbekannt.

          Zumindest bei Smarty3 darf ein Platzhalter gar nicht existieren, wenn er durch einen Defaultwert ersetzt werden soll.

          {$platzhalter:"defaultwert"}

          Nur dann wenn isset($platzhalter) == FALSE wird der Defaultwert genutzt.

          Wenn nach deiner Aussage der Platzhalter existiert, braucht er ja keinen Defaultwert, da die dahinterstehende Variable (Konstante, Array ...) ja einen eindeutigen Wert liefert.
          Somit ist es genau umgekehrt, wie du schreibst. Wenn der Platzhalter einen Defaultwert bekommen soll, _darf_ er nicht bekannt sein.

          --
          42
          1. Meine Herren!

            Wenn nach deiner Aussage der Platzhalter existiert, braucht er ja keinen Defaultwert, da die dahinterstehende Variable (Konstante, Array ...) ja einen eindeutigen Wert liefert.

            Wir reden mal wieder aneinander vorbei.

            Mein Verständnis in Bildern:

            Das Template:
            <span>{{GIB_MIR_FÜNF}}</span><span>{{UNBEKANNTER_PLATZHALTER}}</span>

            Das zugehörige Model:

            {  
               GIB_MIR_FÜNF : 5,  
            }
            

            Ergibt gerendert zum Beispiel:
            <span>5</span><span>{{UNBEKANNTER_PLATZHALTER}}</span>

            Wenn ich jetzt einen Default-Wert für UNBEKANNTER_PLATZHALTER hinzufüge...

            {  
               GIB_MIR_FÜNF : 5,  
               UNBEKANNTER_PLATZHALTER : 42  
            }  
            
            

            ..ist der UNBEKANNTER_PLATZHALTER nicht mehr unbekannt, weils dem Model ja bekannt ist.

            BTW: Template-Engines sollte imho. so doof wie möglich sein. Logic-less wie Mustache

            1. hi,

              Ergibt gerendert zum Beispiel:
              <span>5</span><span>{{UNBEKANNTER_PLATZHALTER}}</span>

              Siehe da, es gibt einen Default-Wert: Nämlich der Name des Platzhalters selbst.

              Btw., Default != Standard

              Horst

              1. Meine Herren!

                Ergibt gerendert zum Beispiel:
                <span>5</span><span>{{UNBEKANNTER_PLATZHALTER}}</span>

                Siehe da, es gibt einen Default-Wert: Nämlich der Name des Platzhalters selbst.

                Jetzt versteh ich was du mit Default-Wert meinst. Ich bin bisher davon ausgegangen, dass ein Default-Wert schon an einen Platzhalter gebunden ist.

                Also für den Produktiv-Betrieb würde ich unbekannte Platzhalter unterdrücken, also entfernen.
                Im Debug-Modus würde ich den Platzhalter angezeigt lassen und eine korrespondierende Warnung oder Notiz an den Benutzer ausgeben.

                Was würdest du denn noch in Erwägung ziehen?

                1. hi,

                  Also für den Produktiv-Betrieb würde ich unbekannte Platzhalter unterdrücken, also entfernen.
                  Im Debug-Modus würde ich den Platzhalter angezeigt lassen und eine korrespondierende Warnung oder Notiz an den Benutzer ausgeben.

                  Klar, das ist und bleibt auch bei mir so. Betrifft illegal ausgewilderte Platzhirsche, hehe ;)

                  Was würdest du denn noch in Erwägung ziehen?

                  Die Wertzuweisung an Platzhalter am Controller vorbei, erst kurz vor der Ausgabe zu tätigen.
                  Für bestimmte Platzhalter soll es keine Abhängigkeit vom Controller geben.

                  Horst

                  1. Meine Herren!

                    Was würdest du denn noch in Erwägung ziehen?

                    Die Wertzuweisung an Platzhalter am Controller vorbei, erst kurz vor der Ausgabe zu tätigen.

                    Du meinst sowas wie einen Postprozessor, der sich die Ausgabe vom Controller nimmt und nochmal Änderungen vornehmen kann?

                    Für bestimmte Platzhalter soll es keine Abhängigkeit vom Controller geben.

                    Verstehe ich nicht. Ich glaube du bist stark von deinem eigenen CMS vorbelastet, wenn du mit Worten wie Controller hantierst. In der freien Welt da draußen gibt es aber Implementationen des MVC-Patterns, die unterschiedlicher nicht sein könnten. Einige haben für sich schon festgestellt, dass ihr Controller gar kein Controller im weiteren Sinne mehr ist.

                    Gib mir mal was zum anpacken, ein greifbares Beispiel. Ich kann mit der Fragestellung immer noch nichts anfangen.

                    --
                    “All right, then, I'll go to hell.”
                    1. hi,

                      Verstehe ich nicht. Ich glaube du bist stark von deinem eigenen CMS vorbelastet, wenn du mit Worten wie Controller hantierst. In der freien Welt da draußen gibt es aber Implementationen des MVC-Patterns, die unterschiedlicher nicht sein könnten. Einige haben für sich schon festgestellt, dass ihr Controller gar kein Controller im weiteren Sinne mehr ist.

                      Klar doch ;)
                      Meine Controller implementieren ein Interface. Da steckt u.a. auch die Initialisierung von Platzhaltern drin.

                      Gib mir mal was zum anpacken, ein greifbares Beispiel. Ich kann mit der Fragestellung immer noch nichts anfangen.

                      Z.B. das %wetter% auf jeder Seite. Ändert sich kurzfristig nicht, ist also egal, zu welchem Zeitpunkt ich das einbinde. Ich müsste mir alle Controller vorknöpfen, damit in %wetter% was drinsteht. So eine kleine Nebenaufgabe kann aber auch die Template-Engine übernehmen, die baut das Wetter dann eben erst zum Schluss ein. So können dann auch Seiten bewettert werden, die gar keinen Controller haben (nicht interaktive Seiten). Meine Controller sind allesamt wetterunabhängig, genauso wie die TE. Wer die Daten besorgt, ist also egal.

                      Horst

                      1. [..] Wer die Daten besorgt, ist also egal.

                        Letztendlich wird %wetter% an der Stelle gesetzt, wo sich die TE um fehlende Werte kümmert. Wenn das %wetter% auch noch fehlt, bleibts bei der bisherigen Verhalten.

                        Horst

                        1. Meine Herren!

                          [..] Wer die Daten besorgt, ist also egal.

                          Letztendlich wird %wetter% an der Stelle gesetzt, wo sich die TE um fehlende Werte kümmert. Wenn das %wetter% auch noch fehlt, bleibts bei der bisherigen Verhalten.

                          Zusammen mit deinem Artikel hab ich jetzt einen groben Eindruck von der Problemstellung und deinem Lösungsansatz.

                          Die Situation: Du möchtest Informationen, die in keinem offensichtlichen Zusammenhang stehen, mit einer einzelnen Ressource ausliefern. In deiner Architektur verknüpfst du eine Ressource direkt mit der Ausgaben EINES Controllers. Zum Beispiel wird die Detail-Seite (≙ Ressource) für einen News-Datensatz (≙ Model) vom News-Controller zusammengebastelt. Nun gibt es die Zusatzanforderung, dass die Detail-Seite auch Wetter-Daten anzeigen soll. Der News-Controller kann das naturgemäß nicht leisten.

                          Dein Lösungsansatz: Du hast einen Postprozessor gebastelt, der sich die vermeintlich fertige Ausgabe des News-Controllers nimmt und anschließend unfertige Teile (≙  %wetter%-Platzhalter) aus dem News-View nimmt und sie aufbereitet. Den Postprozessor registriert man offenbar bei deiner Template-Engine.

                          Ist das soweit richtig?

                          --
                          “All right, then, I'll go to hell.”
                          1. Ist das soweit richtig?

                            Hallo mein Lieber,

                            herzlichen Dank für Dein Interesse. Ja, das ist soweit richtig und funktioniert. Erschrecklicherweise genausogut wie vorher, wo meine Startseite, nicht das Wetter aber %month%, %year% über einen Controller bekam, welcher die init()-Methode meines FW-Interface implemenitert.

                            Schön ist die Lösung nicht, sie verstößt gegen gewisse Prinzipien: eine TE sollte so dumm bleiben.

                            Besser wärs doch, das Interface um einen Methode zu erweitern. Jetzt, wo ich das so schön aufteilen kann. Und die Zeit habe ich ;)

                            Was meinst Du?

                            Horst

                            --
                            Wenn ein Lampenwechsel ansteht, warte bis es dunkel ist. Da siehst du besser, ob die neue Lampe auch wirklich einen Nutzen bringt.
              2. Meine Herren!

                Btw., Default != Standard

                „default“ lässt sich problemlos mit „Standard“ übersetzen und so wird es i.d.R. auch gemacht.

                Du wolltest vermutlich auf „fallback“ hinaus.

                1. Meine Herren!

                  Btw., Default != Standard

                  „default“ lässt sich problemlos mit „Standard“ übersetzen und so wird es i.d.R. auch gemacht.

                  Einspruch ;)
                  Default-Wert: Fehlwert.
                  Standard: Alle Werte sind definiert und vorhanden.

                  Du wolltest vermutlich auf „fallback“ hinaus.

                  Das ist die Aktion: Was tun wir, wenn ein Wert fehlt.

                  Horst

                  1. Meine Herren!

                    „default“ lässt sich problemlos mit „Standard“ übersetzen und so wird es i.d.R. auch gemacht.

                    Einspruch ;)
                    Default-Wert: Fehlwert.
                    Standard: Alle Werte sind definiert und vorhanden.

                    Solange wir uns auf kein kontrolliertes Vokublar geeignet haben, gehe ich von einer allgemein üblichen Nomenklatur aus.

                    http://de.wikipedia.org/wiki/Default
                    http://de.wikipedia.org/wiki/Voreinstellung
                    http://de.wikipedia.org/wiki/Standardannahme

            2. Mahlzeit,

              Wenn ich jetzt einen Default-Wert für UNBEKANNTER_PLATZHALTER hinzufüge...

              {

              GIB_MIR_FÜNF : 5,
                 UNBEKANNTER_PLATZHALTER : 42
              }

                
              Das hat aber nichts mit der TE zu tun, wenn du im Code den Platzhalter einen Wert zuweist. Es ging ja um einen Defaultwert, wenn die TE den Platzhalter nicht kennt. Also einer OHNE Defaultwert.  
              
              -- 
              42
              
              1. Meine Herren!

                Es ging ja um einen Defaultwert, wenn die TE den Platzhalter nicht kennt. Also einer OHNE Defaultwert.

                Ja davon bist du ausgegangen und das hat hotti auch gemeint, ich hab das anders verstanden.

                --
                “All right, then, I'll go to hell.”