PBillhardt
I'm new here

Regeln - Formularelemente dynamisch befüllen funktioniert nicht

Hallo zusammen,

aktuell kämpfe ich mit den FirstSpirit Regeln, allerdings funktioniert es nicht so wie ich mir das eigentlich vorstelle. Gegeben ist V5.0.510.62658. Ich versuche in einer Tabellenvorlage über die Regeln mehrere CMS_INPUT_COMBOBOX und eine CMS_INPUT_LIST dynamisch über eine Query-Abfrage zu befüllen.

Hierzu habe ich folgenden Ausschnitt aus dem Formular

<CMS_GROUP tabs="top">

    <CMS_INPUT_NUMBER name="tt_created_in" type="long" editable="no" hFill="yes" singleLine="no" useLanguages="no">

      <LANGINFOS>

        <LANGINFO lang="*" label="Project id created in"/>

      </LANGINFOS>

    </CMS_INPUT_NUMBER>

    <CMS_GROUP>

      <LANGINFOS>

        <LANGINFO lang="*" label="Category and type settings"/>

      </LANGINFOS>

      <CMS_INPUT_COMBOBOX name="tt_type" hFill="yes" singleLine="no" useLanguages="no">

        <CMS_INCLUDE_OPTIONS type="database">

          <LABELS>

            <LABEL lang="*">#item.name_%lang%</LABEL>

          </LABELS>

          <TABLE>internet_dict.article_type</TABLE>

        </CMS_INCLUDE_OPTIONS>

        <LANGINFOS>

          <LANGINFO lang="*" label="Article type"/>

        </LANGINFOS>

      </CMS_INPUT_COMBOBOX>

      <CMS_INPUT_LIST name="tt_category_one" hFill="yes" useLanguages="no">

        <CMS_INCLUDE_OPTIONS type="database">

          <LABELS>

            <LABEL lang="*">#item.display_name_%lang%</LABEL>

          </LABELS>

          <QUERY name="internet_dict.get_categories_one"/>

          <TABLE>internet_dict.article_category</TABLE>

        </CMS_INCLUDE_OPTIONS>

        <LANGINFOS>

          <LANGINFO lang="*" label="Category one"/>

        </LANGINFOS>

      </CMS_INPUT_LIST>

      <CMS_INPUT_COMBOBOX name="tt_category_two" hFill="yes" singleLine="no" useLanguages="no">

        <CMS_INCLUDE_OPTIONS type="database">

          <LABELS>

            <LABEL lang="*">#item.display_name_%lang%</LABEL>

          </LABELS>

          <QUERY name=internet_dict.get_categories_two"/>

          <TABLE>internet_dict.article_category</TABLE>

        </CMS_INCLUDE_OPTIONS>

        <LANGINFOS>

          <LANGINFO lang="*" label="Category two"/>

        </LANGINFOS>

      </CMS_INPUT_COMBOBOX>

      <CMS_INPUT_COMBOBOX name="tt_category_three" hFill="yes" singleLine="no" useLanguages="no">

        <CMS_INCLUDE_OPTIONS type="database">

          <LABELS>

            <LABEL lang="*">#item.display_name_%lang%</LABEL>

          </LABELS>

          <QUERY name="internet_dict.get_categories_three"/>

          <TABLE>internet_dict.article_category</TABLE>

        </CMS_INCLUDE_OPTIONS>

        <LANGINFOS>

          <LANGINFO lang="*" label="Category three"/>

        </LANGINFOS>

      </CMS_INPUT_COMBOBOX>

    </CMS_GROUP>

</CMS_GROUP>

Den dazugehörige Query in dreifacher Ausführung, weil ich dachte das da eventuell Werte überschrieben werden, vorher hatte ich nur einen.

<QUERY entityType="article_category">

    <FILTERPARAM parameter="categoryNumberOne" datatype="java.lang.Integer" value="-1"/>

    <FILTERPARAM parameter="articleTypeOne" datatype="java.lang.Long" value="-1"/>

    <FILTERPARAM parameter="currentProjectIdOne" datatype="java.lang.Long" value="-1"/>

    <AND>

        <EQ attribute="category_number" parameter="categoryNumberOne"/>

        <EQ attribute="created_in" parameter="currentProjectIdOne"/>

        <EQ attribute="article_type.fs_id" parameter="articleTypeOne"/>

    </AND>

</QUERY>

und die Regeln für die einzelnen Formularelemente.

<!-- @group start event handling category 1 -->

<ON_EVENT>

    <IF>

        <PROPERTY source="tt_category_one" name="FOCUS"/>

    </IF>

    <WITH>

        <PROPERTY source="tt_type" name="ENTRY"/>

    </WITH>

    <DO>

        <PROPERTY source="tt_category_one" name="query.articleTypeOne"/>

    </DO>

</ON_EVENT>

<ON_EVENT>

    <IF>

        <PROPERTY source="tt_category_one" name="FOCUS"/>

    </IF>

    <WITH>

        <PROPERTY source="tt_created_in" name="VALUE"/>

    </WITH>

    <DO>

        <PROPERTY source="tt_category_one" name="query.currentProjectIdOne"/>

    </DO>

</ON_EVENT>

<ON_EVENT>

    <IF>

        <PROPERTY source="tt_category_one" name="FOCUS"/>

    </IF>

    <WITH>

        <NUMBER>1</NUMBER>

    </WITH>

    <DO>

        <PROPERTY source="tt_category_one" name="query.categoryNumberOne"/>

    </DO>

</ON_EVENT>

<!-- @group end event handling category 1 -->

<!-- @group start event handling category 2 -->

<ON_EVENT>

    <IF>

        <PROPERTY source="tt_category_two" name="FOCUS"/>

    </IF>

    <WITH>

        <PROPERTY source="tt_type" name="ENTRY"/>

    </WITH>

    <DO>

        <PROPERTY source="tt_category_two" name="query.articleTypeTwo"/>

    </DO>

</ON_EVENT>

<ON_EVENT>

    <IF>

        <PROPERTY source="tt_category_two" name="FOCUS"/>

    </IF>

    <WITH>

        <PROPERTY source="tt_created_in" name="VALUE"/>

    </WITH>

    <DO>

        <PROPERTY source="tt_category_two" name="query.currentProjectIdTwo"/>

    </DO>

</ON_EVENT>

<ON_EVENT>

    <IF>

        <PROPERTY source="tt_category_two" name="FOCUS"/>

    </IF>

    <WITH>

        <NUMBER>2</NUMBER>

    </WITH>

    <DO>

        <PROPERTY source="tt_category_two" name="query.categoryNumberTwo"/>

    </DO>

</ON_EVENT>

<!-- @group end event handling category 2 -->

<!-- @group start event handling category 3 -->

<ON_EVENT>

    <IF>

        <PROPERTY source="tt_category_three" name="FOCUS"/>

    </IF>

    <WITH>

        <PROPERTY source="tt_type" name="ENTRY"/>

    </WITH>

    <DO>

        <PROPERTY source="tt_category_three" name="query.articleTypeThree"/>

    </DO>

</ON_EVENT>

<ON_EVENT>

    <IF>

        <PROPERTY source="tt_category_three" name="FOCUS"/>

    </IF>

    <WITH>

        <PROPERTY source="tt_created_in" name="VALUE"/>

    </WITH>

    <DO>

        <PROPERTY source="tt_category_three" name="query.currentProjectIdThree"/>

    </DO>

</ON_EVENT>

<ON_EVENT>

    <IF>

        <PROPERTY source="tt_category_three" name="FOCUS"/>

    </IF>

    <WITH>

        <NUMBER>3</NUMBER>

    </WITH>

    <DO>

        <PROPERTY source="tt_category_three" name="query.categoryNumberThree"/>

    </DO>

</ON_EVENT>

<!-- @group end event handling category 3 -->

Der Query wird dynmisch über tt_created_in (ProjektID aus einem ValueService wo der Datensatz angelegt wurde), der entsprechenden Typauswahl tt_type und der Nummer der Kategorie befüllt.

Folgende Probleme bestehen

FSClient

Die beiden Comboboxen werden mit den korrekten Werten befüllt, die input_list (Auswahl) leider nicht, wobei dort auch schonmal die richtigen Werte zurück kamen, aber seit neustem einfach nichts mehr.

WebClient

Ähnliches Problem wie im FSClient. Ausnahme: Die Comboboxen werden zwar abgefragt (Request an ServerGadgetRequestService) und es kommen scheinbar auch die richtigen Werte über den Request als Antwort zurück, allerdings werden diese nur sehr sporadisch in die Comboboxen geschrieben. Hier ist es meistens so, dass nur eine Combobox befüllt wird, manchmal aber auch keine und selten auch mal beide. Die CMS_INPUT_LIST hingegen feuert keinen Request ab im hintergrund, wenn man das Feld betätigt, aber das hat auch schonmal funktioniert (Im FSClient).

Ich konnt in der Dokumentation zu den Regeln leider keine Beschränkungen ausfindig machen, vielleicht funktioniert es nicht mit der dyn. befüllung der CMS_INPUT_LIST?

Meine Lösungsansätze bisher waren:

- Für jede Kategorie eine Abfragen anlegen, anstatt nur eine Abfrage

- Die Parameter der Abfragen unterschiedlich benennen

- Die Typisierung in der Abfrage zwischen Long und Integer wechseln

- PROPERTY von VALUE auf ENTRY ändern

Ich vermute stark, dass dort die Parameter nicht richtig ankommen oder ich irgendwo einen Fehler in der Parameterübergabe habe. Wenn ich den Query manuell mit den richtigen Werten fülle, werden mir im FSClient sowie im WebClient auch in der CMS_INPUT_LIST die richtigen Werte zur Verfügung gestellt. Gibt es eine Möglichkeit zu prüfen welche Werte dort ankommen, oder generell irgendwelche Debug-Ausgaben vorzunehmen?

Nachtrag:

Im Request an ServerGadgetRequestService der Comboboxen stehen auch die richtigen werte drin:

Request

...combobox.ComboboxParameter/3729699889|categoryNumberThree|3|currentProjectIdThree|20034|articleTypeThree|1152|...

