> ## 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.

# OH- (Bestellhistorie)

> Eine gespeicherte Bestellung im Template auslesen: durch die Sektionen des Bestelldatensatzes navigieren, Parameter als Anzeigewert, Anzeigename oder technischen Wert ausgeben und über Positionen schleifen.

Die Bestellhistorie zeigt dem angemeldeten Käufer seine früheren Bestellungen. Anders als im Warenkorb stehen die Daten dafür nicht als einzelne Tags bereit, sondern als abgelegter Bestelldatensatz. Dieser Datensatz hat keine feste Tag-Liste, sondern einen Aufbau aus Sektionen und Parametern, der sich mit den Funktionen des Shops erweitert.

Deshalb gibt es für die Bestellhistorie keine Tags mit festen Namen, sondern zwei Bauformen. `OH-S-` navigiert durch die Sektionen, `OH-P-` holt einen Parameter aus der gerade erreichten Sektion. In beide setzen Sie die technische ID aus dem Bestelldatensatz ein.

Wegweiser: [Bestellhistorie integrieren](https://dokumentation.websale.de/v8s/kundenkonto/bestellhistorie-integrieren.md) · Materialien: [Übersicht Bestelldaten](https://dokumentation.websale.de/v8s/materialien/uebersicht-bestelldaten.md)

## Wie der Bestelldatensatz aufgebaut ist

Ein Bestelldatensatz ist eine verschachtelte Struktur. Sektionen enthalten Parameter und weitere Sektionen, Parameter enthalten Werte. Die Positionen einer Bestellung liegen beispielsweise als mehrere gleichnamige Sektionen `Item` innerhalb der Sektion `OrderList`.

```text theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
Order
   Total          = 119.00
   DeliveryCost   = 4.90
OrderList
   Item
      Name        = Schreibtischlampe
      Quantity    = 2
   Item
      Name        = Leuchtmittel
      Quantity    = 1
CustomerAddress
   Country        = DEU
   Country_DName  = Land
   Country_DValue = Deutschland
```

Im Template arbeiten Sie sich von der obersten Ebene aus nach unten. Jede Klammerung `{OH-S-…}` steigt eine Ebene tiefer, das zugehörige Endetag steigt wieder herauf. Welche Sektionen und Parameter es gibt, steht in der Übersicht der Bestelldaten.

An den drei `Country`-Zeilen des Beispiels sehen Sie das Grundmuster der Parameter. Zum technischen Parameter `Country` mit dem Wert `DEU` kann es einen Parameter `Country_DName` mit der Feldbezeichnung und einen Parameter `Country_DValue` mit dem lesbaren Wert geben. Die drei Tag-Formen weiter unten greifen genau auf diese drei Zeilen zu.

## Durch die Sektionen navigieren

`OH-S-` gibt es in drei Formen, und sie tun drei verschiedene Dinge.

| Form | Wirkung |
| - | - |
| `{OH-S-Item}` | greift, wenn es eine Untersektion `Item` gibt, und **steigt in die erste hinein** |
| `{!OH-S-Item}` | greift, wenn es **keine** Untersektion `Item` gibt, und steigt nicht hinein |
| `{@OH-S-Item}` | läuft über alle Untersektionen `Item` |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{OH-S-OrderList}
   {OH-S-Item}
      {@OH-S-Item}
         <tr>
            <td>~OH-P-Name~</td>
            <td>~OH-P-Quantity~</td>
            <td>~OH-P-Total~</td>
         </tr>
      {/@OH-S-Item}
   {/OH-S-Item}
{/OH-S-OrderList}
```

Die doppelte Klammerung um die Schleife sieht umständlich aus, ist aber notwendig. Die Schleife zählt die Untersektionen der **Elternsektion** ab. Erst die positive Klammerung darüber stellt die Position auf die `Item`-Ebene, von der aus die Schleife arbeiten kann.

> [!WARNING]
>
> Als Einzel-Tag gilt `OH-S-` nicht. `~OH-S-Item~` ist ein ungültiges Tag. Die beiden Ausnahmen sind `OH-S-LoopCounter` und `OH-S-RawData`, die weiter unten beschrieben sind.

Die Sektion `CreditCard` ist im Template gesperrt. `{OH-S-CreditCard}` gilt in jeder Form als ungültiges Tag, damit Kreditkartendaten nicht versehentlich auf einer Seite landen. An die Zahlungsart kommen Sie über die Parameter der Sektion `Order`.

## Werte ausgeben

Innerhalb einer Sektion holt `OH-P-` einen Parameter. Welche der drei Zeilen aus dem Grundmuster Sie bekommen, entscheidet das Suffix.

| Tag | Liefert |
| - | - |
| `OH-P-Country` | den lesbaren Wert aus `Country_DValue`, ersatzweise den Wert von `Country` |
| `OH-P-Country_text` | die Feldbezeichnung aus `Country_DName`, ersatzweise die technische ID selbst |
| `OH-P-Country_rawdata` | den technischen Wert von `Country`, ohne Ersatz |
| `OH-P-Country_noencode` | wie `OH-P-Country`, aber ohne HTML-Kodierung der Ausgabe |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{OH-S-CustomerAddress}
   ~OH-P-Country_text~: ~OH-P-Country~
{/OH-S-CustomerAddress}
```

Im Beispieldatensatz von oben gibt das `Land: Deutschland` aus, während `~OH-P-Country_rawdata~` den Wert `DEU` liefert.

Es gibt denselben Wert aus wie `OH-P-Country`, lässt die HTML-Kodierung aber weg. Das brauchen Sie, wenn im Bestelldatensatz bereits fertiges Markup steht. Alle anderen Formen kodieren, und dabei sollten Sie es auch belassen, weil der Datensatz Eingaben des Käufers enthalten kann.

Alle `OH-P-`Formen arbeiten auch als Klammerung und greifen, wenn der Parameter vorhanden ist und einen Wert hat. Damit blenden Sie ganze Zeilen aus, die für diese Bestellung nicht gefüllt sind, ohne den Inhalt zu kennen.

### Auf einen bestimmten Wert prüfen

Der Klammerung können Sie einen Vergleichswert als Argument mitgeben. Sie greift dann nur, wenn der Parameter genau diesen Wert hat.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{OH-S-Order}
   {OH-P-TotalDiscount}
      {!OH-P-TotalDiscount_rawdata(0.00)}
         Rabatt: ~OH-P-TotalDiscount~
      {/!OH-P-TotalDiscount_rawdata(0.00)}
   {/OH-P-TotalDiscount}
{/OH-S-Order}
```

Die äußere Klammerung prüft, ob der Parameter überhaupt vorhanden ist. Die innere, negative Klammerung blendet die Zeile aus, wenn der Rabatt null beträgt. Vergleichen Sie dabei immer gegen `_rawdata`, denn dort steht der unformatierte Wert, der sich zuverlässig vergleichen lässt.

> [!WARNING]
>
> Das Argument wirkt nur bei `OH-P-…` und `OH-P-…_rawdata`. Bei `OH-P-…_text` wertet das Shopsystem es **nicht** aus. `{OH-P-Country_text(Land)}` greift deshalb immer dann, wenn eine Feldbezeichnung vorhanden ist, unabhängig vom Argument.

Der Vergleich unterscheidet nicht zwischen Groß- und Kleinschreibung. Das gilt auch für die technischen IDs in den Tag-Namen selbst.

Beim Einzel-Tag hat ein Argument keine Wirkung. `~OH-P-Country(DEU)~` gibt denselben Wert aus wie `~OH-P-Country~`.

## Die Position in einer Schleife

`OH-S-LoopCounter` gibt aus, beim wievielten Durchlauf die Schleife gerade ist. Es ist ausschließlich ein Einzel-Tag.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{@OH-S-Item}
   <tr class="zeile~OH-S-LoopCounter(2)~">
      <td>~OH-S-LoopCounter~</td>
      <td>~OH-P-Name~</td>
   </tr>
{/@OH-S-Item}
```

Das erste Argument ist ein Modulo-Wert und eignet sich für abwechselnde Zeilenfarben. Die Rechnung ist dabei so abgewandelt, dass nie null herauskommt, sondern immer eine Zahl zwischen eins und dem Argument.

| Position | `LoopCounter(3)` |
| - | - |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 1 |
| 27 | 3 |

Materialien: [Modulo-Rechnung](https://dokumentation.websale.de/v8s/materialien/materialien-modulo-rechnung.md)

Das zweite Argument ist die Zahl der Ebenen, die vom aktuellen Punkt aus nach oben gegangen wird. Damit greifen Sie in einer verschachtelten Schleife auf die Position der äußeren zu.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{@OH-S-OrderList}
   {@OH-S-Item}
      ~OH-S-LoopCounter~        <!-- Position in der inneren Schleife -->
      ~OH-S-LoopCounter(0,1)~   <!-- Position in der äußeren Schleife -->
   {/@OH-S-Item}
{/@OH-S-OrderList}
```

Wollen Sie nur das zweite Argument nutzen, setzen Sie an die erste Stelle eine Null. Der Modulo-Wert null schaltet die Modulo-Rechnung ab.

Steht das Tag an einer Stelle, an der gerade keine Schleife läuft, gibt es nichts aus. Ein Fehler ist das nicht, Sie sehen an dieser Stelle einfach eine Lücke.

## Sektionen, die nur Text enthalten

Manche Sektionen des Bestelldatensatzes führen keine Parameter, sondern einen zusammenhängenden Text. Der Kommentar des Käufers ist der häufigste Fall. `OH-S-RawData` holt diesen Text.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{OH-S-CustomerComment}
   {OH-S-RawData}
      <p class="kommentar">~OH-S-RawData~</p>
   {/OH-S-RawData}
{/OH-S-CustomerComment}
```

`OH-S-RawData` bezieht sich immer auf die gerade erreichte Sektion und wird deshalb nicht mit einer technischen ID ergänzt. Die Klammerung greift nur, wenn die Sektion tatsächlich eine Textsektion ist und Text enthält. In einer Sektion mit Parametern gilt das Tag als ungültig.

## Wo die Tags gelten

Die `OH-`Tags arbeiten auf dem Template der Bestellhistorie, hinterlegt in der Shopkonfiguration `shop.config` im Abschnitt `<Templates>` unter `OrderHistory`, üblicherweise `ws_order_history.htm`.

Sie arbeiten zusätzlich innerhalb der Schleife über die eigene Bestellliste. Dort beziehen sie sich jeweils auf die Bestellung des aktuellen Durchlaufs, sodass Sie mehrere Bestellungen untereinander ausgeben können, ohne die Seite zu wechseln.

Die Tags, die die Bestellliste und den Einstieg in eine einzelne Bestellung liefern, stehen bei WS- (Allgemeine Tags).

## Die Tags im Überblick

| Tag | Einzel-Tag | Bereichs-Tag | negatives Bereichs-Tag | Schleifen-Tag |
| - | - | - | - | - |
| `OH-S-<technische ID>` | – | ja | ja | ja |
| `OH-S-LoopCounter(<Modulo>,<Ebenen>)` | ja | – | – | – |
| `OH-S-RawData` | ja | ja | ja | – |
| `OH-P-<technische ID>` | ja | ja | ja | – |
| `OH-P-<technische ID>_text` | ja | ja | ja | – |
| `OH-P-<technische ID>_rawdata` | ja | ja | ja | – |
| `OH-P-<technische ID>_noencode` | ja | ja | ja | – |

## Verwandte Themen

* Wegweiser: [Bestellhistorie integrieren](https://dokumentation.websale.de/v8s/kundenkonto/bestellhistorie-integrieren.md)
* Materialien: [Übersicht Bestelldaten](https://dokumentation.websale.de/v8s/materialien/uebersicht-bestelldaten.md)
* Materialien: Modulo-Rechnung
* Referenz: [WS- (Allgemeine Tags)](https://dokumentation.websale.de/v8s/referenz/tags/ws/shop-seite-und-technik.md)


## Related topics

- [Bestellhistorie integrieren](https://dokumentation.websale.de/v8s/kundenkonto/bestellhistorie-integrieren.md)
- [Freie Produktfelder im Warenkorb anzeigen](https://dokumentation.websale.de/v8s/warenkorb/freie-produktfelder-im-warenkorb-anzeigen.md)
- [WS-SOAP-InfoMails](https://dokumentation.websale.de/v8s/schnittstellen/service-und-app/ws-soap-infomails.md)
- [Suche, Listen und Blättern](https://dokumentation.websale.de/v8s/referenz/tags/ws/suche-listen-und-blaettern.md)
- [Kaufgutscheine zum Ausdrucken](https://dokumentation.websale.de/v8s/gutscheine-anbieten/kaufgutscheine-zum-ausdrucken.md)


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