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: 4586
Registriert: 04.11.2007, 16:13:53

Re: FormControl Taglib

Beitrag von dr.e. » 22.08.2017, 13:41:44

Hallo Thalo,

danke für das Beispiel! Das ist in der Tat nicht das gewünschte Verhalten. Meine Vermutung geht dahin, dass die sich Tag-Implementierung immer noch nicht 100% als Formular-Element-Gruppe verhält.

Ich schaue mir das nochmal an und melde mich mit weiteren Informationen!
Viele Grüße,
Christian

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

Re: FormControl Taglib

Beitrag von Thalo » 15.11.2017, 15:48:28

Hallo Christian,

wäre schön wenn du dir das bei Gelegenheit noch mal ansiehst. :)

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

Re: FormControl Taglib

Beitrag von dr.e. » 04.12.2017, 10:54:25

Hallo Thalo,

danke für den Reminder, das hatte ich definitiv noch auf der Agenda! :) Bin heute aus meinem 4-wöchigen Urlaub zurück und versuche gerade mich zu sortieren.

Werde mir das im Rahmen von https://adventure-php-framework.org/tra ... php?id=119 ansehen und daraus ein sinnvolles Feature extrahieren. Melde mich, sobald ich dazu komme. :)
Viele Grüße,
Christian

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

Re: FormControl Taglib

Beitrag von dr.e. » 02.01.2018, 12:14:57

Hallo Thalo,

ich wollte dir kurz ein "Lebenszeichen" geben. Ich habe dich und das Thema nicht vergessen, bin allerdings schlicht noch nicht dazu gekommen, meine Urlaubs-Fotos haben mich doch länger beschäftigt als angenommen. :)

Melde mich wieder!
Viele Grüße,
Christian

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

Re: FormControl Taglib

Beitrag von dr.e. » 17.01.2018, 22:53:03

Hallo Thalo,

ich bin nun endlich zur Analyse des Themas gekommen. :)

Das von dir beschriebene Verhalten ist darauf zurück zu führen, dass die Implementierung des ComplexTextFieldTag durch die Definition im Template

Code: Alles auswählen

<complex:text-field label="Example 1" representation="text-field" name="foo-1" listener="Example Validator 3"/>
denselben Wert für das Attribut name besitzt wie das eigentliche, innen liegende Text-Feld. Dadurch versucht der Validator sich auf die außen liegende Formular-Gruppe zu hängen statt auf das innen liegende Text-Feld (oder auch jedes andere Feld).

Die Lösung des Problems liegt darin, die umliegende Instanz des ComplexTextFieldTag (dynamisch) mit einem anderen, eindeutigen Namen auszustatten. Danach zeigen alle Selektoren auf das innen liegende Text-Feld und die Validierung funktioniert auch mit mehreren solcher Felder im Formular ohne Probleme und wie vom APF gewohnt.

Die Implementierung habe ich daher wie folgt angepasst:

Code: Alles auswählen

namespace DEV\wizard\tags;

use APF\core\pagecontroller\ParserException;
use APF\tools\form\taglib\FormGroupTag;

class ComplexTextFieldTag extends FormGroupTag {

   public function onParseTime() {

      $template = $this->getTemplateFilePath(__NAMESPACE__ . '\templates', $this->getAttribute('representation'));

      $html = file_get_contents($template);

      foreach ($this->getAttributes() as $key => $value) {
         $html = str_replace('${' . $key . '}', $value, $html);
      }

      // re-map form group to not appear in the request path for inner form controls
      $this->setAttribute('name', $this->getAttribute('name') . '-group');

      $this->setContent($html);
      $this->extractTagLibTags();

   }

}
Das Formular

Code: Alles auswählen

<@controller
   class="DEV\wizard\controller\ComplexTextFieldTestController"
@>
<core:addtaglib class="DEV\wizard\tags\ComplexTextFieldTag" prefix="complex" name="text-field"/>
<h3>Complex form control test</h3>
<html:form name="form">
   <complex:text-field label="Example 1" representation="text-field" name="foo-1" listener="Example Validator 3"/>
   <complex:text-field label="Example 2" representation="text-field" name="foo-2" listener="Example Validator 2"/>
   <form:text name="bar"/>
   <br />
   <form:button name="send" value="Save" />
   <form:addvalidator class="APF\tools\form\validator\TextLengthValidator" control="foo-1|foo-2" button="send" />
   <form:addvalidator class="APF\tools\form\validator\NumberValidator" button="send" control="bar"/>
</html:form>
wird demnach korrekt validiert.

Der zugehörige Controller zeigt - mit einer kleinen Erweiterung - alle Zustände zu Debug-Zwecken an:

Code: Alles auswählen

<?php
namespace DEV\wizard\controller;

use APF\core\pagecontroller\BaseDocumentController;
use APF\tools\form\FormException;
use DEV\wizard\tags\ComplexTextFieldTag;

class ComplexTextFieldTestController extends BaseDocumentController {

   public function transformContent() {

      $form = $this->getForm('form');

      if ($form->isSent()) {
         echo 'Form is sent<br />';
      } else {
         echo 'Form is *not* sent<br />';
      }

      if ($form->isValid()) {
         echo 'Form is valid<br />';
      } else {
         echo 'Form is *not* valid<br />';
      }

      /* @var $foo ComplexTextFieldTag */
      $foo = $form->getFormElementByName('foo-1');
      if ($foo->isValid()) {
         echo 'foo-1 is valid<br />';
      } else {
         echo 'foo-1 is *not* valid<br />';
      }


      /* @var $foo ComplexTextFieldTag */
      $foo = $form->getFormElementByName('foo-2');
      if ($foo->isValid()) {
         echo 'foo-2 is valid<br />';
      } else {
         echo 'foo-2 is *not* valid<br />';
      }

      $bar = $form->getFormElementByName('bar');
      if ($bar->isValid()) {
         echo 'bar is valid<br />';
      } else {
         echo 'bar is *not* valid<br />';
      }


      $form->transformOnPlace();
   }

}
Hoffe das hilft dir bei deiner konkreten Implementierung weiter!