Response

...combobox.ComboboxOption/163437042","1216","Category two"],0,7]

Allerdings stehen tortzdem gerade keine Auswahlmöglichkeiten zur Verfügung in den Boxen.

Viele Grüße

Patrick

0 Kudos
3 Replies
mbergmann
Crownpeak employee

Hallo Patrick,

zum Thema "Comboboxen werden im WebEdit nicht immer gefüllt": Versuch mal, die Prüfung auf FOCUS nur in genau einer Abfrage pro Kategorie zu verwenden.

Hintergrund: Die Regeln arbeiten asynchron.

Es kann sein, dass sich hier die Antworten die die Wertemenge für eine Combobox liefern gegenseitig überholen. Es sind aber nur bei Ausführung (d.h. dem Absetzen(!) der Anfrage) der letzten Regel alle Parameter gesetzt. Die "letzte" Regel muss dabei nicht unbedingt die letzte in den Regeln definierte sein.

Wenn nun aber die Antwort der letzten Regel (die die richtige Wertemenge enthält) vor einer der beiden anderen eintrifft, wird sie ggf. von einer Antwort überschrieben, die - weil die entsprechende Abfrage noch auf einem unvollständigen Parametersatz basiert - eine leere Wertemenge liefert.

Indem man das FOCUS nur auf einer Regel definiert, stellt man sicher dass diese Regel mit einer Verzögerung startet (nämlich wenn der Benutzer die Combobox öffnet) und dadurch auch die Antwort der Abfrage mit dem kompletten Parametersatz nach den anderen beiden eintrifft.

Viele Grüße

Michael

Hallo Michael,

ich habe jetzt den FOCUS angepasst, das nur noch einer pro Element existiert, das funktioniert auf jeden Fall sehr gut, danke für den Tipp!

Jetzt ist nur noch die Frage offen, ob es auf der CMS_INPUT_LIST mit include Options nicht funktioniert? Hier werden mir keine Werte ausgegeben, auch wird kein Event im Hintergrund (WebEdit) abgefeuert und ich bekomme eine Exception angezeigt. Ich meine aber, dass mir schonmal Elemente zur Verfügung gestellt wurden. Ich brauche an der Stelle auf jeden Fall eine Mehrfachauswahl, die durch ein Query nach bestimmten Kriterien gefiltert wird.

In der Java-Konsole bekomme ich diese Exception

de.espirit.firstspirit.ui.gadgets.aspects.PropertyProcessing$UnsupportedPropertyException: The element 'tt_category_one' does not support a property named 'query.articleTypeOne'!

    at de.espirit.firstspirit.ui.gadgets.swing.ValueHoldingSwingGadgetMediator.setProperty(ValueHoldingSwingGadgetMediator.java:1434)

    at de.espirit.firstspirit.ui.gadgets.swing.messaging.SwingGadgetSetPropertyRequest.handle(SwingGadgetSetPropertyRequest.java:37)

    at de.espirit.firstspirit.ui.gadgets.swing.ValueHoldingSwingGadgetMediator.handle(ValueHoldingSwingGadgetMediator.java:688)

    at de.espirit.firstspirit.ui.gadgets.swing.AggregatingSwingGadgetMediator.handle(AggregatingSwingGadgetMediator.java:205)

    at de.espirit.firstspirit.ui.gadgets.swing.AggregatingSwingGadgetMediator.handle(AggregatingSwingGadgetMediator.java:205)

    at de.espirit.firstspirit.ui.gadgets.swing.AggregatingSwingGadgetMediator.handle(AggregatingSwingGadgetMediator.java:205)

    at de.espirit.firstspirit.ui.gadgets.swing.SwingGadgetRequestingFactBase.setFact(SwingGadgetRequestingFactBase.java:91)

    at de.espirit.firstspirit.forms.rules.Property.process(Property.java:61)

    at de.espirit.firstspirit.forms.rules.Rule.processFact(Rule.java:230)

    at de.espirit.firstspirit.forms.rules.Rule.fire(Rule.java:210)

    at de.espirit.firstspirit.forms.rules.RuleEngine.doProcess(RuleEngine.java:215)

    at de.espirit.firstspirit.forms.rules.RuleEngine.access$000(RuleEngine.java:20)

    at de.espirit.firstspirit.forms.rules.RuleEngine$1.execute(RuleEngine.java:170)

    at de.espirit.firstspirit.client.gui.SwingFormView$RunnableCommand.run(SwingFormView.java:1017)

    at de.espirit.firstspirit.client.gui.SwingFormView$RunnableCommand.call(SwingFormView.java:1024)

    at de.espirit.firstspirit.client.gui.SwingFormView$RunnableCommand.call(SwingFormView.java:1005)

    at java.util.concurrent.FutureTask.run(Unknown Source)

    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(Unknown Source)

    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

    at java.lang.Thread.run(Unknown Source)

Viele Grüße

Patrick

0 Kudos

Die CMS_INPUT_LIST unterstützt diese Funktion nicht. Das ist es auch, was die Fehlermeldung aussagt.

Peter