Unterstützung " und ' als Attribut-Abgrenzung

Dieser Bereich dient dazu, neue Features zu diskutieren und für die Entwicklung zu dokumentieren. // This area is dedicated to new features including proposals and documentation.
Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 10.01.2013, 20:16:03

ich wollte mich kurz melden, [...] und schaue mir das anschließend das Thema nochmal im Gesamten und in Ruhe an.
Keine Hektik, es eilt nicht. Du brauchst nicht unbedingt nochmal im Gesamten zu schauen. Eine Antwort auf diese Frage wäre schon ausreichend:
Um mich zu überzeugen fehlt mir besonders das Verständnis, weshalb du den in den letzten Beiträgen und in meinen Augen sehr sinnvollen, wenn auch steinigen Weg auf einmal unbegründet verwirfst.
[...] Sag mir, was dir daran nicht gefällt und mein Einverständnis zu deinem Vorschlag wesentlich greifbarer.
LG ;)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 03.02.2013, 13:52:53

*push*

Wie sieht es aus, können wir das Thema bald abhaken? Welche Meinung hast du zu meinem Vorschlag, in Document zu implementieren? Hilft uns evtl. das neue Feature des Tag-Parsers?

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 03.02.2013, 14:38:43

Hallo Jan,

nachdem ich die Implementierung und Dokumentaton der Änderung/Erweiterung des APF-Parsers abgeschlossen habe, kümmere ich mich wieder um dieses Thema. Sorry für die Verschiebung, das Thema war jedoch in einem Projekt ein Blocker!

Melde mich wieder mit einer konkreten Einschätzung deines Vorschlags.
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 08.02.2013, 00:29:09

Hallo Jan,

ich habe mich gestern und heute intensiv mit der Umsetzung deines Vorschlags auseinander gesetzt. Grundsätzlich funktioniert dieser, wirft allerdings noch ein paar Stolpersteine in der Benamung der Methoden und der Vererbungshierarchie auf. Diese lassen sich prinzipiell lösen, ich muss da jedoch noch etwas mehr Zeit investieren um es rund zu bekommen.

Die gute Nachricht ist jedoch, dass ich jetzt sicher bin, dass wir das Thema für 1.17 abschließen können. :)
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 08.02.2013, 14:38:59

Hallo Christian,

freut mich wirklich sehr, dass dir mein Vorschlag die entsprechenden Methoden nach Document zu verlagern (zumindest im Ansatz) doch gefällt!
Grundsätzlich funktioniert dieser, wirft allerdings noch ein paar Stolpersteine in der Benamung der Methoden und der Vererbungshierarchie auf. Diese lassen sich prinzipiell lösen, ich muss da jedoch noch etwas mehr Zeit investieren um es rund zu bekommen.
Gut möglich, das mir dabei manche Problematik noch nicht aufgefallen ist. Wenn du wünscht und die Probleme offen legst, kann ich gerne versuchen mit zu helfen.
Die gute Nachricht ist jedoch, dass ich jetzt sicher bin, dass wir das Thema für 1.17 abschließen können.
Top. ;) Bleibt die API in der Form wie in meinem Beitrag (unten) erhalten, oder ändert sich noch etwas?
Über eine Vorschau würde ich mich sehr freuen.

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 09.02.2013, 12:09:50

Hallo Jan,
Gut möglich, das mir dabei manche Problematik noch nicht aufgefallen ist. Wenn du wünscht und die Probleme offen legst, kann ich gerne versuchen mit zu helfen.
Im Wesentlichen sind es folgende Punkt, die zu lösen sind:
  • In der htmllist-Extension wird noch eine veraltete (<1.16) Tag-Notation verwendet. Diese muss refactored werden um den PlaceHolderTag auch dort verwenden zu können. @Florian: kannst du dir die Extension mal für 1.17 ansehen?
  • Die jeweiligen Methoden der konkreten Implementierungen haben in der Signatur die konkreten Typen definiert. Dies ist nach dem Refactoring nicht mehr möglich und es werden explizite Type-Hints notwendig. --> Mehr Aufwand in der Entwicklung
  • Die Methode BaseDocumentController::setPlaceHolder() kann im Document-Controller nach Refactoring der Document::setPlaceHolder() nicht mehr protected sein. Lösung: Umbenennen oder Signatur auf public setzen und überschreiben. Alternativ könnte der BaseDocumentController auch von der Vererbungshierarchie getrennt werden. Was das bedeutet, muss ich erst analysieren.
  • Exceptions können nicht mehr spezifisch formuliert werden, da ich in Document nicht weiß wo ich eingehängt bin. Damit ist leider nur ein generischer Hinweis möglich (Parent-Node, Document-Controller sofern in Parent Node definiert) was die Fehlersuche erschwert.
  • Überlagerung des Methoden-Namen ebenfalls bei LanguageLabelTag gegeben. Lösung: Refactoring notwendig.
Da an der API in 1.17 einiges geschaubt wurde sehe ich mögliche Umgebennungen nicht so kritisch. Es muss jedoch sichergestellt werden, dass die Semantik der API darunter nicht leidet.
Top. ;) Bleibt die API in der Form wie in meinem Beitrag (unten) erhalten, oder ändert sich noch etwas?
An sich ja. Kleinere Änderungen an anderer Stelle sind dadurch jedoch nicht ausgeschlossen.
Über eine Vorschau würde ich mich sehr freuen.
Die kann ich dir im Moment noch nicht geben, da mein lokaler Code-Stand nicht sauber ist (überall Marker/Kommentare, Methoden noch nicht zu Ende refactored, ...). Sobald ich einen halbwegs stabilen Stand habe, poste ich diesen hier.
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 09.02.2013, 13:31:10

Hallo Christian,

das scheint ja insbesondere aufgrund der Probleme in anderen Framework-Komponenten und -Erweiterungen etwas komplexer zu sein. Wenn du da jetzt einen Überblick hast macht es denke ich wenig Sinn, wenn ich mich da weiter einmische. Ganz im Sinne zu vieler Köche, die den Brei verderben ;)

Insofern lasse ich dich in Ruhe Lösungen finden und freue mich dann auf das Ergebnis!

Dank für den Einblick.

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 09.02.2013, 14:47:22

Hallo Jan,

ich habe meine Änderungen nun fertig und diese sind im 1.17er-Zweig im SVN verfügbar.

Die API ist nicht ganz so wie besprochen, da sich das nicht 100%ig realisieren lies. Hier ein Auszug, was du in deiner Applikation verbauen kannst:
  • Der BaseDocumentController stellt die Methoden
    • setPlaceHolder($name, $value)
    • setPlaceHolders(array $placeHolderValues)
    • setPlaceHolderIfExist($name, $value)
    • setPlaceHoldersIfExist(array $placeHolderValues)
    • setStringPlaceHolder($name, $key, $value)
    bereit. Mit diesen kannst du wie auch bisher Platzhalter aus dem Controller im aktuellen Dokument füllen. Mit setStringPlaceHolder() lassen sich ebenfalls String-Ersetzungen in den referenzierten Platzhaltern registrieren.
  • Nicht implementiert habe ich eine Methode Document::getPlaceHolder(), da ein

    Code: Alles auswählen

    $this->getPlaceHolder('my-name')->setStringPlaceHolder('foo', 'bar') 
    in PHP nicht realisierbar ist (Rückgabe von getPlaceHolder() wäre PlaceHolderTag[] und ich kann auf ein Array keine Methode anwenden).
  • Die Keys für setStringPlaceHolder() werden nun in Großbuchstaben transformiert. Damit heben sie sich - wie von dir bereits erläutert - vom übrigen Text sauber ab.
Für dein Projekt sollten nun alle Anforderungen erfüllt sein. Bitte beachte ggf. den Hinweis unter http://wiki.adventure-php-framework.org ... Controller solltest du das bisher verwendet haben.

Gib mir bitte Feedback, ob damit alle Andorderungen umsetzbar sind. Bin gespannt! :)
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 09.02.2013, 16:08:19

Wow, ich bin begeistert!

Das sieht schon mal verdammt gut aus!! Danke ;)
Die Keys für setStringPlaceHolder() werden nun in Großbuchstaben transformiert. Damit heben sie sich - wie von dir bereits erläutert - vom übrigen Text sauber ab.
Sauber. Mir wäre mittlerweile auch [A-Za-z0-9_-] recht gewesen, aber wenn ich dich überzeugen konnte 8-)
Mit setStringPlaceHolder() lassen sich ebenfalls String-Ersetzungen in den referenzierten Platzhaltern registrieren.
Du hast setStringPlaceHolder() jetzt in BaseDocumentController implementiert. Spricht für dich etwas dagegen, die Methode ebenfalls in Document zu implementieren?
Ich hatte unter anderem argumentiert:
Vorteil: Ich kann in der Logik einer Taglib Placeholder verwenden, ohne über new Page() mit Template-Datei und Controller arbeiten zu müssen. Damit ist die Funktion der Taglib dann auch wirklich in der Taglib-Klasse implementiert und nicht in externen Controllern und über mehrere Dateien verstreut.
Insbesondere für TemplateTag und FormTag stünde die String-Placeholder-Funktion dann auch zur Verfügung. Den Namenskonflikt, der dann in PlaceHolderTag entsteht, muss man natürlich noch umgehen.

