Neuer Formular Feldtyp FIELDREF

Aus openM2-Wiki
Wechseln zu: Navigation, Suche

Einleitung

Um redundante Datenhaltung zu vermeiden bzw. zu minimieren, besteht die Möglichkeit, Referenzen auf Felder unterschiedlicher Objekte zu erstellen (Verlinken auf Feldebene). Zu diesem Zweck wird der Feldtyp 'FIELDREF' verwendet, der es erlaubt, Feldinhalte aus dem Quellobjekt im Zielobjekt anzuzeigen, ohne dass die Feldinhalte redundant im Zielobjekt gespeichert werden. Der Inhalt des (der) referenzierten Feldes(r ) im Zielobjekt ist immer aktuell und identisch mit dem (den) Feldinhalt(en) des Quellobjekts. D.h. Änderungen im Quellobjekt sind, ab dem Zeitpunkt des Speicherns, auch im Zielobjekt umgehend ersichtlich.

Definition eines FIELDREF - Feldes

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!-- DOCTYPE IMPORT SYSTEM "import.dtd" -->
<IMPORT ACTION="">
<OBJECTS>
  <OBJECT TYPE ="Fieldrefform">
    <SYSTEM><NAME/><DESCRIPTION/><VALIDUNTIL/></SYSTEM> 
    <VALUES>
      <VALUE FIELD="Fieldreffeld" TYPE="FIELDREF" QUERYNAME="_fieldrefQuery" TYPEFILTER="contentTypeCode">
        <FIELDS>
	  <SYSFIELD NAME="Name"/>
	  <FIELD NAME="Feldname"/>
        </FIELDS>
      </VALUE></VALUES>
  </OBJECT>
</OBJECTS>
</IMPORT>

Tag <VALUE>

Syntax für TagVALUE mit TYPE="FIELDREF":

<VALUE<br>
  FIELD=" ''[tri:text]'' "<br>
  TYPE="FIELDREF"<br>
  QUERYNAME=" ''[tri:text]'' "<br>
  TYPEFILTER=" ''[tri:text]'' "/>

Tags und Attribute:

ELEMENT Bemerkung
FIELD Name des Feldes.
TYPE Typ des Feldes - in diesem Fall immer FIELDREF.
QUERYNAME Name der Query die für die Suche verwendet wird.
TYPEFILTER Typecode des Typs der Objekte, die über die Query aus derDT geholt werden.

Tag<SYSFIELD>

Über die SYSFIELD Tags wird definiert welche Felder aus dem SYSTEM-Teildes referenzierten Objektes beim FIELDREF angezeigt werden sollen.

Syntax:

<SYSFIELD NAME="[Name|tri:Beschreibung|Gültig bis]"/>

Tags und Attribute:

ELEMENT Bemerkung
NAME Name des Systemfeldes im referenzierten Objekt, welches beim FIELDREF angezeigt werden soll.

Derzeit: Name, Beschreibung, Gültig bis

Tag<FIELD>

Über die FIELD Tags wird definiert welche Felder aus dem VALUES-Teil des referenzierten Objektes beim FIELDREF angezeigt werden sollen.

Syntax:

<FIELD NAME=" ''[tri:text]'' "/>

Tags undAttribute:

ELEMENT Bemerkung
NAME text| "...> verwendet wurde.

Definition einer FIELDREF - Query

In der Fieldref Query wird ein Button erzeugt, der das JavaScript setFieldRef (..) aufruft.
Dieses JavaScript setzt die Werte im FIELDREF Feld des Formulares.

SELECT o.oid AS oid,o.name, dbm.m_fieldname<br>
'setFieldRef(''_FIELDREF'',''#SYSVAR.ELEMOID#'',<br>
new Array (''' + name + ''',''' +dbm.m_fieldname + '''))'<br>
AS setButton<br>
FROM ibs_Object o,dbm_table dbm<br>
WHERE s.oid = o.oid

JavaScirpt - Aufruf setFieldRef (...)

Die JavaScript Function setFieldRef ist folgend definiert:

function setFieldRef (fieldName, oidValue, resultValues)

Parameter

fieldName
Name des HTML Feldes welches gesetzt werden soll.
Dies ist immer der Name des FIELDREF - Feldes (definiert im AttributFIELD beim Tag VALUE in der Formularvorlage) in Großbuchstaben und mit einem anführenden '_'.
zB. bei Definition:<VALUE FIELD="fieldreffeld"TYPE="FIELDREF"QUERYNAME="_query"/>muss diesem Parameter'_FIELDREFFELD'übergeben werden.

oidValue
OID des zu referenzierenden Objektes

resultValues
zusätzliche Werte die beim Fieldreffeld angezeigt werden sollen in der Reihenfolge wie im Tag FIELDS des FIELDREF - Feldes definiert.

XSLT

Das Rendering eines Felds vom Typ FIELDREF erfolgt über die beiden XSLT Templates m2Dt_fieldref_edit und m2Dt_fieldref_view.
Im Standardfall ist es ausreichend die Felder über das infoRow-Template zu renderen, welches den Aufruf intern an das entsprechende m2Dt_fieldref_*-Template weiterreicht.

Beispiel:

<xsl:call-template name="infoRow">
  <xsl:with-param name="tagName" select="'FIELDREFFELD'"/>
  <xsl:with-param name="localRow" select="'3'"/>
</xsl:call-template>

Übergabe Fieldref-spezifische Parameter

Sollen Fieldref-spezifische Parameter an das XSLT Template übergeben werden, kann das entsprechende m2Dt_fieldref_*-Template direkt aufgerufen werden.
Das folgende Beispiel zeigt z.B. den Spezialfall, in dem der ausgewählte Wert in ein anderes Feld gesetzt werden soll:

  <TR VALIGN="TOP" CLASS="infoRow2">
    <TD CLASS="name">
      <xsl:call-template name="getMultilingualText">
      <xsl:with-param name="key" select="'ML_FIELDREFFELD'"/>
      <xsl:with-param name="bundle" select="$tokenBundle"/>
    </xsl:call-template>:
  </TD>
  <TD CLASS="value">
    <xsl:call-template name="m2Dt_fieldref_edit">
      <xsl:with-param name="curTag" select="/OBJECT/VALUES/VALUE[@FIELD = 'FIELDREFFELD']"/>
      <xsl:with-param name="target" select="'_FIELDREFFELDMAIN'"/>
    </xsl:call-template>
  </TD>
</TR>

Der Parameter target definiert dabei den Feldnamen des Feldes, in welches, der vom User bei der Fieldref-Suche ausgewählte Wert, gesetzt werden soll.
Diese Funktionalität kann z.B. verwendet werden, wenn es mehrer Fieldref-Suchen gibt, welche den ermittelten Wert jedoch alle ins gleiche Feld setzen sollen.