> ## Documentation Index
> Fetch the complete documentation index at: https://dokumentation.websale.de/llms.txt
> Use this file to discover all available pages before exploring further.

# DC- (Freie Parameter und Session-Parameter)

> Die freien Variablen des Templates: einen Wert merken, darauf klammern und ihn unterwegs zuschneiden, umwandeln, codieren oder signieren.

WEBSALE-Templates kennen keine Variablen im Sinne einer Programmiersprache. Was es stattdessen gibt, sind die freien DesignControl-Parameter: benannte Ablagefächer, in die Sie einen beliebigen Wert legen, um ihn später wieder auszugeben oder darauf zu klammern.

Davon gibt es zwei Sorten, die sich in genau einem Punkt unterscheiden.

| Präfix | Lebensdauer | Wofür |
| - | - | - |
| `DC-FP` | das Template, auf dem der Wert gesetzt wird | Zwischenergebnisse innerhalb einer Seite |
| `DC-SP` | die gesamte Session | Werte, die auf Folgeseiten noch gebraucht werden |

Alles andere ist identisch. Beide verstehen dieselben Zusätze, beide werden gleich geschrieben, beide verhalten sich gleich. Diese Seite beschreibt deshalb beide zusammen und schreibt `DC-FPX` dort, wo `DC-SPX` genauso gilt.

Das `X` im Tag-Namen ist ein Platzhalter, den Sie selbst füllen. `DC-FP1`, `DC-FPfarbe` und `DC-FPmeinWert` sind drei verschiedene Parameter. Ziffern, Buchstaben und Kombinationen daraus sind erlaubt, höchstens 20 Zeichen lang.

## Das Muster in drei Schritten

Ein freier Parameter wird gesetzt, benutzt und wieder freigegeben.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_reset~                <!-- Fach leeren, falls oben schon belegt -->
~DC-FP1_set(Blau)~            <!-- Wert hineinlegen -->
~DC-FP1~                      <!-- Wert ausgeben: Blau -->

{DC-FP1(Blau)}
   Dieser Bereich erscheint, weil der Wert "Blau" ist.
{/DC-FP1(Blau)}

{!DC-FP1(Blau)}
   Dieser Bereich erscheint bei jedem anderen Wert.
{/!DC-FP1(Blau)}
```

> [!WARNING]
>
> Ein Parameter gilt erst ab der Stelle, an der er gesetzt wird. Eine Klammerung weiter oben im Quelltext sieht den Wert nicht. Das ist der häufigste Grund dafür, dass eine Abfrage "nicht funktioniert".

Der Vergleich in den Klammern achtet nicht auf Groß- und Kleinschreibung. `{DC-FP1(Blau)}` greift auch bei den Werten `blau` und `BLAU`. Dasselbe gilt für den Tag-Namen selbst und für alle Zusätze: `~DC-FP1_HexEncode~` und `~DC-FP1_hexencode~` sind dasselbe Tag.

### Klammern ohne Parameter heißt "ist gefüllt"

Lassen Sie die Klammern leer, prüft das Tag nur, ob überhaupt ein Wert gesetzt ist.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FPnaehrwerte_set($PR-Brennwert$)~

{DC-FPnaehrwerte}
   <!-- erscheint, sobald irgendein nicht leerer Wert gesetzt ist -->
{/DC-FPnaehrwerte}
```

Das ist der übliche Weg, mehrere Bedingungen zu einem Schalter zusammenzufassen: An mehreren Stellen dasselbe Tag setzen, danach einmal darauf klammern.

## Das vollständige Beispiel

Eine Nährwerttabelle soll nur dann erscheinen, wenn mindestens eines von vier selbstdefinierten Produktdatenfeldern gefüllt ist. Die Abfrage muss den ganzen Block umschließen, der Schalter wird deshalb vorher gesetzt.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FPnaehrwerte_reset~

{PR-Brennwert}~DC-FPnaehrwerte_set(ja)~{/PR-Brennwert}
{PR-Fett}~DC-FPnaehrwerte_set(ja)~{/PR-Fett}
{PR-Kohlenhydrate}~DC-FPnaehrwerte_set(ja)~{/PR-Kohlenhydrate}
{PR-Eiweiss}~DC-FPnaehrwerte_set(ja)~{/PR-Eiweiss}

