FormControl Taglib

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Benutzeravatar
dr.e.
Administrator
Beiträge: 4592
Registriert: 04.11.2007, 16:13:53

Re: FormControl Taglib

Beitrag von dr.e. » 13.02.2018, 20:34:57

Hallo Thalo,
Die Implementierung lässt das ja zu:
Das ist korrekt, das kannst du tun - da hatte ich tatsächlich noch nicht dran gedacht. :)
Was mache ich aber bei Feld spezifischen Attributen wie checked bei Checkbox oder ref bei Password?
Das ist ein interessanter Anwendungsfall. Rein aus der aktuellen Implementierung könntest du die Platzhalter dafür definieren aber nicht füllen. Allerdings bleiben dann die Attribute zunächst erhalten. Sofern sie nicht in der Whitelist enthalten sind, werden sie im HTML auch nicht erscheinen. Folgendes Beispiel (vereinfacht) sollte funktionieren:

Block-Template:

Code: Alles auswählen

<${field-type} name="${name}" checked="${checked}"/>
Formular-Template:

Code: Alles auswählen

<form:block
      namespace="VENDOR\path\to\signup\templates"
      template="form-block-1"
      block-field-type="form:text"
      block-name="email"
/>
<form:block
      namespace="VENDOR\path\to\signup\templates"
      template="form-block-1"
      block-field-type="form:checkbox"
      block-checked="checked"
      block-name="newsletter"
/>
Um auch diese Verwendung noch generischer zu gestalten fällt mir im Moment keine wirklich gute Lösung ein außer noch eine DSL um die Tag-Definition zu bauen oder im Block-Template if-Statements etc. zu erlauben. Was denkst du?
Viele Grüße,
Christian

Thalo
Beiträge: 257
Registriert: 10.08.2009, 16:56:52

Re: FormControl Taglib

Beitrag von Thalo » 15.02.2018, 17:35:42

Hallo Christian,

ich habe mir einige Gedanken gemacht und denke ein guter Kompromiss zwischen Komplexität und Flexibilität wäre, das Feld an stelle einer Positionierungshilfe dynamisch als Kind an den umliegenden Block-Tag anzuhängen.

Block-Template:

Code: Alles auswählen

<div class="form-control">
    [...]
    <form:marker/>
    [...]
</div>
Formular-Template:

Code: Alles auswählen

<form:block namespace="VENDOR\path\to\signup\templates" template="form-block-1">
      <form:select name="type">
        <select:option value="triangle">triangle</select:option>
        <select:option value="square">square</select:option>
    </form:select>
</form:block>
Das Formular-Template ist dadurch zwar etwas komplexer, bietet aber auch z.B. die Möglichkleit von statischen Select-Feldern.

Meinungen? :)

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

Re: FormControl Taglib

Beitrag von dr.e. » 16.02.2018, 13:58:56

Hallo Thalo,

ich bin mir nicht sicher, ob ich den Ansatz verstanden habe. Du möchtest den Block quasi nochmals virtualisieren, in dem du dort nur einen Marker definierst? Was soll dann mit dem oben skizzierten Formular-Template passieren?

Die Definition von statischen Feldern ist sicher eine gute Sache, das kannst du ja ohne Probleme machen. Das ist allerdings - in meiner Denke - nicht die Idee von Formular-Blöcken. Da willst du ja dynamische Felder definieren.

Vielleicht kannst du mir mit ein bisschen mehr Code auf die Sprünge helfen... :)
Viele Grüße,
Christian

Thalo
Beiträge: 257
Registriert: 10.08.2009, 16:56:52

Re: FormControl Taglib

Beitrag von Thalo » 16.02.2018, 18:43:12

Hallo Christian,

das Ziel soll ja IMHO die zentrale Definition von wiederverwendbaren Boilerplate-Code sein. Das sehe ich als erfüllt. In der aktuellen Implementierung brauche ich für jedes Form-Feld ein eigenes Template und am Ende habe ich ein Gott-Tag mit allen möglichen Attributen.

Block-Template mit Marker:

Code: Alles auswählen

<div class="form-group">
   <form:label name="${name}-label" for="${name}" class="col-md-6 control-label">${label}</form:label>
   <div class="col-md-6">
      <form:marker name="${name}" class="form-control"/>
      <form:listener name="${name}-Listener" control="${name}">
         <span class="help-block">${listener}</span>
      </form:listener>
   </div>
</div>
Der Marker dient als Platzhalter für das Feld. Die statische Definition vom Feld im Block-Template ist ja weiterhin möglich.

Ist nun verständlich was ich meine? :)

Eine andere Möglich wäre, mit der vorhandenen API das Feld dynamisch anhand eines Typen-Attributes zu erstellen und Präfixlose Attribute an das Feld „durchzureichen“.

Pseudocode:

Code: Alles auswählen

public function onParseTime() {
    [...]
    
    $fieldType = $this->getAttribute('field-type');
    
    $attributes = $this->getAttributes();
    $fieldAttributes = [];
    
    foreach ($attributes as $key => $value) {
        if (strpos($key, 'block-') !== 0) {
            $fieldAttributes[$key] = $value;
        }
    }
    $fieldAttributes['name'] = $this->getAttribute('block-name');
    
    $form->addFormElementBeforeMarker('field', $fieldType, $fieldAttributes);

Code: Alles auswählen

<form:block
      namespace="VENDOR\path\to\signup\templates"
      template="form-block-1"
      block-name="newsletter"
      field-type="form:checkbox"
      checked="checked"
/>
So verhält sich das Tag nach außen hin eher wie ein „normales“ Feld. :) Idealerweise wäre es möglich statische Attribute direkt im Marker-Tag zu setzen (z.B. CSS-Klassen).

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

Re: FormControl Taglib

Beitrag von dr.e. » 19.02.2018, 17:54:23

Hallo Thalo,

danke für deine Antwort! Ich schaue mir den Fall in den nächsten Tagen an.
Viele Grüße,
Christian

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

Re: FormControl Taglib

Beitrag von dr.e. » 26.02.2018, 21:49:03

Hallo Thalo,
Ist nun verständlich was ich meine? :)
Ah, jetzt verstehe ich deinen Ansatz! :) Das kannst du natürlich tun und dann alle entsprechenden Felder - vielleicht gekapselt in wiederum einer Formular-Klasse oder einem Service - dynamisch erstellen.
So verhält sich das Tag nach außen hin eher wie ein „normales“ Feld. :) Idealerweise wäre es möglich statische Attribute direkt im Marker-Tag zu setzen (z.B. CSS-Klassen).
Auch das ist mit der Implementierung möglich. Bei der rein statischen Definition verlierst du allerdings Funktionalitäten wie Validierung, automatische Befüllung usw. Damit brauchst du dann eben wieder die Möglichkeit statische Attribute zu setzen. Evtl. könntest du dir dafür aber wieder einen eigenen "Marker-Tag" schreiben, der das unterstützt.

Bin gespannt, ob du auf diese Weise zum Ziel kommst! :)
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast