[APF3.4] form->fillForm() Problem

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Antworten
Benutzeravatar
dave
Beiträge: 928
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

[APF3.4] form->fillForm() Problem

Beitrag von dave » 05.04.2018, 20:23:43

Hallo Christian,

bin gerade dabei, das bequeme Befüllen/Erstellen von Objekten und Formularen via

Code: Alles auswählen

$form->fillModel()
$form->fillForm()
zu ergründen. Die Funktion ist schonmal einsame Spitze, das Befüllen von Formularen ist super schnell und einfach erledigt.

Ich habe nun jedoch noch ein kleines Problem, welches ich jedoch als Bug erachte. Möchte das trotzdem erstmal kurz hier erläutern:
Mein Objekt besteht bspw. aus folgenden Eigenschaften:

Code: Alles auswählen

StrasseHausnummer
InternetURL
Mein Formular hat input-Felder mit exakt auch diesem Namen. Jedoch werden diese nicht befüllt. Das Problem liegt nämlich darin, dass die Eigenschaften umbenannt werden in

Code: Alles auswählen

Strasse-hausnummer
Internet-uRL
Passe ich also die Namen der input-Felder an, klappt auch die Befüllung.

Das Problem scheint die regular-Expression der Methode mapModelPropertyNameToFormControlName der Klasse HtmlFormTag zu sein. In der Doku wird ja auch erwähnt, dass Bindestriche nicht als PHP-Variablen zulässig sind.
Mir fällt gerade keine gute Lösung ein, um das abzufangen.

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

Re: [APF3.4] form->fillForm() Problem

Beitrag von dr.e. » 12.04.2018, 14:31:05

Hallo dave,

das ist ein guter Punkt! An sich ist die Idee des Mappings nicht PHP-konforme Namen mit Bindestrichen zu remappen.

In deinem Fall fangen die Namen jeweils mit einem Großbuchstaben an und das könnte den regulären Ausdruck durcheinander bringen. Kannst du deine Felder mal in strasseHausnummer (kleines "s" am Anfang)?
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 928
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [APF3.4] form->fillForm() Problem

Beitrag von dave » 16.04.2018, 16:29:04

Hi Christian,

ich habe mal getestet. Die einzige Änderung ist, dass die Felder nun

Code: Alles auswählen

strasse-hausnummer
internet-url
heissen. Der Bindestrich "-" wird grundsätzlich "rein gemogelt", obwohl dies ja nur dann durchgeführt werden sollte, wenn wir ein DomainObjekt aus einem Formular befüllen.
Ich bin mit reulären Ausdrücken leider gar nicht bewandert, sonst würde ich das selbst fixen ... :?

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

Re: [APF3.4] form->fillForm() Problem

Beitrag von dr.e. » 18.04.2018, 17:32:33

Hallo dave,

ok, dann schaue ich mir das nochmal genauer an. Grundsätzlich war die Idee eine saubere Benennung der Felder zu definieren, die immer dem gleichen Schema folgt. Das bedeutet in der aktuellen Implementierung (leider) auch, dass bereits PHP-konforme Namen re-strukturriert werden.

Denke das sollte sich aber lösen lassen. Ich schreibe mal einen Unit Test und passe die Implementierung an.

Könntest du in der Zwischenzeit auch mit der aktuellen Vorgehensweise leben?
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 928
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [APF3.4] form->fillForm() Problem

Beitrag von dave » 19.04.2018, 17:52:51

Hi Christian,
Ok, freut mich wenn du die Problematik nachvollziehen konntest.
dr.e. hat geschrieben:
18.04.2018, 17:32:33
Könntest du in der Zwischenzeit auch mit der aktuellen Vorgehensweise leben?
Jup, gar kein Problem. Habe meine Felder erstmal mit ner Notiz angepasst. Nutze es bisher sowieso nur an einer Stelle testweise.

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

Re: [APF3.4] form->fillForm() Problem

Beitrag von dr.e. » 28.04.2018, 16:49:31

Hallo dave,

ich habe mir die Implementierung nochmal genauer angesehen. Das Mapping der Daten vom Model in die Formular-Controls und umgekehrt wird immer von den Properties des Models gesteuert (siehe tools/form/taglib/HtmlFormTag.php:646 und tools/form/taglib/HtmlFormTag.php:599). Das bedeutet, dass ich zur Generierung der Feld-Namen im Formular nicht die Feld-Namen selbst als Ausgangs-Datum nutze, sondern den Namen der Property im Model.

Die Properties sind bereits PHP-konform und damit würde sich auch kein Problem bei der Vergabe der Namen der Formular-Elemente und umgekehrt ergeben (theoretisch). In der Praxis ist das anders, denn wenn ein Formular-Control den Namen "foo-bar" hat, kann dazu keine (valide) Model-Property gefunden werden, daher das Remapping. Da ich gemäß der Implementierung nun nicht "foo-bar" (Name des Form-Controls) als Ausgangs-Basis nutze, sondern das Property des Models generiere ich in solchen Fällen ein Dead-Lock - sprich eine Befüllung wird von "foo-bar" nach z.B. "fooBar" wird niemals funktionieren.

Aus meiner Sicht gibt es nun zwei Optionen:
  • Das Feature bleibt wie aktuell implementiert. Vorteil: Mapping ist immer konsistent. Nachteil: Formular-Control-Namen müssen immer auf die Binde-Strich-Schreibweise angepasst werden.
  • Wir entfernen das Mapping. Vorteil: Kein Mapping, das ggf. verwirrt und dein initiales Beispiel funktioniert. Nachteil: ungünstig gewählte Feld-Namen passen nicht zum Model und werden nicht gefüllt.
Um die Analyse ein wenig einfacher zu gestalten könnten wir in beiden Fällen die Methoden fillModel() und fillForm() so erweitern, dass sie die FormException immer nach Außen geben und dir dann die Chance geben einfacher/schneller zu verstehen, warum das Mapping nicht funktioniert. Das bedeutet dann aber im Umkehrschluss dass du bei einem Mapping von mehreren Models auf ein Formular (Teil-Mapping) immer eine Mapping-Anweisung mitgeben musst - andernfalls kommt es auch im "Happy Case" zum Fehler.

Was denkst du?
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 928
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [APF3.4] form->fillForm() Problem

Beitrag von dave » 04.05.2018, 17:02:10

Hallo Christian,

vielen Dank für deine Ausführungen. Der Einfachheit halber würde ich dann vorschlagen, dass wir das so belassen.
Ich habe für mich einen "Spezialfall" realisiert, wobei die Properties eben nicht PHP-konform sind. In der Dokumentation steht ja ganz explizit, dass für die Verwendung dieser Methoden PHP-konforme Properties gesetzt werden sollten. Und ich ging davon aus, dass wir die Regular Expression der Methode mapModelPropertyNameToFormControlName noch anpassen könnten, um ein paar mehr Anwendungsfälle abzudecken. Das würde aber sicherlich den Rahmen sprengen.

Da ich gerade dabei bin, eine neue Sektion für meine Anwendung zu realisieren, werde ich dort mal komplett auf PHP-Konformität setzen und ich melde mich dann an dieser Stelle wieder, sollte es dennoch Probleme aus meiner Sicht geben.

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

Re: [APF3.4] form->fillForm() Problem

Beitrag von dr.e. » 07.05.2018, 08:51:14

Hallo dave,

vielen Dank für deine Antwort! Bin gespannt, was du von der Implementierung der neuen Sektion berichtest. :)
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast