SystemExecute-Prozeduren

Der System-Execute-Mechanismus des Content Managers und der Template Engine dient dazu, beim Export (und beim Content Manager auch bei der Vorschau) Datei- oder Versionsdaten zu exportieren, die nicht mit NPSOBJ-insertvalue-Anweisungen ermittelt werden können. SystemExecute-Prozeduren werden folgendermaßen aufgerufen:

<npsobj insertvalue="systemExecute" name="procAlias">content</npsobj>

Diese Anweisung führt die Prozedur mit dem Alias procAlias aus und fügt den Rückgabewert anstelle der Anweisung in die Exportdatei ein. System-Execute-Alias-Namen werden im Systemkonfigurationseintrag export als Wert von tclSystemExecuteCommands registriert. Der entsprechende Eintrag in der Konfigurationsdatei des Content Managers oder der Template Engine hat folgendes Format:

<tclSystemExecuteCommands>
  <procAlias>sysExecProc</procAlias>
</tclSystemExecuteCommands>

Die Angabe name="procAlias" in der NPSOBJ-Anweisung bewirkt bei obiger Konfiguration, dass die Prozedur sysExecProc aufgerufen wird. SystemExecute-Prozeduren müssen im instanzenspezifischen Verzeichnis script/cm/serverCmds abgelegt werden. Dadurch werden sie beim Start des Content-Managers und der Template-Engine eingelesen. Beachten Sie bitte, dass der Tcl-Code von Systemprozeduren nur lesenden Zugriff auf die CMS-Daten hat.

Einer SystemExecute-Prozedur wird als erstes Argument die ID der Datei oder Links übergeben, in deren Kontext die Anweisung ausgeführt wird. Als zweites Argument erhält sie den ausgewerteten Inhalt des aufrufenden NPSOBJ-Elements. Die folgende Beispielprozedur sysExecProc gibt als Ergebnis einen formatierten Text zurück, der diese beiden Werte enthält.

proc sysExecProc {objId content} {
  set result "<b>ObjId: $objId</b>\n"
  append result "<pre>$content</pre>\n"
  return $result;
}

Datei-Abhängigkeiten auf dem Live-Server

SystemExecute-Prozeduren haben lesenden Zugriff nicht nur auf die gerade exportierte Datei, sondern auch auf beliebige andere Dateien. Wenn Sie die Template Engine einsetzen und eine referenzierte Datei aktualisiert wurde, so ist möglicherweise auch die Datei, das den SystemExecute-Aufruf enthält, nicht mehr aktuell und muss neu exportiert werden. Diese Datei hängt von der referenzierten Datei ab.

Wenn beispielsweise eine systemExecute-Prozedur aufgerufen wird, während Datei A exportiert wird, und diese Prozedur Versionsfelder von B ausliest und in das Exportergebnis von A aufnehmen lässt, dann sollte nicht nur die Webseite von B, sondern auch die von A ungültig werden, sobald Versionsfelder von B geändert werden. Dies würde bewirken, dass A neu exportiert wird, wenn ein Website-Besucher die zu Datei A gehörende Webseite anfordert. Indem man eine Abhängigkeit definiert, lässt sich die Webseite von A aktuell halten, auch wenn die Datei A selbst nicht geändert wird.

Abhängigkeiten können der Template Engine in der SystemExecute-Prozedur mit Hilfe der globalen Variablen additionalDependencies bekannt gemacht werden. In additionalDependencies können Sie eine Liste speichern, die Wertepaare, bestehend aus einem Abhängigkeitstyp und einer Datei-ID, enthält. Das folgende Beispiel drückt aus, dass die gerade exportierte Datei vom Inhalt der Datei mit dem Pfad /pfad/zur/datei abhängt:

global additionalDependencies
  set additionalDependencies [list content [obj withPath /pfad/zur/datei]]

Der Abhängigkeitstyp legt fest, welche Änderung an der angegebenen Datei dazu führt, dass die abhängige Datei aus dem Cache gelöscht und neu exportiert wird. In der folgenden Übersicht sind die verfügbaren Abhängigkeitstypen und ihre Änderungsbedingungen aufgeführt:

Abhängigkeitstyp Änderungsbedingungen
children Die Anzahl der Dateien in einem Ordner, eine der Dateien selbst oder die Sortierung in dem Ordner hat sich geändert.
content Der Inhalt der Version der Datei hat sich geändert.
object Ein Dateifeld hat sich geändert.
reference Ein für Links relevantes Feld (wie beispielsweise title oder destinationUrl) hat sich geändert.
usesAll Eine beliebige Datei oder ihre Version hat sich geändert. Bei diesem Typ spielt die Datei-ID keine Rolle und wird ignoriert. Sie muss dennoch angegeben werden.