Du greifst innerhalb der Methode einmal mit $this->document statt $this->getDocument() auf das aktuelle Dokument zu (oder habe ich das verzapft...?). Das könnte man evtl. noch verbessern.
Nicht implementiert habe ich eine Methode Document::getPlaceHolder(), da ein [...] in PHP nicht realisierbar ist (Rückgabe von getPlaceHolder() wäre PlaceHolderTag[] und ich kann auf ein Array keine Methode anwenden).
Stimmt. Daher kam ja die Idee eine Methode setStringPlaceHolder() anzubieten, die das Iterieren übernimmt. Darin wollte ich getPlaceholders() verwenden - und über das Ergebnis zu iterieren. Die Methode in die API aufzunehmen muss nicht sein, schaden tuts aber auch nicht, da sich die Funktionalität so wiederverwenden lässt. (Vielleicht will man ja mal beim Iterieren bestimmte PlaceHolderTags ausschliessen oder ähnlich)


Das klingt jetzt schon wieder so, als ob ich unzufrieden wäre - bin ich aber nicht! Ich dank dir sehr für deinen Einsatz und dafür, das wir jetzt eine Lösung haben.
Die paar Kleinigkeiten wären jetzt das i-Tüpfelchen ;)

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 09.02.2013, 17:47:44

Hallo Jan,
Du hast setStringPlaceHolder() jetzt in BaseDocumentController implementiert. Spricht für dich etwas dagegen, die Methode ebenfalls in Document zu implementieren?
Ich hatte unter anderem argumentiert:
Vorteil: Ich kann in der Logik einer Taglib Placeholder verwenden, ohne über new Page() mit Template-Datei und Controller arbeiten zu müssen. Damit ist die Funktion der Taglib dann auch wirklich in der Taglib-Klasse implementiert und nicht in externen Controllern und über mehrere Dateien verstreut.
Insbesondere für TemplateTag und FormTag stünde die String-Placeholder-Funktion dann auch zur Verfügung. Den Namenskonflikt, der dann in PlaceHolderTag entsteht, muss man natürlich noch umgehen.
Meine Gedanken dazu waren, dass die
StringPlaceHolder
-Geschichte ja eher auf der Ebene eines DocumentController interessant ist. Der genannte Vorteil ist jedoch nicht von der Hand zu weisen. Ich habe die Implementierung entsprechend angepasst.

Achtung: durch die Erweiterung von Document heißt die Methode PlaceHolderTag::setStringPlaceHolder() nun PlaceHolderTag::setStringReplacement(), da die Signaturen in der Vererbungshierarchie sonst Probleme machen.
Du greifst innerhalb der Methode einmal mit $this->document statt $this->getDocument() auf das aktuelle Dokument zu (oder habe ich das verzapft...?). Das könnte man evtl. noch verbessern.
Danke für den Hinweis, das hatte ich beim Review vor dem Einchecken nicht mehr beachtet. An sich ist das aber egal, da die Klassen-Variable protected ist und der getter ohnehin nur für die Document-Instanz gedacht ist um während der Transformation den DocumentController zu steuern. Habs nun vereinheitlicht.
Stimmt. Daher kam ja die Idee eine Methode setStringPlaceHolder() anzubieten, die das Iterieren übernimmt. Darin wollte ich getPlaceholders() verwenden - und über das Ergebnis zu iterieren. Die Methode in die API aufzunehmen muss nicht sein, schaden tuts aber auch nicht, da sich die Funktionalität so wiederverwenden lässt. (Vielleicht will man ja mal beim Iterieren bestimmte PlaceHolderTags ausschliessen oder ähnlich)
Sofern du spezielle Funktionalität für deinen Anwendungsfall implementieren möchtest, kannst du jetzt die Methoden getChildNode() und getChildNodes() einer Document-Instanz nutzen (sind jetzt public). Das sollte IMHO reichen.
Das klingt jetzt schon wieder so, als ob ich unzufrieden wäre - bin ich aber nicht! Ich dank dir sehr für deinen Einsatz und dafür, das wir jetzt eine Lösung haben.
Die paar Kleinigkeiten wären jetzt das i-Tüpfelchen ;)
Gerne! Das sollten wir schon hinbekommen. ;)
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 09.02.2013, 18:55:32