{DC-FPnaehrwerte(ja)}
   <h2>Nährwertangaben je 100 g</h2>
   <table>
      {PR-Brennwert}
      <tr><td>Brennwert in kcal</td><td>~PR-Brennwert~</td></tr>
      {/PR-Brennwert}
      {PR-Fett}
      <tr><td>Fett</td><td>~PR-Fett~</td></tr>
      {/PR-Fett}
      {PR-Kohlenhydrate}
      <tr><td>Kohlenhydrate</td><td>~PR-Kohlenhydrate~</td></tr>
      {/PR-Kohlenhydrate}
      {PR-Eiweiss}
      <tr><td>Eiweiß</td><td>~PR-Eiweiss~</td></tr>
      {/PR-Eiweiss}
   </table>
{/DC-FPnaehrwerte(ja)}
```

## FP oder SP

Nehmen Sie `DC-FP`, solange der Wert die Seite nicht verlässt. Das ist der Normalfall.

`DC-SP` brauchen Sie, wenn der Wert auf einer Folgeseite noch da sein muss, beispielsweise eine Auswahl, die der Käufer auf der Produktseite trifft und die im Warenkorb noch gelten soll.

> [!WARNING]
>
> Der Unterschied kehrt sich beim Zurücksetzen um. Ein `DC-FP` verschwindet mit dem Template von selbst, ein zweites Template beginnt wieder mit leerem Fach. Ein `DC-SP` bleibt die ganze Session über gesetzt. Wollen Sie ihm auf einer anderen Seite einen neuen Wert geben, müssen Sie ihn dort erst mit `~DC-SPX_reset~` leeren.

Für die Anzahl der `DC-SP`-Parameter gibt es eine konfigurierbare Obergrenze. Wird sie überschritten, legt der Shop keinen weiteren Parameter mehr an, schreibt einen kritischen Fehler ins Protokoll und das Tag bleibt wirkungslos. Für `DC-FP` gilt diese Grenze nicht.

## Die Ausgabe ist HTML-codiert

Jeder freie Parameter wird bei der Ausgabe HTML-codiert. Setzen Sie `~DC-FP1_set(&)~`, erscheint in der Seite `&#38;`.

> [!WARNING]
>
> Bei Domains, URLs und allem, was in ein `href`-Attribut oder in JavaScript soll, führt das zu Überraschungen. Der Schutz ist gewollt: Er verhindert, dass fremde Eingaben als HTML ausgeführt werden.

Nur wenn Sie den Wert wirklich unverändert brauchen und selbst sicherstellen, dass er unbedenklich ist, heben Sie die Codierung für genau eine Ausgabe auf.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~WS-DisableXSSProtectionOnce~~DC-FP1~
```

Referenz: [WS-DisableXSSProtectionOnce](https://dokumentation.websale.de/v8s/referenz/tags/ws/shop-seite-und-technik.md#die-tags-im-uberblick)

## Werte aus anderen Tags übernehmen

`DC-FPX_set()` nimmt nicht nur festen Text, sondern auch das Ergebnis eines anderen Einzel-Tags. Dafür ersetzen Sie dessen Tilden durch Dollarzeichen.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP2_set($PR-Name$)~
~DC-FP2~
```

Auch der Name des Parameters darf aus einem Tag kommen.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP$WS-OTP1$_set(wert)~
```

> [!WARNING]
>
> Ein so gebildeter Name lässt sich nicht auf demselben Weg wieder auslesen. `~DC-SPvar_set($DC-FP$WS-OTP1$$)~` funktioniert nicht, weil die verschachtelten Dollarzeichen nicht auflösbar sind. Dafür gibt es die vier Touched-Tags weiter unten.

## Die Zusätze

Alle Zusätze arbeiten auf dem Wert, der gerade im Parameter liegt. Entscheidend ist dabei, ob ein Zusatz den gespeicherten Wert **verändert** oder ihn nur in veränderter Form **ausgibt**.

| Verhalten | Zusätze |
| - | - |
| verändern den gespeicherten Wert | `_set()`, `_reset`, `_append()`, `_replace()`, `_slice()`, `_truncate()`, `_extractTaggedData()`, `_convertToEncoding()`, `_touppercase`, `_tolowercase` |
| geben aus, ohne den Wert zu ändern | `_length`, `_IndexOf()`, `_RIndexOf()`, `_urlencoding`, `_urldecoding`, `_base64encoding`, `_base64decoding`, `_HexEncode`, `_HexDecode`, `_jsonencoding`, `_linknameencoding`, `_encodeISO2HTML`, `_StripHTML`, `_encrypt()`, `_hash()` |
| prüfen oder merken vor | `_contains()`, `_verifyChecksum()`, `_touch` |

Diese Unterscheidung erspart die meisten Fehlersuchen. `~DC-FP1_touppercase~` gibt nichts aus, sondern macht den gespeicherten Wert groß. Erst das nachfolgende `~DC-FP1~` zeigt ihn an. Umgekehrt lässt `~DC-FP1_base64encoding~` den Wert unangetastet und gibt nur die codierte Fassung aus.

### Den Wert verändern

#### \_set()

Legt den Wert ab. Ein vorhandener Wert wird ersetzt.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set(Blau)~
~DC-FP2_set($PR-Name$)~
```

#### \_reset

Leert das Fach. Danach kann derselbe Parameter neu gesetzt werden.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set(Blau)~
~DC-FP1~            <!-- Blau -->
~DC-FP1_reset~
~DC-FP1_set(Rot)~
~DC-FP1~            <!-- Rot -->
```

`_reset` wird ohne Klammern geschrieben.

#### \_append()

Hängt an den vorhandenen Wert an. Das ist der Weg um die 128-Zeichen-Grenze herum, die für jedes WEBSALE-Tag gilt.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_reset~
~DC-FP1_append(IPPME14135_DEAA,IPPME14135_DENA,)~
~DC-FP1_append(IPPME14135_EUAA,IPPME14135_EUNA,)~
~DC-FP1_append(IPPME14135_CHAA,IPPME14135_CHNA)~

{DC-CompareStringInList($BASKET-PR-Number$,"$DC-FP1$")}
   Sonderhinweis für diese Artikelnummern
{/DC-CompareStringInList($BASKET-PR-Number$,"$DC-FP1$")}
```

> [!WARNING]
>
> Wird ein Tag länger als 128 Zeichen, verarbeitet der Shop es nicht mehr, sondern gibt den Tag-Namen im Klartext aus. Eine lange Liste gehört deshalb stückweise in einen Parameter und von dort als Tag-in-Tag in das eigentliche Tag.

#### \_replace()

Sucht und ersetzt. Zwei kommagetrennte Argumente: erst die gesuchte Zeichenkette, dann ihr Ersatz. Bleibt das zweite Argument leer, wird gelöscht.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set(wort1 wort2 wort3 wort1)~
~DC-FP1_replace(wort2,wort5)~
~DC-FP1~                             <!-- wort1 wort5 wort3 wort1 -->

~DC-FP2_set(wort1 wort2 wort3 wort1)~
~DC-FP2_replace(wort1,)~
~DC-FP2~                             <!-- wort2 wort3 -->
```

Sonderzeichen, die der Parser selbst benutzt, gehören in Anführungszeichen.

| Aufgabe | Schreibweise |
| - | - |
| Komma durch Punkt ersetzen | `~DC-FP1_replace(",",.)~` |
| doppelte durch einfache Anführungszeichen | `~DC-FP1_replace("""," ' ")~` |
| Umlaut umschreiben | `~DC-FP1_replace(ä,ae)~` |

> [!WARNING]
>
> Das Komma trennt die beiden Argumente. Ein Komma, das gesucht oder eingesetzt werden soll, muss deshalb in Anführungszeichen stehen, sonst liest der Shop drei Argumente und verwirft das Tag.

#### \_slice()

Schneidet einen Ausschnitt heraus. Gezählt wird ab 0, die erste Zahl gehört dazu, die zweite nicht mehr. Fehlt die zweite Zahl, geht der Schnitt bis zum Ende.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set(SCHALTER)~
~DC-FP1_slice(2,6)~      <!-- DC-FP1 enthält jetzt HALT -->

~DC-FP2_set(SCHALTER)~
~DC-FP2_slice(3)~        <!-- DC-FP2 enthält jetzt ALTER -->
```

Beide Argumente sind Tag-in-Tag-fähig.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FPvon_set(0)~
~DC-FPbis_set(5)~
~DC-FP1_slice($DC-FPvon$,$DC-FPbis$)~
```

#### \_truncate()

Kürzt nach der angegebenen Zeichenzahl.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set(abcdefg)~
~DC-FP1_truncate(3)~
~DC-FP1~                <!-- abc -->
```

#### \_extractTaggedData()

Schneidet heraus, was zwischen zwei Markierungen steht. Beide Argumente sind Tag-in-Tag-fähig.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set(<a>Inhalt A</a><b>Inhalt B</b>)~
~DC-FP1_extractTaggedData(<a>,</a>)~
~DC-FP1~                                      <!-- Inhalt A -->
```

#### \_convertToEncoding()

Wandelt den Zeichensatz. Erst der Ausgangs-, dann der Zielzeichensatz. Nützlich, wenn Daten an ein Fremdsystem gehen, das einen anderen Zeichensatz erwartet.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set($A-FirstName$)~
~DC-FP1~ ~DC-FP1_urlencoding~                   <!-- Jörg   J%f6rg -->

~DC-FP1_convertToEncoding($WS-Charset$,UTF-8)~
~DC-FP1~ ~DC-FP1_urlencoding~                   <!-- JÃ¶rg   J%c3%b6rg -->
```

#### \_touppercase und \_tolowercase

Wandeln den gespeicherten Wert in Groß- beziehungsweise Kleinbuchstaben. Beide geben selbst nichts aus.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set(Blau)~
~DC-FP1_touppercase~
~DC-FP1~               <!-- BLAU -->
```

### Den Wert ausgeben

#### \_length

Gibt die Zeichenzahl aus.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set(abcdefg)~
~DC-FP1_length~        <!-- 7 -->
```

#### \_IndexOf() und \_RIndexOf()

Geben die Position einer Zeichenkette aus, `_IndexOf()` die des ersten, `_RIndexOf()` die des letzten Vorkommens. Gezählt wird ab 0, nicht gefunden ergibt -1.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set(sometext)~
~DC-FP1_IndexOf(t)~      <!-- 4 -->
~DC-FP1_RIndexOf(t)~     <!-- 7 -->
~DC-FP1_IndexOf(z)~      <!-- -1 -->
```

Beide lassen sich auch klammern. Der positive Bereich erscheint, wenn die Zeichenkette gefunden wurde.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{!DC-FP1_IndexOf(y)}
   Kein y enthalten.
{/!DC-FP1_IndexOf(y)}
```

#### Codierungen

Sieben Zusätze geben den Wert in einer anderen Codierung aus, ohne ihn zu verändern.

| Zusatz | Ausgabe |
| - | - |
| `_urlencoding` | für die Verwendung als Wert in einer URL |
| `_urldecoding` | URL-Codierung wieder aufgelöst |
| `_base64encoding` | Base64 |
| `_base64decoding` | Base64 wieder aufgelöst |
| `_HexEncode` | hexadezimal |
| `_HexDecode` | hexadezimal wieder aufgelöst |
| `_jsonencoding` | nach UTF-8 gewandelt und als JSON-Zeichenkette sicher codiert |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set($A-Street1$)~
<a href="https://transportunternehmen.example/?street=~DC-FP1_urlencoding~">Zum Retourenformular</a>
<!-- ergibt bei "An den Rampen 23": ...?street=An%20den%20Rampen%2023 -->
```

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set($BASKET-PR-Name$)~
"Name": "~DC-FP1_jsonencoding~"
```

#### \_linknameencoding

Gibt den Wert nach den Regeln aus, die Sie im Abschnitt `<LinkNameEncoding>` der Shopkonfiguration `shop.config` für den sprechenden Teil Ihrer URLs festgelegt haben.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set($CAT-RobotName$)~
~URL-Homepage~/~DC-FP1_linknameencoding~?websale8=~WS-ShopID~.~WS-SubShopID~&ci=~CAT-Index~
```

Referenz: Abschnitt `<[LinkNameEncoding](/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/grundlagen-und-technik#linknameencoding)>`

#### \_encodeISO2HTML

Gibt alle Zeichen außerhalb von ASCII als dezimale HTML-Entität aus.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set(testü)~
~DC-FP1_encodeISO2HTML~   <!-- test&#252; -->
```

#### \_StripHTML

Gibt den Wert ohne HTML-Auszeichnung und ohne Anführungszeichen aus. Gedacht für Felder, die reinen Text verlangen, beispielsweise eine Meta-Beschreibung.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FPbeschreibung_set($PR-Description$)~
<meta name="description" content="~DC-FPbeschreibung_StripHTML~">
```

Der gespeicherte Wert bleibt dabei unverändert. Ein späteres `~DC-FPbeschreibung~` gibt wieder die Fassung mit HTML aus.

#### \_encrypt() und \_hash()

Geben den Wert verschlüsselt beziehungsweise als Prüfsumme aus, damit er gesichert an ein Fremdsystem übergeben werden kann. Der gespeicherte Wert bleibt unverändert.

`_encrypt()` erwartet zwei Argumente, optional ein drittes.

| Argument | Werte |
| - | - |
| Verfahren | `blowfish` |
| Ausgabecodierung | `b64` oder `hex` |
| ID des Konfigurationseintrags (optional) | ein Eintrag aus dem Abschnitt `<DesignControl>` der `shop.config` |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_encrypt(blowfish,hex)~
~DC-FP1_encrypt(blowfish,b64,meinPartner)~
```

`_hash()` erwartet drei Argumente, optional ein viertes.

| Argument | Werte |
| - | - |
| Algorithmus | `SHA256` oder `SHA512` |
| Ausgabecodierung | `b64` oder `hex` |
| ID des Konfigurationseintrags | ein Eintrag aus dem Abschnitt `<DesignControl>` der `shop.config` |
| Länge (optional) | schneidet die Ausgabe nach so vielen Zeichen ab |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP2_hash(sha256,hex,uploadlink,16)~
```

Gehasht wird der Inhalt des Parameters mit angehängtem Geheimnis aus der Konfiguration. Das Ergebnis wird codiert und ausgegeben.

> [!WARNING]
>
> Ohne dritten Parameter greift `_encrypt()` auf `DCFPXEncryptBlowfishPW` aus dem Abschnitt `<Basic>` zurück. Dieser Eintrag ist veraltet. Legen Sie neue Verschlüsselungen immer mit einer eigenen ID im Abschnitt `<DesignControl>` an.

Referenz: Abschnitt `<[DesignControl](/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/grundlagen-und-technik#designcontrol)>`

### Prüfen

#### \_contains()

Greift, wenn die angegebene Zeichenkette irgendwo im Wert vorkommt. Anders als `DC-CompareStringInList()` wird kein vollständiger Treffer verlangt. Groß- und Kleinschreibung spielt keine Rolle.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP5_set($CAT-Name$)~

{DC-FP5_contains(hemd)}
   <!-- greift bei "Langarm-Hemden", "sportliche Hemden", "Kurzarmhemd" -->
{/DC-FP5_contains(hemd)}

{!DC-FP5_contains(hemd)}
   <!-- alle übrigen Kategorien -->
{/!DC-FP5_contains(hemd)}
```

Damit lässt sich eine Kategoriegruppe über ihren Namen ansprechen, statt Kategorie-Indizes von Hand zu pflegen. Kommt eine neue Hemden-Kategorie dazu, greift die Klammerung ohne Änderung am Template.

#### \_verifyChecksum()

Prüft die Prüfsumme einer Rechnungs- oder Adressnummer der Warenwirtschaft von D\&G. Das Argument ist `DuG-AdrNr` oder `DuG-ReNr`.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FPorderNumber_set($WS-OTPorder$)~
~DC-FPuserNumber_set($WS-OTPnumber$)~

{DC-FPorderNumber_verifyChecksum(DuG-ReNr)}
   {DC-FPuserNumber_verifyChecksum(DuG-AdrNr)}
      <!-- beide Nummern sind plausibel -->
   {/DC-FPuserNumber_verifyChecksum(DuG-AdrNr)}
{/DC-FPorderNumber_verifyChecksum(DuG-ReNr)}
```

> [!WARNING]
>
> Geprüft wird nur die Prüfziffer, nicht die Existenz des Vorgangs. Das Tag ersetzt keine Anmeldung und keine Berechtigungsprüfung.

Wegweiser: [Bestelldetails anzeigen ohne Login](https://dokumentation.websale.de/v8s/weitere-funktionen-im-bestellprozess-kontext/bestelldetails-anzeigen-ohne-login.md)

## Namen und Werte weiterreichen

Ein Parameter, dessen Name selbst aus einem Tag stammt, lässt sich nicht direkt auslesen. Dafür gibt es `_touch` und die drei zugehörigen Abruf-Tags: `_touch` merkt sich Name und Wert des zuletzt angesprochenen Parameters, danach holen Sie beides einzeln ab.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP$WS-OTP1$_set(wert)~                 <!-- bei Aufruf mit &otp1=123 entsteht DC-FP123 -->
~DC-FP$WS-OTP1$_touch~                     <!-- merkt Name und Wert, gibt nichts aus -->

~DC-SPkey_set($DC-FP_lastKeyTouched$)~     <!-- DC-SPkey enthält nun 123 -->
~DC-SPval_set($DC-FP_lastValueTouched$)~   <!-- DC-SPval enthält nun wert -->
```

Zwei weitere Tags halten das jüngste Suchergebnis fest.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-FP1_set(randomtext)~
~DC-FP1_IndexOf(r)~         <!-- 0 -->
~DC-FP1_IndexOf(n)~         <!-- 2 -->
~DC-FP_lastIndexOfTouched~  <!-- 2 -->
```

| Tag | Liefert |
| - | - |
| `DC-FP_lastKeyTouched` | den Namen des zuletzt berührten Parameters |
| `DC-FP_lastValueTouched` | dessen Wert |
| `DC-FP_lastIndexOfTouched` | das letzte Ergebnis von `_IndexOf()` |
| `DC-FP_lastRIndexOfTouched` | das letzte Ergebnis von `_RIndexOf()` |

Die vier Tags gibt es für beide Sorten getrennt: `DC-FP_lastKeyTouched` und `DC-SP_lastKeyTouched` führen eigene Merker. Ein `_touch` auf einem `DC-FP` verändert den Merker der `DC-SP`-Seite nicht.

## Grenzen

| Grenze | Wert |
| - | - |
| Länge des Tag-Namens | 20 Zeichen |
| Länge eines WEBSALE-Tags im Quelltext | 128 Zeichen, zu umgehen mit `_append()` |
| Anzahl der `DC-SP`-Parameter | in der Shopkonfiguration einstellbar |

> [!WARNING]
>
> Wird die Obergrenze für `DC-SP`-Parameter erreicht, legt der Shop keinen weiteren an. Das Tag bleibt dann wirkungslos, und im Protokoll steht ein kritischer Fehler mit der erreichten Anzahl. Fällt eine Auswahl auf Folgeseiten plötzlich weg, lohnt der Blick ins Protokoll.

## Tags anderer Präfixe

| Tag | Zweck | Präfix |
| - | - | - |
| `WS-DisableXSSProtectionOnce` | hebt die HTML-Codierung für die nächste Ausgabe auf | WS- |
| `WS-F…` | freie Parameter, die als URL-Parameter an den Shop-Aufruf übergeben werden | WS- |
| `WS-OTP1…` | Einmal-Parameter aus der aufgerufenen Adresse | WS- |
| `DC-CompareStringInList()` | vergleicht einen Wert mit einer Liste vollständiger Treffer | DC- |

## Die Tags im Überblick

Die Tabelle gilt für `DC-FPX` und `DC-SPX` gleichermaßen.

| Tag | Einzel-Tag | Bereichs-Tag | negatives Bereichs-Tag | Schleifen-Tag |
| - | - | - | - | - |
| `DC-FPX` | ja | ja | ja | – |
| `DC-FPX_set()` | ja | – | – | – |
| `DC-FPX_reset` | ja | – | – | – |
| `DC-FPX_append()` | ja | – | – | – |
| `DC-FPX_touch` | ja | – | – | – |
| `DC-FPX_replace()` | ja | – | – | – |
| `DC-FPX_slice()` | ja | – | – | – |
| `DC-FPX_truncate()` | ja | – | – | – |
| `DC-FPX_extractTaggedData()` | ja | – | – | – |
| `DC-FPX_convertToEncoding()` | ja | – | – | – |
| `DC-FPX_touppercase` | ja | – | – | – |
| `DC-FPX_tolowercase` | ja | – | – | – |
| `DC-FPX_length` | ja | – | – | – |
| `DC-FPX_IndexOf()` | ja | ja | ja | – |
| `DC-FPX_RIndexOf()` | ja | ja | ja | – |
| `DC-FPX_urlencoding` | ja | – | – | – |
| `DC-FPX_urldecoding` | ja | – | – | – |
| `DC-FPX_base64encoding` | ja | – | – | – |
| `DC-FPX_base64decoding` | ja | – | – | – |
| `DC-FPX_HexEncode` | ja | – | – | – |
| `DC-FPX_HexDecode` | ja | – | – | – |
| `DC-FPX_jsonencoding` | ja | – | – | – |
| `DC-FPX_linknameencoding` | ja | – | – | – |
| `DC-FPX_encodeISO2HTML` | ja | – | – | – |
| `DC-FPX_StripHTML` | ja | – | – | – |
| `DC-FPX_encrypt()` | ja | – | – | – |
| `DC-FPX_hash()` | ja | – | – | – |
| `DC-FPX_contains()` | – | ja | ja | – |
| `DC-FPX_verifyChecksum()` | – | ja | ja | – |
| `DC-FP_lastKeyTouched` | ja | ja | ja | – |
| `DC-FP_lastValueTouched` | ja | ja | ja | – |
| `DC-FP_lastIndexOfTouched` | ja | ja | ja | – |
| `DC-FP_lastRIndexOfTouched` | ja | ja | ja | – |

Zulässig sind alle Tags auf allen Templates.

Für `DC-SP` gibt es dieselben Zusätze wie für `DC-FP`: `_jsonencoding`, `_length`, `_tolowercase`, `_touppercase`, `_urldecoding` und `_verifyChecksum`. Im Shop verarbeitet dieselbe Programmstelle beide Präfixe, alle Zusätze stehen deshalb für `DC-SP` genauso zur Verfügung.

## Verwandte Themen

* Wegweiser: [Freie Parameter verwenden](https://dokumentation.websale.de/v8s/fortgeschrittene-designtechniken/freie-parameter-tags-verwenden.md)
* Referenz: [DC- (Zähler und Rechnen)](https://dokumentation.websale.de/v8s/referenz/tags/dc/rechnen.md)
* Referenz: [DC- (Schleifen)](https://dokumentation.websale.de/v8s/referenz/tags/dc/schleifen.md)
* Referenz: [DC- (Vergleiche und weitere Tags)](https://dokumentation.websale.de/v8s/referenz/tags/dc/vergleiche.md)
* Grundlagen: [Grundlagen zu Tags](https://dokumentation.websale.de/v8s/grundlagen-zu-tags.md)


## Related topics

- [DC- (Datum und Zeit)](https://dokumentation.websale.de/v8s/referenz/tags/dc/datum-und-zeit.md)
- [DC- (Cookie-Daten)](https://dokumentation.websale.de/v8s/referenz/tags/dc/cookie-daten.md)
- [DC- (Vergleiche und weitere Tags)](https://dokumentation.websale.de/v8s/referenz/tags/dc/vergleiche.md)
- [EJD- (JSON-Schnittstelle)](https://dokumentation.websale.de/v8s/referenz/tags/ejd.md)
- [WS-DataFlowManager: Tag-Referenz](https://dokumentation.websale.de/v8s/schnittstellen/marketing-seo-und-portale/ws-dataflowmanager/tag-referenz.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.