Ich versuche das Tag nun noch ein wenig generischer zu gestalten um den Einsatz für alle möglichen Anwendungsfälle zu ermöglichen und schreibe noch ein paar Unit Tests um das in das im Rahmen von https://adventure-php-framework.org/tra ... php?id=119 in das APF zu integrieren.

Melde mich sobald ich mit der Implementierung fertig bin und du sie in dein Projekt einbinden kannst.

Lass mich gerne wissen, ob dir das hilft und deinen Anwendungsfall abdeckt!
Viele Grüße,
Christian

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

Re: FormControl Taglib

Beitrag von Thalo » 19.01.2018, 00:37:32

Hallo Christian,

herzlichen Dank für deine Rückmeldung. Ich schaue mir das am Wochenende an. :-)

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

Re: FormControl Taglib

Beitrag von Thalo » 22.01.2018, 17:19:36

Hallo Christian,

dein Beispiel funktioniert bei mir nicht.
Fatal error: Uncaught APF\tools\form\FormException: [APF\tools\form\taglib\HtmlFormTag::getFormElementByName()] No form element with name "foo-1" composed in current form "test" in document controller "APF\tools\form\taglib\HtmlFormTag".
Ändere ich die Validator-Definition auf control="foo-1-group" erscheint keine Exception. Nur die Validierung funktioniert dann erwartungsgemäß nicht. :?

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

Re: FormControl Taglib

Beitrag von dr.e. » 22.01.2018, 18:29:17

Hi Thalo,

magst du mir mal das Template posten, das hinter dem <complex:text-field /> bei dir steckt? Ich vermute das Template definiert den Namen des Feldes nicht dynamisch sondern statisch.
Viele Grüße,
Christian

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

Re: FormControl Taglib

Beitrag von dr.e. » 22.01.2018, 22:04:53

Nachtrag:

In "meiner" Template-Datei (Name: test-field.html) ist folgender Template-Code definiert:

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:text name="${name}" id="${name}" class="form-control"/>
      <form:listener name="${name}-Listener" control="${name}">
         <span class="help-block">${listener}</span>
      </form:listener>
   </div>
</div>
Hinter der Zuweisung

Code: Alles auswählen

name="${name}"
steckt die Abstraktion - sprich die dynamische Benennung der Felder zur Laufzeit - der einzelnen Felder, die wiederum vom Tag (ComplexTextFieldTag) gesteuert wird. Damit erhält jedes Feld (z.B. foo-1 und foo-2) seine konkrete Ausprägung zur Laufzeit und kann entsprechend über die "echten" Namen (z.B. foo-1 ) zugegriffen werden.

Hoffe das hilft dir!
Viele Grüße,
Christian

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

Re: FormControl Taglib

Beitrag von Thalo » 23.01.2018, 17:58:39

Hallo Christian,

danke! :)

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

Re: FormControl Taglib

Beitrag von dr.e. » 29.01.2018, 09:58:31

Hallo Thalo,

freut mich! Ich habe am Wochenende angefangen, die hier besprochene Implementierung in eine generische Form zu bringen und würde sie gerne noch in das aktuelle Release packen und dieses dann abschließen.

Magst du mir noch kurz Feedback geben, ob das alle deine Anwendungsfälle abdeckt oder ob noch etwas fehlt? Danke! :)
Viele Grüße,
Christian

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

Re: FormControl Taglib

Beitrag von dr.e. » 03.02.2018, 16:20:32

Hallo Thalo,

die Implementierung des generischen Tags ist nun fertig und kann unter https://github.com/AdventurePHP/code/co ... 9f31e49010 eingesehen werden. Ich habe mich entschieden, den Tag <form:block /> zu nennen und die Attribute namespace und template verpflichtend zu definieren.

Freue mich über dein Feedback!
Viele Grüße,
Christian

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

Re: FormControl Taglib

Beitrag von Thalo » 06.02.2018, 22:18:09

Hallo Christian,

wäre es nicht besser wenn Template und Tag-Definition unabhängig wären? Sonst wird es schwierig bei Feld spezifischen Attributen wie z.B. Checkboxen.

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

Re: FormControl Taglib

Beitrag von dr.e. » 11.02.2018, 15:58:14

Hallo Thalo,

kannst du mir ein Beispiel geben? Vielleicht hilft dir auch die Dokumentation weiter. Schau dir mal https://github.com/AdventurePHP/docs/co ... d6f61R1446 an. Die Feld-Bezeichnungen können dynamisch an Hand der Attribute "block-*" definiert werden, so ist der Tag nicht direkt an das Template und gebunden.
Viele Grüße,
Christian

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

Re: FormControl Taglib

Beitrag von Thalo » 12.02.2018, 02:15:29

Hallo Christian,

ich möchte ungern das Template für verschiedene Feld-Typen (text, select, checkbox) kopieren. Die Implementierung lässt das ja zu:

Code: Alles auswählen

<${field-type} name="${name}"/>
Was mache ich aber bei Feld spezifischen Attributen wie checked bei Checkbox oder ref bei Password?

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast