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

# Zähler und Vergleiche im Template

> Bereiche abhängig von Zählerständen und Zeichenketten ein- und ausblenden und Elemente in Schleifen eindeutig durchnummerieren.

Ein Template gibt nicht immer dasselbe aus. Drei Werkzeuge helfen dabei, die Ausgabe von Bedingungen abhängig zu machen oder sie innerhalb einer Schleife zu variieren.

| Werkzeug | Wofür |
| - | - |
| `DC-Counter1` bis `DC-Counter3` | Bereiche nur dann zeigen, wenn vorher etwas anderes **nicht** gezeigt wurde |
| `WS-Counter` und `WS-Counter2` | Elemente in einer Schleife durchnummerieren, für eindeutige IDs oder wechselnde Klassen |
| `DC-CompareStringInList` | Bereiche abhängig davon zeigen, ob ein Wert in einer Liste vorkommt |

Die beiden Zählerfamilien unterscheiden sich grundlegend: Die DesignControl-Zähler setzen Sie selbst zurück und erhöhen sie gezielt, um damit Bedingungen zu bauen. Die WS-Zähler laufen nur vorwärts und dienen der Nummerierung.

## Bereiche abhängig von Zählerständen anzeigen

Die DesignControl-Zähler `DC-Counter1` bis `DC-Counter3` stehen bei jedem Seitenaufruf auf 0. Sie lassen sich beliebig oft erhöhen und zurücksetzen. Geprüft wird der Stand mit dem gleichnamigen Bereichs-Tag.

| Tag | Wirkung |
| - | - |
| `~DC-Counter1_reset~` | setzt den Zähler auf 0 |
| `~DC-Counter1_inc~` | erhöht den Zähler um 1 |
| `~DC-Counter1~` | gibt den Stand aus |
| `{DC-Counter1(0)}` | Bereich greift, wenn der Zähler 0 ist |

Es gibt genau drei Zähler. `DC-Counter4` und höher liefern nichts.

Im Bereichs-Tag dürfen mehrere Werte stehen, kommagetrennt. `{DC-Counter1(0,2,4)}` greift bei jedem dieser drei Stände.

> [!WARNING]
>
> Es gibt kein Gegenstück zu `_inc`. Der Zähler lässt sich nur erhöhen oder auf 0 zurücksetzen, nicht verringern und nicht auf einen bestimmten Wert setzen. Wenn Sie das brauchen, nehmen Sie `DC-Int1` bis `DC-Int3`, die kennen `_set`, `_add` und `_sub`.

### Beispiel: die erste verfügbare Produktliste anzeigen

Am Fuß der Produktdetailansicht soll eine Sonderliste stehen. Erste Wahl sind Bought-Together-Produkte. Gibt es keine, sollen Zubehörprodukte erscheinen, und wenn auch die fehlen, ergänzende Produkte. Genau eine der drei Listen soll am Ende dastehen.

Der Zähler merkt sich dabei, ob schon etwas ausgegeben wurde.

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

<!-- 1. Wahl: Bought-Together-Produkte -->
{CAT-AdvData($BT-Links,5)}
   ~DC-Counter1_inc~
   {@PR-Data}
      Produktdaten der Bought-Together-Produkte
   {/@PR-Data}
{/CAT-AdvData($BT-Links,5)}

<!-- 2. Wahl: Zubehör, nur wenn oben nichts kam -->
{DC-Counter1(0)}
   {CAT-AdvData($C-Links,5)}
      ~DC-Counter1_inc~
      {@PR-Data}
         Produktdaten des Zubehörs
      {/@PR-Data}
   {/CAT-AdvData($C-Links,5)}
{/DC-Counter1(0)}

<!-- 3. Wahl: ergänzende Produkte, nur wenn oben zweimal nichts kam -->
{DC-Counter1(0)}
   {CAT-AdvData($CS-Links,5)}
      {@PR-Data}
         Produktdaten der ergänzenden Produkte
      {/@PR-Data}
   {/CAT-AdvData($CS-Links,5)}
{/DC-Counter1(0)}
```

Der letzte Block erhöht den Zähler nicht mehr. Das ist kein Versehen: Danach wird er nicht mehr abgefragt. Wenn Sie später eine vierte Liste anhängen, müssen Sie das `~DC-Counter1_inc~` dort nachtragen.

> [!WARNING]
>
> Das `~DC-Counter1_inc~` gehört **innerhalb** der Klammerung, aber **vor** die Datenschleife. Steht es innerhalb der Schleife, zählt es je Produkt einmal hoch, und der Zähler steht am Ende auf 5 statt auf 1. Für die reine Prüfung auf 0 macht das nichts, für jede genauere Prüfung schon.

Referenz: [DC-Counter1…3](https://dokumentation.websale.de/v8s/referenz/tags/dc/rechnen.md#die-tags-im-uberblick) · [DC-Counter1…3\_inc](https://dokumentation.websale.de/v8s/referenz/tags/dc/rechnen.md#der-zahler) · [DC-Counter1…3\_reset](https://dokumentation.websale.de/v8s/referenz/tags/dc/rechnen.md#der-zahler) · [CAT-AdvData()](https://dokumentation.websale.de/v8s/referenz/tags/cat/navigation-und-kategoriebaum.md#cat-advdata) · [PR-Data](https://dokumentation.websale.de/v8s/referenz/tags/pr/grundlagen-und-produktdaten.md#die-tags-im-uberblick)

Wegweiser: Bought-Together-Produkte anzeigen

## Elemente in Schleifen durchnummerieren

Innerhalb einer Schleife braucht jedes Element oft eine eigene Nummer, beispielsweise für eine eindeutige HTML-ID oder für abwechselnde Klassennamen. Dafür gibt es zwei voneinander unabhängige Zähler.

| Tag | Wirkung |
| - | - |
| `~WS-Counter~` | gibt den Stand des ersten Zählers aus |
| `~WS-CounterInc~` | erhöht den ersten Zähler um 1 und gibt ihn aus |
| `~WS-Counter2~` | gibt den Stand des zweiten Zählers aus |
| `~WS-Counter2Inc~` | erhöht den zweiten Zähler um 1 und gibt ihn aus |

Beide stehen bei jedem Seitenaufruf auf 0 und lassen sich nur erhöhen, nicht zurücksetzen. Damit liefern sie über eine ganze Seite hinweg eindeutige Nummern.

`WS-Counter` und `WS-Counter2` sind zwei getrennte Zähler. Sie können in derselben Seite beide gleichzeitig verwenden, ohne dass sie sich stören.

### Fortlaufende Nummerierung

Eine Galerieansicht soll je Kachel eine eigene Klasse bekommen, damit sich beispielsweise die dritte Spalte anders ansprechen lässt.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{@PR-Data}
   <div class="category_box_~WS-CounterInc~">
      ~PR-Name~
   </div>
{/@PR-Data}
```

Daraus wird `category_box_1`, `category_box_2`, `category_box_3` und so weiter.

### Eindeutige IDs

Eine ID darf auf einer Seite nur einmal vorkommen. In einer Schleife über Gruppierungsprodukte erzeugt der Zähler für jedes Formular eine eigene.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{ST-ParentProduct}
   {CAT-AdvData($ChildProducts,99)}
      {@PR-Data}
         <form action="~FORM-Product~" method="post" id="productform_catchilds_~WS-CounterInc~">
            ...
            <input type="submit" value="in den Warenkorb"
                   onclick="return ws_AJAXaddToBasket('productform_catchilds_~WS-Counter~',
                            '~BT-ProductAddToBasket_Ajax~', '~WS-Charset~')">
            ...
         </form>
      {/@PR-Data}
   {/CAT-AdvData($ChildProducts,99)}
{/ST-ParentProduct}
```

> [!WARNING]
>
> Beachten Sie den Unterschied in diesem Beispiel: Die ID am Formular verwendet `WS-CounterInc` und erhöht damit den Zähler. Der Aufruf weiter unten verwendet `WS-Counter` und liest ihn nur. Stünde dort ebenfalls `WS-CounterInc`, spräche das Skript ein Formular an, das es nicht gibt.

### Wechselnde Nummerierung mit Modulo

`WS-Counter2` und `WS-Counter2Inc` nehmen eine Zahl als Argument. Dann wird nicht der Zählerstand ausgegeben, sondern sein Rest bei der Division durch diese Zahl.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<table>
   {@PR-Data}
      <tr>
         <td class="category_td_~WS-Counter2Inc(2)~">~PR-Name~</td>
      </tr>
   {/@PR-Data}
</table>
```