Der genannte Vorteil ist jedoch nicht von der Hand zu weisen. Ich habe die Implementierung entsprechend angepasst.
Achtung: durch die Erweiterung von Document heißt die Methode PlaceHolderTag::setStringPlaceHolder() nun PlaceHolderTag::setStringReplacement(), da die Signaturen in der Vererbungshierarchie sonst Probleme machen.
Super! Den Namenskonflikt hätte ich auch nicht besser lösen können. Danke! :)
Sofern du spezielle Funktionalität für deinen Anwendungsfall implementieren möchtest, kannst du jetzt die Methoden getChildNode() und getChildNodes() einer Document-Instanz nutzen (sind jetzt public). Das sollte IMHO reichen.
Dito. Geht klar.
Gerne! Das sollten wir schon hinbekommen.
Mensch, das macht richtig Spaß, hier mit zu entwickeln. Vor allem wenn da wie so häufig echt gute und praktische Ergebnisse bei rum kommen. ;)
Weiter so!

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 24.02.2013, 13:37:56

Mensch, das macht richtig Spaß, hier mit zu entwickeln. Vor allem wenn da wie so häufig echt gute und praktische Ergebnisse bei rum kommen.
Also, was soll ich sagen? :D Ich hab den aktuellen Stand aus dem SVN auf mein Projekt übertragen in dem ich die StringPlaceHolder schon selbst implementiert und genutzt hatte.
Und es läuft - einfach so, ohne Änderungen!

Spitze! Und noch mal ein ganz, ganz großes Dankeschön!!

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 01.03.2013, 22:03:44

Wir haben noch einen Fehler!!

Wenn man ein Placeholder in einem Template hat, wird das hier problematisch, da bei einer zweiten Verwendung des Templates die String-Placeholder nicht mehr zur Verfügung stehen (PlaceHolderTag::$content wurde überschrieben):

Code: Alles auswählen

   public function transform() {
      foreach ($this->stringReplacement as $key => $value) {
         $this->content = str_replace('{' . $key . '}', $value, $this->content); // <-- hier ist das Problem!
      }
      return $this->content;
   }
 
Ich schlage vor, transform() wie folgt anzupassen:

Code: Alles auswählen

   public function transform() {
      $content = $this->content;
      foreach ($this->stringReplacement as $key => $value) {
         $content = str_replace('{' . $key . '}', $value, $content); // <-- hier WAR das Problem :)
      }
      return $content;
   }
 
Ich bei mir lokal schon so gelöst.
Der Bug hat mir jetzt eine Woche einen Terminkalender versaut, da alle Daten (Datum, Zeit, Ort) bei allen Terminen gleich dem ersten Termin waren :D. Gut das es aufmerksame Mitmenschen gibt...
Und gut, dass die Seite wenig Besucher hat... :shock:

Ich würde außerdem gerne einen Getter für $stringReplacement hinzufügen. Nicht gefundene StringPlaceHolder könnte man außerdem melden (und sei es als Option zum debuggen):

Code: Alles auswählen

   public function sgetStringReplacements() {
      return $this->stringReplacement;
   }

   public function transform() {

      $content = $this->content;

      foreach ($this->stringReplacement as $key => $value) {

         $countReplacements = 0;
         $content = str_replace('{' . $key . '}', $value, $content, $countReplacements); // <-- hier ist das Problem!

         if($countReplacements < 1){
            throw new Exception('...');
         }

      }

      return $content;
   }
 
LG :)

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 01.03.2013, 23:45:40

Hi Jan,

vielen Dank für's Testen und fixen. Ich baue das sobald ich kann ins SVN ein. Leider hat mich - vermutlich - mein Notebook verlassen (Mainboard-Fehler im Speicher-Controller). :cry:
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 02.03.2013, 21:02:23

Hallo Jan,
Der Bug hat mir jetzt eine Woche einen Terminkalender versaut, da alle Daten (Datum, Zeit, Ort) bei allen Terminen gleich dem ersten Termin waren :D. Gut das es aufmerksame Mitmenschen gibt...
Und gut, dass die Seite wenig Besucher hat... :shock:
Der Fehler ist richtig cool! 8-) :D

Ich habe nun die Änderung im PlaceHolderTag::transform() aufgenommen. Die zweite Änderung ist eine reine Debug-Funktion, die eigentlich durch einen Debugger (z.B. xdebug + PHPStorm) erledigt werden sollte. Nicht gefundene Platzhalter können technisch gesehen keinen Schaden anrichten, insofern plädiere ich dafür, diese einfach zu belassen. Die sonstigen throw-Statements - z.B. beim Zugriff auf einen PlaceHolderTag - sind nur deshalb im Code vorhanden, da beim Zugriff auf den DOM ein Fehler passieren kann. Bei den optionalen String-Replacements passiert ja nichts und daher würde ich nicht künstlich für einen Fehlerzustand sorgen wollen.
Viele Grüße,
Christian

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast