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

# Upload-Modul: Tags

> Das Template des Upload-Moduls aufbauen: Upload-ID abfragen, Bestellpositionen auflisten, hochgeladene Dateien anzeigen und löschen, neue Dateien entgegennehmen, Uploads abschließen und das Protokoll ausgeben.

Bei Druckerzeugnissen, Werbemitteln oder individuell gefertigten Artikeln liefert nicht der Shop die Daten, sondern der Käufer. Nach der Bestellung lädt er seine Dateien hoch, je Bestellposition eine oder mehrere, und meldet am Ende, dass er fertig ist. Das übernimmt das Upload-Modul, ein eigenes Programm neben dem Shop.

Seine Oberfläche entsteht aus genau einem Template, üblicherweise `ws_upload.htm`. Darin stehen die Platzhalter dieser Seite. Sie folgen demselben Aufbau wie Shoptemplate-Tags, gehören aber zum Upload-Programm und nicht zum Shop.

* Wegweiser: [Upload-Modul integrieren](https://dokumentation.websale.de/v8s/upload-modul/upload-modul-integrieren.md)
* Referenz: [wsupload.config](https://dokumentation.websale.de/v8s/referenz/konfigurationen/konfiguration-wsupload-config.md)

> [!WARNING]
>
> In diesem Template funktioniert kein einziges Shoptemplate-Tag, also weder `PR-`, noch `BASKET-`, noch `WS-`. Umgekehrt haben die Platzhalter dieser Seite im Shop keine Bedeutung. Die Schreibweise ist dieselbe: `~Name~` für einen Wert, `{Name}` und `{/Name}` für einen Bereich, `{@Name}` und `{/@Name}` für eine Schleife.

## Drei Ansichten in einem Template

Das Upload-Programm zeigt nacheinander drei Ansichten, und alle drei stecken in derselben Datei. Welche erscheint, entscheidet das Programm, das Template liefert nur die Bausteine.

| Bereich | Ansicht |
| - | - |
| `{UplIdInput}` | die Abfrage der Upload-ID oder der Auftragsnummer |
| `{ItemList}` | die Liste der Bestellpositionen |
| `{Item}` | eine einzelne Bestellposition mit ihren Dateien |

Hat eine Bestellung nur eine einzige Position, überspringt das Programm die Liste und zeigt sofort `{Item}`. Der Bereich `{ItemList}` erscheint dann gar nicht. Bauen Sie trotzdem beide, denn dieselbe Datei bedient beide Fälle.

> [!WARNING]
>
> Alles, was außerhalb dieser drei Bereiche steht, erscheint auf jeder Ansicht. Das ist der richtige Platz für Kopf- und Fußzeile, für `{Msg}` und für `~WSUploadScripts~`.

## Zwei Betriebsarten

Das Upload-Modul arbeitet nicht nur nach einer Bestellung, sondern auch bei Anfragen über das Anfrageformular. Dieser Anfrage-Upload kennt keine Bestellpositionen und damit auch nicht alle Platzhalter.

> [!WARNING]
>
> Rund die Hälfte der Platzhalter ist beim Anfrage-Upload nicht verfügbar. Betroffen sind alle, die eine Bestellung oder eine Position voraussetzen. Die Übersichtstabelle am Seitenende führt das je Platzhalter auf. Wenn Sie beide Betriebsarten mit einem Template bedienen wollen, beschränken Sie sich auf die Platzhalter, die in beiden gelten.

## Der Seitenrahmen

Diese Platzhalter stehen frei im Template und beschreiben die Umgebung.

| Platzhalter | Liefert |
| - | - |
| `protocol` | `https` im SSL-Betrieb, sonst `http` |
| `hostname` | den Hostnamen, über den das Upload-Programm aufgerufen wurde |
| `baseurl` | die Basisadresse des Template-Verzeichnisses |
| `charset` | den Zeichensatz aus der Shopkonfiguration |
| `CommonId` | die Shop-Kennung |
| `WSUploadScripts` | die Skripte, die sich nicht auslagern lassen |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=~charset~">
   <base href="~protocol~://~hostname~~baseurl~">
</head>
<body>
~WSUploadScripts~
```

> [!WARNING]
>
> `~WSUploadScripts~` ist nicht wahlfrei. Ohne diesen Platzhalter fehlen dem Template die Skripte für Fortschrittsanzeige, Abbruch und die Auswahl des Verwendungszwecks. Setzen Sie ihn einmal, möglichst früh im `body`.

`protocol` und `hostname` gehören in das `base`-Element im Seitenkopf. Das Referenztemplate verwendet beide genau dort.

### Meldungen

| Platzhalter | Bedeutung |
| - | - |
| `Msg` | die aktuelle Hinweis- oder Fehlermeldung, als Bereich und als Wert |
| `{UploadSuccess}` | Bereich: der letzte Upload war erfolgreich |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{Msg}
   <div class="upload_message">~Msg~</div>
{/Msg}

{UploadSuccess}
   <p class="ok">Ihre Datei wurde übertragen.</p>
{/UploadSuccess}
```

## Upload-ID oder Auftragsnummer abfragen

Ruft jemand das Upload-Programm ohne Kennung auf, erscheint `{UplIdInput}`. Der Käufer gibt dort entweder die Upload-ID aus seiner Bestellbestätigung ein oder seine Auftragsnummer.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{UplIdInput}
   <form name="idform" method="post" action="~cgiurl~" accept-charset="ISO-8859-1">
      <label>Upload-ID <input type="text" name="UploadId" value="~UploadId~"></label>
      <label>oder Auftragsnummer <input type="text" name="Ordernumber" value="~Ordernumber~"></label>
      <input type="submit" name="OkBtn" value="OK">
   </form>
{/UplIdInput}
```

| Platzhalter | Bedeutung |
| - | - |
| `{UplIdInput}` | Bereich: es liegt weder Upload-ID noch Auftragsnummer vor |
| `UploadId` | die Upload-ID der Bestellung |
| `Ordernumber` | die Auftragsnummer |
| `{OrdNumMode}` | Bereich: gearbeitet wird mit der Auftragsnummer statt der Upload-ID |

Das Upload-Programm vergibt je Bestellung eine Upload-ID und je Bestellposition zusätzlich eine Positions-ID. Die Upload-ID bekommt der Käufer, die Positions-ID braucht er nicht zu kennen.

Die Namen der beiden Eingabefelder sind fest und heißen `UploadId` und `Ordernumber`. Hier gibt es keine `_input`-Platzhalter wie im Shop, schreiben Sie die Namen direkt ins Template.

Mit `{OrdNumMode}` beschriften Sie die Anzeige passend. Arbeitet der Vorgang über die Auftragsnummer, ist es wenig hilfreich, dem Käufer eine Upload-ID anzuzeigen, die er nirgends wiederfindet.

## Die Liste der Bestellpositionen

Hat die Bestellung mehrere Positionen, zeigt `{ItemList}` die Übersicht. `{@PrdData}` läuft darin über die Positionen.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{ItemList}
   <table>
      {@PrdData}
         <tr>
            <td>~PrdName~</td>
            <td>~PrdNumber~</td>
            <td>~PosID~</td>
            <td>
               <a href="~PrdEdtLink~">bearbeiten</a>
               {PosLocked}<span>Upload abgeschlossen</span>{/PosLocked}
               {!PosLocked}
                  {HasFile}Datei vorhanden{/HasFile}
                  {!HasFile}noch keine Datei{/!HasFile}
               {/!PosLocked}
            </td>
         </tr>
      {/@PrdData}
   </table>
{/ItemList}
```

| Platzhalter | Liefert | Steht in |
| - | - | - |
| `{ItemList}` | den Bereich der Positionsliste | frei |
| `{@PrdData}` | die Schleife über die Positionen | `{ItemList}` |
| `PrdName` | den Produktnamen | `{@PrdData}` oder `{Item}` |
| `PrdNumber` | die Produktnummer | `{@PrdData}` oder `{Item}` |
| `PosID` | die Positions-ID | `{@PrdData}` oder `{Item}` |
| `PrdEdtLink` | den Link auf die Detailansicht dieser Position | `{@PrdData}` |
| `{HasFile}` | Bereich: zu dieser Position liegt schon eine Datei vor | `{@PrdData}` |
| `{PosLocked}` | Bereich: der Upload dieser Position ist abgeschlossen | `{@PrdData}` oder `{Item}` |

`{HasFile}` beantwortet die Frage für die eine Position im Durchlauf, `{HasFiles}` weiter unten für die gesamte Bestellung oder die angezeigte Position. Die beiden Namen unterscheiden sich nur im Schluss-s, die Bedeutung ist verschieden.

> [!WARNING]
>
> `{PosLocked}` greift auch dann, wenn nicht diese Position, sondern die ganze Bestellung abgeschlossen wurde. Das ist gewollt, denn für den Käufer ist das Ergebnis dasselbe. Für die Unterscheidung nehmen Sie zusätzlich `{UploadLocked}`.

### Zurück zur Liste

| Platzhalter | Bedeutung |
| - | - |
| `ItemListLink` | die Adresse der Positionsliste, zugleich Bereich |
| `{MultiplePositions}` | Bereich: die Bestellung hat mehr als eine Position |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{ItemListLink}
   <p><a href="~ItemListLink~">Zurück zur Liste der Bestellpositionen</a></p>
{/ItemListLink}
```

Beide greifen nur, wenn die Bestellung mehr als eine Position hat. Bei einer einzigen Position gäbe es nichts, wohin der Link führen könnte. `ItemListLink` ist damit zugleich Wert und Klammerung.

## Eine Position mit ihren Dateien

`{Item}` ist die Detailansicht. Darin steht alles, was eine einzelne Bestellposition betrifft.

### Die vorhandenen Dateien

`{@Files}` läuft über die Dateien, die zu dieser Position schon hochgeladen wurden.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{Item}
   <form name="delform" method="post" action="~cgiurl~" accept-charset="ISO-8859-1">
      <table>
         {@Files}
            <tr>
               <td>~FileName~</td>
               <td>~FileSize~ MB</td>
               <td>~UploadDate~ ~UploadTime~</td>
               <td>
                  <input type="checkbox" name="~FileMarkBoxName~" value="marked">
                  <input type="hidden" name="~FileNameName~" value="~FileName~">
               </td>
            </tr>
         {/@Files}

         {HasFiles}
            <tr>
               <td colspan="3">Gesamt ~TotalSize~ MB von höchstens ~PositionLimitMB~ MB</td>
               <td><input type="submit" name="DelBtn" value="Löschen"></td>
            </tr>
         {/HasFiles}

         {NoFiles}
            <tr><td colspan="4">Noch keine Dateien vorhanden.</td></tr>
         {/NoFiles}
      </table>
   </form>
{/Item}
```

| Platzhalter | Liefert | Steht in |
| - | - | - |
| `{@Files}` | die Schleife über die vorhandenen Dateien | `{Item}` |
| `FileName` | den Dateinamen | `{@Files}` oder `{@LogLines}` |
| `FileSize` | die Größe in MB | `{@Files}` |
| `UploadDate` | das Datum des Uploads | `{@Files}` |
| `UploadTime` | die Uhrzeit des Uploads | `{@Files}` |
| `FileMarkBoxName` | den Namen des Auswahlkästchens zum Löschen | `{@Files}` |
| `FileNameName` | den Namen des versteckten Felds mit dem Dateinamen | `{@Files}` |
| `TotalSize` | die Gesamtgröße aller Dateien dieser Position in MB | `{Item}` |
| `{HasFiles}` | Bereich: es liegen Dateien vor | frei |
| `{NoFiles}` | Bereich: es liegen keine Dateien vor | frei |
| `editurl` | die Adresse des Bearbeiten- und Löschen-Formulars | frei |
| `delurl` | die Adresse für das Löschen | frei |

> [!WARNING]
>
> Zum Löschen gehören beide Felder zusammen. Das Auswahlkästchen aus `FileMarkBoxName` markiert die Datei, und das versteckte Feld aus `FileNameName` übergibt den dazugehörigen Dateinamen. Lassen Sie eines davon weg, kommt die Auswahl beim Programm nicht an.

`{NoFiles}` ist dafür gedacht, hinter `{HasFiles}` zu stehen. Die beiden Bereiche schließen einander aus, `{NoFiles}` ist also die lesbarere Form der negativen Klammerung von `{HasFiles}`.

### Der Verwendungszweck je Datei

Zu jeder Datei lässt sich hinterlegen, wofür sie gedacht ist, beispielsweise Vorderseite, Rückseite oder Korrekturabzug. Die Auswahlmöglichkeiten stehen in den Unterabschnitten `<+FileInfo>` des Abschnitts `<Upload>` in `wsupload.config`.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{@Files}
   <select name="~FileInfoSelName~" id="~FileInfoSelName~"
           onchange="fileInfoChanged('~FileName~', $(this).val(), '~FileInfoProcId~');">
      ~fileinfoopts~
   </select>
   <img src="~baseurl~images/ws-loading.gif" id="~FileInfoProcId~" style="visibility: hidden;" alt="">
{/@Files}
```

| Platzhalter | Liefert | Steht in |
| - | - | - |
| `fileinfoopts` | die Auswahlpunkte mit Vorbelegung der Datei | `{@Files}` |
| `uplfileinfoopts` | dieselben Auswahlpunkte ohne Vorbelegung | frei |
| `FileInfoSelName` | Name und Kennung des Auswahlfelds | `{@Files}` |
| `FileInfoProcId` | die Kennung der Wartegrafik | `{@Files}` |

Der Unterschied zwischen den beiden Optionslisten ist die Vorbelegung. `fileinfoopts` steht an einer bereits hochgeladenen Datei und hat deren Verwendungszweck vorausgewählt, `uplfileinfoopts` steht am Feld für die neue Datei und hat nichts vorausgewählt.

Die Umstellung des Verwendungszwecks läuft im Hintergrund, ohne die Seite neu zu laden. Deshalb die Wartegrafik, die über `FileInfoProcId` angesprochen wird. Die ganze Gruppe ist wahlfrei. Wenn Sie keinen Verwendungszweck brauchen, lassen Sie alle vier Platzhalter weg.

## Eine neue Datei hochladen

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{!UploadLocked}
   {Web2Print}
      <p>Die Druckdaten dieser Bestellung entstehen online, ein Upload ist nicht nötig.</p>
   {/Web2Print}

   {!Web2Print}
      <form name="uplform" enctype="multipart/form-data" method="post" action="~uplurl~" accept-charset="ISO-8859-1">
         <input type="file" name="uplfile">
         <select name="uplfileinfo">~uplfileinfoopts~</select>
         <input type="submit" name="UploadBtn" value="Transfer starten">
      </form>
   {/!Web2Print}
{/!UploadLocked}
```

| Platzhalter | Bedeutung |
| - | - |
| `uplurl` | die Adresse, an die das Upload-Formular sendet |
| `uploadUrl` | dieselbe Aufgabe in der neueren Fassung des Moduls |
| `{Web2Print}` | Bereich: die Daten entstehen online und werden nicht hochgeladen |
| `{UploadLocked}` | Bereich: der Upload ist abgeschlossen und gesperrt |

> [!WARNING]
>
> Der Name des Dateifelds ist fest und lautet `uplfile`, der des Verwendungszweck-Felds `uplfileinfo`. Beide gibt es nicht als Platzhalter, schreiben Sie sie direkt ins Template.

`uploadUrl` gehört zur neueren Fassung des Upload-Moduls, die über ein JavaScript-Plugin hochlädt, und ersetzt dort `uplurl`. Welche Fassung Ihr Shop verwendet, hängt am eingebundenen Skript und am Aufbau des Formulars. Mischen Sie die beiden nicht.

> [!WARNING]
>
> Das Referenztemplate klammert das Upload-Formular nicht mit `{!Web2Print}`, sondern mit einem auskommentierten `{!Web2PrintX}`, das es gar nicht gibt. Bei einer Web-to-Print-Bestellung erscheint dort also sowohl der Hinweis als auch das Formular. Das Beispiel oben setzt die Klammerung richtig.

## Die Grenzen

| Platzhalter | Liefert |
| - | - |
| `FileLimitMB` | die höchstzulässige Größe einer einzelnen Datei in MB |
| `PositionLimitMB` | die höchstzulässige Gesamtgröße je Bestellposition in MB |
| `PositionLimitCount` | die höchstzulässige Zahl Dateien je Bestellposition |
| `NewUplLink` | den Link für einen neuen Anlauf nach einem Fehler |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<p>Je Datei höchstens ~FileLimitMB~ MB, je Position höchstens
   ~PositionLimitCount~ Dateien mit zusammen ~PositionLimitMB~ MB.</p>
```

Diese drei Werte sind bei der WEBSALE-Technik hinterlegt und werden mit dem Shopbetreiber vereinbart. Geben Sie sie im Template aus, statt Zahlen hineinzuschreiben, dann stimmt der Text auch nach einer Änderung noch.

`NewUplLink` ist für den Fehlerfall gedacht, beispielsweise für den Hinweis bei überschrittener Dateigröße. Er führt zurück auf die Upload-Seite derselben Position.

## Abgewiesene Dateien

Das Upload-Programm prüft jede Datei auf ihren MIME-Typ und auf Schadsoftware. Schlägt eine Prüfung an, erscheint der passende Bereich.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{MimeTypeMismatch}
   <p class="fehler">
      Die Datei ~FailedFile~ passt nicht zu ihrer Endung. Erkannt wurde
      der Typ ~MimeType~ bei der Endung ~FileExtension~.
   </p>
{/MimeTypeMismatch}

{VirusDetected}
   <p class="fehler">Die Datei ~FailedFile~ wurde abgewiesen.</p>
{/VirusDetected}
```

| Platzhalter | Bedeutung | Steht in |
| - | - | - |
| `{MimeTypeMismatch}` | Bereich: die MIME-Typ-Prüfung hat angeschlagen | frei |
| `{VirusDetected}` | Bereich: der Virenscan hat angeschlagen | frei |
| `FailedFile` | den Namen der abgewiesenen Datei | beide Bereiche |
| `MimeType` | den erkannten MIME-Typ | `{MimeTypeMismatch}` |
| `FileExtension` | die Dateiendung | `{MimeTypeMismatch}` |

> [!WARNING]
>
> Beide Bereiche erscheinen nur, wenn die jeweilige Prüfung in der Konfiguration als **Fehler** eingestuft ist. Ist sie nur zur Beobachtung eingeschaltet, schlägt sie zwar an, der Bereich bleibt aber leer. Das erklärt den Fall, dass eine Datei abgelehnt wird, ohne dass das Template etwas anzeigt.
>
> Das mitgelieferte Referenztemplate enthält weder `{MimeTypeMismatch}` noch `{VirusDetected}`. Wer es unverändert übernimmt, hat für diese beiden Fälle keine Anzeige. Ergänzen Sie beide Bereiche.

## Abschließen und wieder aufheben

Am Ende bestätigt der Käufer, dass er alle Dateien geliefert hat. Danach nimmt das Programm nichts mehr an. Das geht wahlweise für die ganze Bestellung oder je Position.

| Platzhalter | Bedeutung |
| - | - |
| `{AllPosLock}` | Bereich: der Abschluss gilt für die gesamte Bestellung |
| `{SinglePosLock}` | Bereich: der Abschluss ist je Position möglich |
| `{UploadsComplete}` | Bereich: zu jeder Position liegt mindestens eine Datei vor |
| `{UploadLocked}` | Bereich: die Bestellung ist abgeschlossen |
| `{PosLocked}` | Bereich: diese Position ist abgeschlossen |
| `{Unlock}` | Bereich: der Abschluss der Bestellung lässt sich aufheben |
| `{UnlockPos}` | Bereich: der Abschluss dieser Position lässt sich aufheben |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{AllPosLock}
   {HasFiles}
      {!UploadLocked}
         {UploadsComplete}
            <form name="lockform" method="post" action="~lockurl~" accept-charset="ISO-8859-1">
               <input type="submit" name="LockBtn" value="Uploads abschließen">
               <p>
                  Danach können Sie keine weiteren Daten zu diesem Auftrag senden.
               </p>
            </form>
         {/UploadsComplete}
         {!UploadsComplete}
            <p>Es gibt noch Positionen ohne Datei.</p>
         {/!UploadsComplete}
      {/!UploadLocked}
   {/HasFiles}
{/AllPosLock}
```

`{AllPosLock}` und `{SinglePosLock}` werden nicht vom Template entschieden, sondern von der Betriebsart, die in der Konfiguration des Moduls hinterlegt ist. Es gibt drei Möglichkeiten: Abschluss nur für die ganze Bestellung, nur je Position, oder beides zugleich. Die Vorgabe ist der Abschluss für die ganze Bestellung. Bauen Sie beide Bereiche ein, dann arbeitet das Template in jeder Betriebsart.

> [!WARNING]
>
> Die Verschachtelung im Beispiel ist nicht geschmückt, sondern nötig. Der Abschlussknopf gehört nur dann auf die Seite, wenn Dateien vorliegen, der Upload noch nicht gesperrt ist und zu jeder Position etwas da ist. Fehlt eine der drei Klammerungen, bietet die Seite einen Knopf an, der entweder nichts bewirkt oder zu früh sperrt.

### Die Adressen der Formulare

| Platzhalter | Formular | Steht in |
| - | - | - |
| `lockurl` | Uploads der Bestellung abschließen | `{Item}` |
| `ordlockurl` | dasselbe aus der Positionsliste heraus | `{ItemList}` |
| `poslockurl` | Upload einer Position abschließen | `{@PrdData}` oder `{Item}` |
| `unlockurl` | Abschluss der Bestellung aufheben | `{Unlock}` |
| `unlockposurl` | Abschluss einer Position aufheben | `{UnlockPos}` |

`poslockurl` bezieht sich innerhalb der Positionsschleife auf die Position im Durchlauf und außerhalb auf die angezeigte Position. Deshalb funktioniert derselbe Platzhalter an beiden Stellen.

`lockurl` und `ordlockurl` tun dasselbe, sind aber für verschiedene Ansichten gedacht. Nehmen Sie in `{ItemList}` das eine und in `{Item}` das andere, so wie es die Spalte oben angibt.

### Den Abschluss aufheben

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{AllPosLock}
   {Unlock}
      <form name="unlockform" method="post" action="~unlockurl~" accept-charset="ISO-8859-1">
         <input type="submit" name="UnlockBtn" value="Abschluss aufheben">
      </form>
   {/Unlock}
{/AllPosLock}

{SinglePosLock}
   {UnlockPos}
      <form name="unlockposform" method="post" action="~unlockposurl~" accept-charset="ISO-8859-1">
         <input type="submit" name="UnlockBtn" value="Abschluss dieser Position aufheben">
      </form>
   {/UnlockPos}
{/SinglePosLock}
```

> [!WARNING]
>
> Beide Bereiche greifen nur, wenn das Upload-Programm mit dem Parameter `unlockallow=Y` aufgerufen wurde **und** der jeweilige Abschluss tatsächlich vorliegt. Ohne diesen Parameter bleiben sie stumm, auch wenn alles andere passt.

Das Aufheben ist für den Fall gedacht, dass der Käufer nachträglich einen Fehler in seinen Daten findet und die Produktion noch nicht angelaufen ist.

## Das Protokoll

Zu jedem Vorgang führt das Programm ein Protokoll, das sich im Template ausgeben lässt.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{Logging}
   <table>
      {@LogLines}
         <tr>
            <td>~Date~ ~Time~</td>
            <td>~Type~</td>
            <td>~FileName~</td>
         </tr>
      {/@LogLines}
   </table>
{/Logging}
```

| Platzhalter | Liefert | Steht in |
| - | - | - |
| `{Logging}` | Bereich: es liegen Protokolldaten vor | frei |
| `{@LogLines}` | die Schleife über die Protokollzeilen | `{Logging}` |
| `Date` | das Datum des Eintrags | `{@LogLines}` |
| `Time` | die Uhrzeit des Eintrags | `{@LogLines}` |
| `Type` | die Beschreibung des Vorgangs | `{@LogLines}` |
| `FileName` | die betroffene Datei | `{@LogLines}` |

`Type` ist bereits ein lesbarer Text wie "Datei hochgeladen" oder "Datei gelöscht", kein technischer Code.

`FileName` steht sowohl in der Dateischleife als auch in der Protokollschleife und meint jeweils die Datei des aktuellen Durchlaufs. Das ist der einzige Platzhalter, den sich zwei Schleifen teilen.

## Die Platzhalter im Überblick

| Platzhalter | Einzel-Tag | Bereichs-Tag | negatives Bereichs-Tag | Schleifen-Tag | Steht in | Anfrage-Upload |
| - | - | - | - | - | - | - |
| `protocol` | ja | – | – | – | frei | nein |
| `hostname` | ja | – | – | – | frei | nein |
| `baseurl` | ja | – | – | – | frei | ja |
| `charset` | ja | – | – | – | frei | nein |
| `CommonId` | ja | – | – | – | frei | nein |
| `WSUploadScripts` | ja | – | – | – | frei | nein |
| `Msg` | ja | ja | ja | – | frei | nein |
| `UploadSuccess` | – | ja | ja | – | frei | ja |
| `UplIdInput` | – | ja | ja | – | frei | nein |
| `UploadId` | ja | – | – | – | frei | nein |
| `Ordernumber` | ja | – | – | – | frei | nein |
| `OrdNumMode` | – | ja | ja | – | frei | nein |
| `ItemList` | – | ja | – | – | frei | nein |
| `PrdData` | – | – | – | ja | `{ItemList}` | nein |
| `PrdName` | ja | – | – | – | `{@PrdData}` oder `{Item}` | nein |
| `PrdNumber` | ja | – | – | – | `{@PrdData}` oder `{Item}` | nein |
| `PosID` | ja | – | – | – | `{@PrdData}` oder `{Item}` | nein |
| `PrdEdtLink` | ja | – | – | – | `{@PrdData}` | nein |
| `HasFile` | – | ja | ja | – | `{@PrdData}` | nein |
| `ItemListLink` | ja | ja | – | – | frei | nein |
| `MultiplePositions` | – | ja | ja | – | frei | nein |
| `Item` | – | ja | – | – | frei | ja |
| `Files` | – | – | – | ja | `{Item}` | ja |
| `FileName` | ja | – | – | – | `{@Files}` oder `{@LogLines}` | ja |
| `FileSize` | ja | – | – | – | `{@Files}` | ja |
| `UploadDate` | ja | – | – | – | `{@Files}` | ja |
| `UploadTime` | ja | – | – | – | `{@Files}` | ja |
| `FileMarkBoxName` | ja | – | – | – | `{@Files}` | ja |
| `FileNameName` | ja | – | – | – | `{@Files}` | ja |
| `TotalSize` | ja | – | – | – | `{Item}` | ja |
| `HasFiles` | – | ja | ja | – | frei | ja |
| `NoFiles` | – | ja | – | – | frei | nein |
| `editurl` | ja | – | – | – | frei | ja |
| `delurl` | ja | – | – | – | frei | ja |
| `fileinfoopts` | ja | – | – | – | `{@Files}` | nein |
| `uplfileinfoopts` | ja | – | – | – | frei | nein |
| `FileInfoSelName` | ja | – | – | – | `{@Files}` | nein |
| `FileInfoProcId` | ja | – | – | – | `{@Files}` | nein |
| `uplurl` | ja | – | – | – | frei | ja |
| `uploadUrl` | ja | – | – | – | frei | nein |
| `Web2Print` | – | ja | ja | – | `{Item}` | nein |
| `FileLimitMB` | ja | – | – | – | frei | ja |
| `PositionLimitMB` | ja | – | – | – | frei | ja |
| `PositionLimitCount` | ja | – | – | – | frei | ja |
| `NewUplLink` | ja | – | – | – | frei | ja |
| `MimeTypeMismatch` | – | ja | – | – | frei | ja |
| `VirusDetected` | – | ja | – | – | frei | ja |
| `FailedFile` | ja | – | – | – | beide Fehlerbereiche | ja |
| `MimeType` | ja | – | – | – | `{MimeTypeMismatch}` | ja |
| `FileExtension` | ja | – | – | – | `{MimeTypeMismatch}` | ja |
| `AllPosLock` | – | ja | – | – | `{Item}` oder `{ItemList}` | nein |
| `SinglePosLock` | – | ja | – | – | `{Item}` oder `{ItemList}` | nein |
| `UploadsComplete` | – | ja | ja | – | frei | nein |
| `UploadLocked` | – | ja | ja | – | frei | nein |
| `PosLocked` | – | ja | ja | – | `{@PrdData}` oder `{Item}` | nein |
| `Unlock` | – | ja | ja | – | frei | nein |
| `UnlockPos` | – | ja | – | – | `{Item}` | nein |
| `lockurl` | ja | – | – | – | `{Item}` | ja |
| `ordlockurl` | ja | – | – | – | `{@PrdData}` | ja |
| `poslockurl` | ja | – | – | – | `{@PrdData}` oder `{Item}` | ja |
| `unlockurl` | ja | – | – | – | `{Unlock}` | ja |
| `unlockposurl` | ja | – | – | – | `{UnlockPos}` | ja |
| `Logging` | – | ja | – | – | frei | nein |
| `LogLines` | – | – | – | ja | `{Logging}` | nein |
| `Date` | ja | – | – | – | `{@LogLines}` | nein |
| `Time` | ja | – | – | – | `{@LogLines}` | nein |
| `Type` | ja | – | – | – | `{@LogLines}` | nein |

Die Spalte "Steht in" nennt den Bereich oder die Schleife, innerhalb derer der Platzhalter stehen muss. "frei" bedeutet an beliebiger Stelle im Template. Die Spalte "Anfrage-Upload" sagt, ob der Platzhalter auch beim Upload aus dem Anfrageformular heraus zur Verfügung steht.

## Weitere Platzhalter im Referenztemplate

Das mitgelieferte Template verwendet drei weitere Platzhalter.

| Platzhalter | Aufgabe |
| - | - |
| `cgiurl` | die Adresse des Upload-Programms, für Formulare ohne eigenes Ziel |
| `progressurl` | die Adresse für die Fortschrittsanzeige |
| `cancelurl` | die Adresse für den Abbruch einer laufenden Übertragung |

Diese drei brauchen Sie nur, wenn Sie Fortschrittsanzeige und Abbruch im Template nachbauen. Das Referenztemplate zeigt, wie sie zusammenspielen. Für ein schlichtes Upload-Formular reichen die Platzhalter aus der Übersicht oben.

## Verwandte Themen

* Wegweiser: [Upload-Modul integrieren](https://dokumentation.websale.de/v8s/upload-modul/upload-modul-integrieren.md)
* Referenz: wsupload.config
* Referenz: [SENDUPLOADLINK- (Uploadlink per E-Mail verschicken)](https://dokumentation.websale.de/v8s/referenz/tags/senduploadlink-uploadlink-per-e-mail-verschicken.md)


## Related topics

- [Merkzettel, Vergleich, Upload und externe Dienste](https://dokumentation.websale.de/v8s/referenz/tags/ws/merkzettel-vergleich-upload-und-externe-dienste.md)
- [Upload-Modul integrieren](https://dokumentation.websale.de/v8s/upload-modul/upload-modul-integrieren.md)
- [Upload-Modul](https://dokumentation.websale.de/v8s/upload-modul/upload-modul.md)
- [Upload-Modul für Formulare mit INQUIRY](https://dokumentation.websale.de/v8s/upload-modul/upload-modul-fuer-formulare-mit-inquiry.md)
- [Upload-Modul mit gesichertem Link aufrufen](https://dokumentation.websale.de/v8s/upload-modul/upload-modul-mit-gesichertem-link-aufrufen.md)


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