Daraus wird abwechselnd `category_td_1` und `category_td_2`, also ein Farbwechsel von Zeile zu Zeile.

Der Wertebereich liegt zwischen **1 und dem Argument**, beide eingeschlossen. `WS-Counter2Inc(3)` liefert also 1, 2, 3, 1, 2, 3 und niemals 0. Das weicht von der üblichen Modulo-Rechnung ab, bei der 0 bis 2 herauskäme, und ist genau das, was man für Klassennamen braucht.

> [!WARNING]
>
> Beim Zählerstand 0 liefert das Argument den Höchstwert. `~WS-Counter2(2)~` gibt vor dem ersten `Inc` also 2 aus, nicht 0. Lesen Sie den Zähler deshalb erst, nachdem Sie ihn mindestens einmal erhöht haben.

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

Materialien: Modulo-Berechnung

## Bereiche abhängig von Zeichenketten anzeigen

`DC-CompareStringInList` prüft, ob eine Zeichenkette in einer Liste von Zeichenketten vorkommt. Beide Angaben unterstützen Tag-in-Tag, Sie können also statt fester Texte auch Tags einsetzen.

So blendet ein deutscher Shop für Käufer mit dem Rechnungsland Österreich einen Hinweis auf den österreichischen Shop ein.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{A-CountryISO}
   {DC-CompareStringInList($A-CountryISO$,AUT)}
      ... Banner für Österreich ...
   {/DC-CompareStringInList($A-CountryISO$,AUT)}
{/A-CountryISO}
```

Mit mehreren Ländern:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{A-CountryISO}
   {DC-CompareStringInList($A-CountryISO$,"DEU,AUT,CHE")}
      ... Banner für den deutschsprachigen Raum ...
   {/DC-CompareStringInList($A-CountryISO$,"DEU,AUT,CHE")}
{/A-CountryISO}
```

> [!WARNING]
>
> Die Anführungszeichen um die Liste sind Pflicht, sobald sie mehr als einen Wert enthält. Der Tag erwartet **genau zwei** Parameter. Ohne Anführungszeichen zerlegt der Parser die Liste in einzelne Parameter, und der Tag wird ungültig.

Die äußere Klammerung mit `A-CountryISO` ist nicht überflüssig. Sie sorgt dafür, dass gar nichts geprüft wird, solange der Kunde noch kein Rechnungsland gewählt hat.

Den Tag gibt es nur als Bereichs-Tag und in der verneinten Form. Als Einzeltag liefert er nichts.

Referenz: [DC-CompareStringInList()](https://dokumentation.websale.de/v8s/referenz/tags/dc/vergleiche.md)

## Verwandte Themen

* Grundlagen: [Grundlagen zu Tags](https://dokumentation.websale.de/v8s/grundlagen-zu-tags.md)
* Wegweiser: [Freie Parameter-Tags verwenden](https://dokumentation.websale.de/v8s/fortgeschrittene-designtechniken/freie-parameter-tags-verwenden.md)
* Referenz: [DC-Int1…3](https://dokumentation.websale.de/v8s/referenz/tags/dc/rechnen.md)


## Related topics

- [Freie Parameter-Tags verwenden](https://dokumentation.websale.de/v8s/fortgeschrittene-designtechniken/freie-parameter-tags-verwenden.md)
- [Rechnen und Vergleichen im Template](https://dokumentation.websale.de/v8s/anwendungsbeispiele/appex-rechnen-und-vergleichen.md)
- [Anwendungsbeispiele](https://dokumentation.websale.de/v8s/anwendungsbeispiele/anwendungsbeispiele.md)
- [DC- (Vergleiche und weitere Tags)](https://dokumentation.websale.de/v8s/referenz/tags/dc/vergleiche.md)
- [DC- (Freie Parameter und Session-Parameter)](https://dokumentation.websale.de/v8s/referenz/tags/dc/parameter.md)


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