Methoden zur Verwendung der Objekte der Palette Produktrecherche.

Letzte Änderung :
30.07.2025, 07:35 Uhr

Methoden zur Verwendung der Objekte der Palette Produktrecherche. Die Module product und productlist dienen insbesondere der Unterstützung der Platzierung von Produkten im InDesign®-Dokument inklusive Seitenumbrüchen, Extra-Abständen und Werbebannern.

Der Seitenaufbau der Produkte kann durch eigene Skripte unterstützt werden. Die Skripte werden in actions definiert und bekommen eine eigene Klassen-ID.

In den Produktaufbau-Skripten (und nur in diesen) sind einige globale Variable definiert, mit denen der Aufbau beinflusst werden kann :
Name Definitionsbereich Datentyp Beschreibung
gScriptType Produktaufbau int in welcher Situation wird das Skript aufgerufen? Folgende Werte sind möglich:

1 kPreScript
2 kPreRule
3 kPostRule
4 kExtraPlacement
5 kTextflowPreScript
6 kTextflowPreRule
7 kTextflowPostRule

gPage int* 1-basierte Seitennummer auf der sich der Aufbau gerade befindet. Legt das Skript neue Seiten an, muss der Inhalt dieser Variable angepasst werden. Zum Anlegen neuer Seiten kann der Befehl page::create verwendet werden.
gMasterpage, gMasterpageL char* (read only) Musterseitenname. Der Wert kann beim Anlegen neuer Seiten im Skript verwendet werden.
gMasterpageR char* (read only) Musterseitenname für rechte Dokumentseiten in einseitigen Dokumenten. Die Variable enthält den zweiten Musterseitennamen des Parameters defaultMasterpage von document::build_products.
gProducts ProductList Liste der Produkte, die aufgebaut werden sollen. Weitere Informationen zu Produktlisten und Produkten in Listen finden Sie hier.
gProduct Product Dieses Produkt wird gerade aufgebaut. Die Variable hat nur in den Skripttypen kPreRule und kPostRule einen Wert. Diese Variable darf nur gelöscht werden, wenn Sie InDesign® zum Absturz bringen wollen,
gIndexOffset int* Deprecated Aktuell verwendeter Index im Raster des Produktaufbaues. Rasterelemente werden aufsteigend nach ihrer ID verwendet. Eine Erhöhung des Wertes bewirkt, dass beim Produktaufbau entsprechend viele Rasterplätze übersprungen werden. Wird dabei das Seitenende erreicht, wird eine neue Seite angelegt und das Produkt am Seitenanfang platziert.
gErrMess char* Fehlerbeschreibung, maximal 1023 Zeichen.
gPageTemplate Pre/PostRule int* Eingabe ist die ID des aktuellen Seitentemplates. Änderungen des Wertes führen zu einem Seitenwechsel.
gPageTemplateSeq int* Eingabe ist die 1-basierte Sequenznummer des aktuellen Seitenelementes. Durch Änderung des Wertes können Seitenelemente übersprungen werden.

[actions, ClassID 14]

Dieses Skript dient dazu, die Produktliste den aktuellen Gegebenheiten anzupassen. Die SkriptID des Vorbereitungsskriptes wird im Parameter preScript der Skriptanweisung productlist::build angegeben. Ist keine Vorbereitung nötig, bekommt preScript den Wert kNoRule. Wird das Vorbereitungsskript mit einem Fehler beendet (Returnwert != 0), wird die Produktaufbau abgebrochen.

Das Skript kann dazu verwendet werden, die Liste gProducts der Produkte zu verändern, sei es durch Löschen oder durch Einfügen von Objekten. Weitere Informationen zu Produktlisten und Produkten in Listen finden Sie hier.

Das Einfügen von Objekten mit der ID 0 in die Liste ist möglich. Diese Objekte werden als reine Steuerelemente verwendet, d.h. ihre Pre- und Postrules werden ausgeführt, das Objekt selbst aber nicht ins Dokument eingefügt. Sie erreichen aber auf diese Weise nur kurzfristige Erfolge : Das nächste Cleaning des Dokumentes entfernt alle von diesen Objekten angelegten Seiten und füllt alle deren Zwischenräume. Wenn Sie dauerhafte Seitenümbrüche und Abstände erhalten wollen, ist es nötig, die entsprechenden Anweisungen in Objekten zu hinterlegen, die auch ins Dokument eingefügt werden.

Der folgende Aufruf von productlist::build führt vor dem Aufbau das Vorbereitunsskript 301 aus. Wird dieses Skript mit einem Returnwert != 0 verlassen, wird der Aufbau abgebrochen.

productlist::build
  (
    "watched [id3 = 1 or id3=6]",
    kUseDefaultGrid+kShowErrors,
    errMess,
    gFrame, 0,       // Ankerrahmen nicht löschen
    -1, "",          // Zielseite und -ebene
    "C-Doppelseite", // Musterseite
    2, 3,            // Raster und Template
    1,               // Anker
    0.0, 0.0, 0.0, 0.0,
    0,               // Keine Einzelsequenzen 
    "%d. Produkt",   // Progress
    301              // Prescript
 );

[Ab v3.3 R2630] Jedem Template kann ein sogenannten Aufbauhilfe-Skript zugeordnet werden. Wird das Produkt über den Aufbau ins Dokument eingefügt, wird dieses Skript an verschiedenen Stellen des Aufbauprozesses aufgerufen. Globale Variablen beschreiben dabei die Aufrufsituation und die Stelle im Dokument, an der gerade aufgebaut wird. Rahmenlisten enthalten die eingefügten Rahmen des Produktes.

Die Skripte können dazu verwendet werden, um zusätzliche Eigenschaften der eingefügten Rahmen zu testen und Stellplätze eventuell abzulehnen. Sie können hier beispielsweise testen, ob eine Tabelle im aktuellen Rahmen genügend Zeilen zeigt. Auch die Verwaltung zusätzlicher Dokumentrahmen eines Produktes kann hier gemacht werden.

Die Tabelle/Datei pageitems muss um das Attribut/Element buildSupportScript erweitert werden. Das Attribut bekommt den Defaultwert 0. Im Fall von XML-Offline und SOAP/PubServer muß das Element in allen XML-Knoten pageitems.pageitem von pageitems.xml angelegt werden. Nach Neuverbindung ist das Feature freigeschaltet.

Skripte zur Unterstützung des Aufbaus werden in der Tabelle/Datei actions angelegt und müssen die Klassen-ID 48 bekommen. Diese Skripte werden im Popup Aufbauhilfe des Dialogs zur Einstellung von Templates gezeigt. Jedem Template kann genau ein Skript zur Aufbauhilfe zugewiesen werden. Alle Untertemplates (linke/rechte Seite und Fortsetzungen) erhalten dabei die gleiche Zuweisung.

    

Folgenden globalen Variablen sind in den Skripten definiert :
Name Datentyp Beschreibung
gSituation int In welcher Situation wird das Skript aufgerufen? Folgende Werte sind möglich. Die Konstanten sind in "internal/types.h" definiert.
  • kCheckSizeBefore (1) : Die Prüfung der Templategröße gegen das Seitenelement war erfolgreich. Bestätigen Sie den Stellplatz?

    • return 0 : Stellplatz bestätigen
    • return 1 : Stellplatz NICHT bestätigen. Der Import wird beim nächsten Stellplatz versucht
    Die Listen gFrames und gPreviousFrames sind in dieser Situation leer.

  • kProductPlaced (5) : [ab v3.3 R4100] Das Produkt oder eine Fortsetzung eines Produktes ist vollständig geladen, aufgebaut und platziert. Das eingefügte Template kann jetzt nachbearbeitet werden. Wird es dabei vergrößert, kann es über den Satz- oder Seitenspiegel hinausragen.
    gFrames enthält die eingefügten Rahmen des aktuellen Templates (aber nicht die Rahmen bereits fortgesetzer Templates des gleichen Produktes!). gPreviousFrames ist natürlich leer.
    Der Rückgabewert der Funktion wird ignoriert.

  • kCheckSizeAfter (2) : Die Prüfung der eingefügten und geladenen Produktrahmen gegen das Seitenelement war erfolgreich. Bestätigen Sie den Stellplatz?

    • return 0 : Stellplatz bestätigen
    • return 1 : Stellplatz NICHT bestätigen. Der Import wird beim nächsten Stellplatz versucht
    gFrames enthält die eingefügten Rahmen. gPreviousFrames ist leer.

  • kProductPlacedAndFitted (8) : [seit v4.3 R34500] Das Produkt ist eingefügt, geladen und an der richtigen Stelle im Dokument platziert. Im nächsten Schritt wird geprüft werden, ob Textübersätze weitere Fortsetzungen nötig machen. Aber vielleicht wollen Sie den Text ja auch selbst, z.B. durch das Zusammenfügen gleicher Tabellenzellen, verkürzen?
    gFrames enthält die eingefügten Rahmen. Der Rückgabewert wird ignoriert.

  • kBeforeCreateContinue (3) : Mind. ein eingefügter Rahmen kann fortgesetzt werden. Die Rahmen haben ihre endgültige Position und Größe erhalten. Jetzt soll die nächste Fortsetzung angelegt werden. gFrames enthält die Liste des fortzusetzenden Templates. gPreviousFrames ist leer.

  • kAfterCreateContinue (4) : Ein Fortsetzungstemplate wurde erfolgreich eingefügt, geladen und positioniert. Die Rahmen haben ihre endgültige Position und Größe erhalten. gFrames enthält alle Rahmen der Fortsetzung. In gPreviousFrames sind die Rahmen des Vorgängers. Der Rückgabewert der Funktion wird ignoriert.

  • kAfterBuild (20) : Das Produkt ist jetzt vollständig aufgebaut und positioniert. gFrames enthält alle Rahmen inklusive aller Fortsetzungen des Produktes. Der Rückgabewert der Funktion wird ignoriert.
    Zusatzrahmen, die in diesem Schritt angelegt werden, erhalten automatisch eine interne Markierung und werden vor Reorganisationen automatisch gelöscht werden.
    Achtung : Zusatzrahmen und Geometrieänderungen an bestehenden Rahmen können dazu führen, dass Teile des Produktes über den Satzspiegel hinausragen.

  • kUnsolvableOversets (6) : [Ab v3.4 R5700] Seit v3.4 R5700 testet der Produktaufbau, ob übersätze durch Fortsetzungen aufgelöst werden können. Wenn sich nach zwei neuen Seiten mit Fortsetzungen der Übersatz nicht verändert hat, gibt der Produktaufbau auf. Am Ende jeden Produktes, das solche unauflösbaren Textketten enthält, wird die Aufbauhilfe ausgeführt. In der Liste gFrames finden Sie jeweils die ersten Rahmen der Textketten, die nicht aufgelöst werden können. Sie können die fraglichen Rahmen hier beispielsweise rot einfärben oder sonstwie markieren.

  • kProductFinished (21) : [Ab v4.0.5 R20012] Nachdem das Produkt vollständig aufgebaut und positioniert wurde, wurden jetzt auch alle Textverdrängungen und Comet-Notizen aktualisiert und alle Produktrahmen zu einer neuen Cometgruppe zusammengefasst. gFrames enthält alle Rahmen inklusive aller Fortsetzungen des Produktes.
    Sie können hier Rahmen hinzufügen, die nicht Teil der Comet-Gruppe werden. Achtung: Die Rahmen werden von der Reorganisation nicht automatisch behandelt.
    Der Rückgabewert der Funktion wird ignoriert.

gPageNum int 1-basierte Seitennummer an der sich der Aufbau gerade befindet.
gTemplateID, gTemplateName int, char* Aktuelles Template aufgelöst nach Seitentyp und Fortsetzung.
gPageTemplateID, gPageTemplateName int, char* Aktuelles Seitentemplate aufgelöst nach dem Seitentyp, Weitere Informationen über das Seitentemplate können Sie mit Hilfe der Funktionen page::templates::~ erhalten.
gElement, gElementName int, char* 1-basiertes Seitenelement und dessen Name. Weitere Informationen über das Seitenelement können Sie mit Hilfe der Funktionen page::templates::~ erhalten.
gGridPosX, gGridPosY float, float [Ab v4.0.5 R18348] Aktuelle Position relativ zum 1:N-Element
gElementLeft, gElementTop, gElementRight, gElementBottom float, float, float, float [Ab v4.0.5 R18348] Seitenrelative Koordinaten des aktuellen Seitenelementes in Punkten.
gFrames ItemList Aktuelle Rahmenliste wie in Zeile gSituation beschrieben.
gPreviousFrames ItemList Liste der Rahmen des Vorgänger-Untertemplates (nur bei Fortsetzungen im Fall von kAfterCreateContinue) gefüllt.
gProducts ProductList Gesamte Liste der aufzubauenden/reorganisierenden Produkte.

Warnungen!
  • Die Liste und ihre Einträge dürfen nicht geändert werden! Änderungen an der Liste haben keinen Einfluß auf den Produktaufbau.
  • Die Liste kann Seitentemplate-Einträge enthalten. Wenn Sie Einträge der Liste verwenden, sollten Sie daher den Objekttyp prüfen (product::get (..., kProductType)).
  • Die Liste kann Einträge haben, die nicht mit aufgebaut werden sollen, weil Sie im Datenbestand als "zu löschen" markiert sind. Sie sollten diese Eigenschaft der Produkte also prüfen, wenn Sie die Listeneinträge verwenden (product::get (..., kProductDoDelete)).
gProductsDirect ProductList [Ab v4.0.5 R18348] Gesamte Liste der aufzubauenden/reorganisierenden Produkte, siehe gProducts eine Zeile weiter oben.

Im Unterschied zu gProducts werden Änderungen an dieser Liste vom Produktaufbau ausgewertet. Weitere Informationen zu Produktlisten und Produkten in Listen finden Sie hier.

Warnungen!
  • Das aktuelle Objekt darf nicht aus der Liste gelöscht werden.
  • Änderungen der aktuellen Listenposition und Einfügen oder Löschen von Objekten vor dem aktuellen Objekt können zu unerwarteten Ergebnissen beim Produktaufbau führen!
  • Zusätzlich eingefügte Rahmen werden bei Reorganisationen erneut eingefügt. Um das zu verhindern, müssen die eingefügten Rahmen geeignet markiert werden (z.B. mit frame::set_script_tag), so dass die Rahmen wiedergefunden und entweder gelöscht oder wiederverwendet werden können. Alternativ können Sie prüfen, ob zusätzliche Rahmen auch als Produkt-Trailer eingefügt werden können.
gProduct Product Dieses Produkt wird gerade aufgebaut. Das Objekt darf nicht geändert oder gelöscht werden!

Änderungen am Inhalt des Objektes sind erlaubt an allen Attribute mit Ausnahme von kDefined, kLevel, kLevel, kProductDocPosition, kProductTextmodel, kProductStart, kProductEnd, kProductLayer und kProductOriginals. Bitte beachten Sie aber, dass Änderungen mglw. keinen Einfluß mehr auf den Produktaufbau haben weil die entsprechende Eigenschaft schon längst ausgewertet wurde.
gProductCounter int 1-basierter Zähler der aufgebauten Produkte. Seitentemplates in der Liste gProducts werden dabei nicht mitgezählt. Um den Index von gProduct in gProducts zu ermitteln, verwenden Sie productlist::get_pos (gProducts, gProduct).
gImporter int* [Ab v4.0.5 R18348] Ausführender Produktaufbau. Die Variable hat nur in der Situation kCheckSizeBefore einen Wert, sonst ist sie 0. Der Wert kann für Produkt-Trailer in Aufrufen der Funktion itemlist::convert_to_trailer verwendet werden.
gPage int* [Ab v4.2 R30852] Die Variable unterstützt das Anlegen zusätzlicher Seiten im Produktaufbau und wird nur in der Situation kProductPlaced ausgewertet. Hat ihre Aufbauhilfe zusätzliche Seiten angelegt, gibt der Inhalt die (1-basierte) Seitennummer an, auf der der Aufbau fortgesetzt werden soll.
gNewFrames ItemList [Ab v4.2 R30852] Die Liste unterstützt das Anlegen zusätzlicher Seiten im Produktaufbau und wird nur in der Situation kProductPlaced ausgewertet. In die Liste müssen alle Rahmen eingetragen werden, die beim Anlegen neuer Seiten erzeugt wurden.

Während des Aufbaus ist die Cometgruppe des Produktes, das gerade aufgebaut wird, noch nicht verfügbar. Funktionen wie frame::get_cometgroup_member werden im Aufbauhilfeskript also voraussichtlich nicht funktionieren - jedenfalls nicht für Rahmen des aktuellen Produktes.

Der folgende Film zeigt den Aufbau eines Produktes in allen einzelnen Schritten. Bevor das Aufbauhilfeskript gerufen wird, erscheint dabei jeweils kurz ein farbiger Rahmen mit dem Namen der Aufbau-Situation. Sie können also ziemlich gut erkennen, wann und mit welcher Situation das Skript gerufen wird. Im unteren Filmbereich wird in jedes Bild kurz beschrieben.

Die Bilder des Filmes wurden mit Hilfe der Aufbauverfolgung (Menü Produktrecherche -> Verschiedenes -> Aufbauverfolgung) gemacht.

Die Zusatzbilder für die Aufbau-Situation wurden mit productlist::trace_build im Aufbauhilfeskript selbst erzeugt.

#include "internal/types.h"
int snapshot (char * name, int r, int g, int b) {    ItemRef f = item::alloc ();    char tt [5000];
   strcpy (tt, "%!TT<cTypeface:37 Thin Condensed>");    strcat (tt, "<cSize:24.000000>");    strcat (tt, "<cFont:Helvetica Neue LT Std>");    strcat (tt, name);
   frame::create (f, kRectangle, 36.0, 36.0, 200.0, 370.0, gPageNum);    frame::color_rgb (f, r, g, b);    frame::insert (f, tt);
   productlist::trace_build (0, gPageNum, name);
   frame::remove (f);    item::release (f);
   return 0; }
int main () {    if (gSituation == kCheckSizeBefore) snapshot ("kCheckSizeBefore", 255, 0, 0);    if (gSituation == kProductPlaced) snapshot ("kProductPlaced", 255, 128, 0);    if (gSituation == kCheckSizeAfter) snapshot ("kCheckSizeAfter", 0, 255, 0);    if (gSituation == kBeforeCreateContinue) snapshot ("kBeforeCreateContinue", 128, 255, 0);    if (gSituation == kAfterCreateContinue) snapshot ("kAfterCreateContinue", 0, 0, 255);    if (gSituation == kAfterBuild) snapshot ("kAfterBuild", 0, 128, 255);    if (gSituation == kUnsolvableOversets) snapshot ("kUnsolvableOversets", 255, 255, 0);    if (gSituation == kProductFinished) snapshot ("kProductFinished", 0, 255, 255);
   return 0; }

Eine schöne Anwendung des Aufbauhilfeskriptes sind die sogenannten Produkt-Trailer, die aufgebaute Produkte nach bestimmten Kriterien voneinander trennen sollen. Hier finden Sie eine ausführliche Beschreibung.

Mit dem folgenden Skript wird der zweite Stellplatz eines Seitentemplates immer übersprungen.

#include "internal/types.h"
int main () {    int result = 0;
   if (gSituation == kCheckSizeBefore && gElement == 2) result = 1;    return result; }

Das zweite Beispiel ist etwas komplexer : An jeden Produktteil, der eine Fortsetzung bekommen hat, wird ein zusätzlicher Rahmen mit dem Text "Fortsetzung auf Seite ..." hizugefügt.

#include "internal/types.h"
int main () {    ItemRef frame = item::alloc ();    ItemRef fr = item::alloc ();    ItemRef fr2 = item::alloc ();    ItemList inserted = 0;    float l, t, r, b;    char txt [5000];    int result = 0;
   if (!gFrames) return 0;    if (!itemlist::length (gFrames)) return 0;    if (!itemlist::get (gFrames, frame, 0)) return 0;    if (!frame::is_valid (frame)) return 0;
   // CheckSizeBefore    // Löschen von Rahmen, die bei Fortsetzungen angelegt wurden.    // Hier ist das der Rahmen "Z".    while (1)    {       if (gSituation != kCheckSizeBefore) break;
      frame::get_cometgroup_member (frame, "Z", fr);       if (!frame::is_valid (fr)) break;
      frame::remove (fr);
      break;    }
   // CheckSizeAfter    while (1)    {       if (gSituation != kCheckSizeAfter) break;
      break;    }
   // BeforeCreateContinue    while (1)    {       // Einfügen eines Textrahmen für den Text "Weiter auf Seite ..."       // Der Rahmen darf nicht erst bei kAfterCreateContinue angelegt       // werden, sonst kann er nicht mehr dieser Untergruppe zugeordnet werden.       if (gSituation != kBeforeCreateContinue) break;
      frame::get_cometgroup_member (frame, "E", fr);       if (!frame::is_valid (fr)) break;
      if (!textmodel::overset (fr)) break;
      // Das Template 472 hat einen Textrahmen mit der Kennung 'Z' und       // zwei Gestaltungsregeln, die den Rahmen rechts unten an "E" ausrichten.       frame::bbox (fr, &l, &t, &r, &b);       inserted = document::place_items (0, "", "", 472, l, t, page::get (fr));       if (inserted) itemlist::release (inserted);
      break;    }
   // AfterCreateContinue    while (1)    {       // gFrames : Rahmen der Fortsetzung       // gPreviousFrames : Rahmen, die fortgesetzt wurden
      if (gSituation != kAfterCreateContinue) break;
      // Text mit Seitennummer       sprintf (txt, "Weiter auf Seite %d", page::get (frame));
      // Rahmen "Z" im Vorgänger suchen und dort die Seitennummer       // der Fortsetzung eintragen       if (!itemlist::length (gPreviousFrames)) break;       if (!itemlist::get (gPreviousFrames, fr,0)) break;       if (!frame::is_valid (fr)) break;       frame::get_cometgroup_member (fr, "Z", fr);       if (!frame::is_valid (fr)) break;
      frame::replace (fr, txt);
      break;    }
   return result; }

Das Beispiel zeigt, wie zusätzliche Seiten an ein Produkt angefügt werden können. Beachten Sie bitte, dass das Anlegen zusätzlicher Seiten nur in der Situation kProductPlaced unterstützt wird. Zusätzlich angelegte Rahmen sind nicht Teil der Cometgruppe des Produktes.

Für neu angelegte Seiten muß unbedingt ein Seitentemplate definiert werden!

Das Skript legt drei zusätzliche Seiten mit jeweils einem neuen Rahmen hinter dem Produkt an.

#include "internal/types.h"
int main () {    ItemRef   fr    = item::alloc ();    int       i;    char      txt [255];
   while (1)    {       if (gSituation == kProductPlaced)       {          if (!gFrames)      break;
         page::create (3, gPageNum+1); // Create 3 pages          for (i = 1; i < 4; i++)          {             page::set_info (0, gPageNum+i, "id", gPageTemplateID); // Define the page template
            sprintf (txt, "Pg. %d", gPageNum+i);             frame::create (fr, kRectangle, 0.0, 0.0, 200.0, 200.0, gPageNum+i);             frame::replace (fr, txt);             frame::color_rgb (fr, 255, 128, 0);             itemlist::append (gNewFrames, fr); // Register new created frame          }          *gPage    = *gPage + 3; // Set the new page number       }
      break;    }
   return 0; }

[Ab v3.3 R2630] Vor dem Einsetzen eines Produktes kann das Template ein Ersatztemplate berechnen, mit dem das Produkt platziert wird. Die klassische Anwendung ist, dass das erste Produkt einer Seite mit einem anderen Templates aufgebaut wird als alle anderen Produkte der Seite. Das Problem ist nicht lösbar dadurch, dass den Produkten die entsprechenden Template-IDs mitgegeben werden - Sie kennen ja die Seitenumbrüche noch nicht.

Wie das Ersatztemplate berechnet werden soll, wird im Template unter dem Punkt "Ersatztemplate" eingestellt. Die Einstellung gilt jeweils für alle Untertemplates eines Templates (links, rechts, Fortsetzungen). Das Skript wird im Seitenaufbau ausgeführt, wenn Template und Seitenelement bestimmt wurden. Der Aufbau prüft dann, ob das Template noch in das Seitenelement passt und sucht möglicherweise nach einem neuen Seitenelement (und führt das Skript dann noch mal aus.) Außerhalb des Produktaufbaus (z.B. wenn ein Produkt per Drag and Drop platziert wird), wird das Skript genau einmal ausgeführt - nämlich in dem Moment, wenn das Template geladen werden soll.

Wird für ein Template ein Ersatztemplate verwendet, sollten Sie im Ersatztemplate eine inverse Berechnung des Ersatztemplates angeben, sonst kann ja Ihr Ersatztemplate bei Seitenreorganisationen nicht mehr ersetzt werden : Verwendet A etwa das Ersatztemplate B und B rutscht bei einer Reorganisation auf einen A-Platz, muss B ja wieder durch A ersetzt werden.

Das Attribut bekommt den Defaultwert 0. Nach Neuverbindung ist das Feature freigeschaltet.

Skripte zur Berechnung eines Ersatztemplates werden in der Tabelle/Datei actions angelegt und müssen die Klassen-ID 15 bekommen. Diese Skripte werden im Popup Ersatztemplate des Dialogs zur Einstellung von Templates gezeigt. Jedem Template kann genau ein Skript zur Berechnung des Ersatztemplates zugewiesen werden. Alle Untertemplates (linke/rechte Seite und Fortsetzungen) erhalten dabei die gleiche Zuweisung.

Folgenden globalen Variablen sind in den Skripten definiert :
Name Datentyp Beschreibung
gPageitemID int* Aktuelle Template-ID. Soll ein anderes Template verwendet werden, kann der Wert der Variable entsprechend geändert werden.
gPositionX_out, gPositionY_out float* Wird ein wiederholendes Element eingefügt, enthalten die Variablen die aktuelle XY-Position in Punkten, an der das Element eingefügt werden wird. Änderungen der Werte müssen mit *gPosition_changed = 1; im Skript bestätigt werden.
gPosition_changed int* Soll ein wiederholendes Element an einer abweichenden Position platziert werden, ändern Sie die Werte von gPositionX_out und gPosition_out. Mit *gPosition_changed = 1; bestätigen Sie die Änderungen.
gPageitemName char* [Ab v3.3 R2630] Templatename

"" bei Aufrufen außerhalb des Seitenaufbaus (z.B. beim manuellen Platzierenen eines Produktes)
gPage int Nummer der Seite, auf der das aktuelle Template eingefügt werden soll (1-basiert).
gLayer char* Layer, auf dem das Template eingefügt werden soll. Die Variable enthält nicht den aktuellen Layer, sondern die Layerangabe des Skriptes, durch das das Template eingefügt werden soll, also etwa den Wert des Parameters layer im Aufruf von document::insert_macro.
gPositionX, gPositionY float, float Position, an der das Template, das das Skript auslöst, eingesetzt werden soll.

Achtung Befindet sich der Seitenaufbau innerhalb eines 1:N-Rasterplatzes, sind die Positionsangaben nicht immer identisch mit der tatsächlichen Einfügeposition im Dokument. Der nächste freie Rasterplatz kann ja erst nach der Bestimmung des Templates (und dessen Größe) ermittelt werden.
gGridPosX, gGridPosY float, float [Ab v3.3 R2630] Einfügeposition innerhalb eines 1:N-Elements relativ zum Element

Achtung Befindet sich der Seitenaufbau innerhalb eines 1:N-Rasterplatzes, sind die Positionsangaben nicht immer identisch mit der tatsächlichen Einfügeposition im Dokument. Der nächste freie Rasterplatz kann ja erst nach der Bestimmung des Templates (und dessen Größe) ermittelt werden.

0.0, 0.0 : bei Aufrufen außerhalb des Seitenaufbaus (z.B. beim manuellen Platzierenen eines Produktes)
gElementLeft, gElementTop, gElementRight, gElementBottom float, float, float, float [Ab v3.3 R2630] Koordinaten des aktuellen Seitenelementes
gElement, gElementName int, char* [Ab v3.3 R2630] Aktuelles Seitenelement des Aufbaus (1-basiert). Achtung Bei 1:N-Elementen können mehrere Skriptaufrufe mit dem gleichen Element gemacht werden. Testen Sie in diesem Fall auch die Variablen gGridPosX und gGridPosY.

0, "" : bei Aufrufen außerhalb des Seitenaufbaus (z.B. beim manuellen Platzierenen eines Produktes)
gPageTemplateID, gPageTemplateName int, char* [Ab v3.3 R2630] Aktuelles Seitentemplate des Aufbaus.

0, "" : bei Aufrufen außerhalb des Seitenaufbaus (z.B. beim manuellen Platzierenen eines Produktes)
gProducts, gProduct, gProductCounter Product, ProductList, int [Ab v3.3.1 R3226] Die Variablen enthalten beim Seitenaufbau und bei Reorganisationen die aktuellen Produktangaben. Beim einfachen Einfügen von Templates oder Produkten sind sie leer.

In Versionen vor Comet 3.3 wird das Skript zur Berechnung eines Ersatztemplates nur einmal aufgerufen - und zwar genau vor dem eigentlichen Einsetzen des Templates. Die Berechnung des Ersatztemplates ist in Versionen vor v3.3 nicht "aufräum-resistent", d.h. ein einmal verwendetes Template wird höchstens noch seitenspezifisch ersetzt, anders nicht mehr.

Im Seitenaufbau sind die Variablen gPositionX und gPositionY immer 0.0. Eine Reihe anderer Variablen (z.B. gElement) sind gar nicht definiert. Soll Ihr Skript für ältere Comet-Versionen funktionieren, müssen die 3.3-kompatiblen Skriptteile mit folgender Bedingung ausgeklammert werden :

    if (fval (system::comet_version ()) > 3.2)

Die oben beschriebene Anwendung, dass das erste Produkt einer Seite ein anderes Template bekommen soll als alle weiteren Produkte der Seite können Sie mit folgenden Anweisungen erreichen :

    ItemList pl = itemlist::pageframes (gPage);
    :
    if (itemlist::length (pl) == 0)
    :

Verwenden Sie beim Seitenaufbau Gestaltungsebenen, müssen Sie von der Liste pl zudem alle Rahmen dieser Ebenen abziehen.

Das erste Produkt einer Seite bekommt ein anderes Template als alle weiteren Produkte der Seite. Das Skript enthält auch die inverse Berechnung des Ersatztemplates. Alternativ könnten Sie natürlich auch zwei verschiedene Skripte erstellen.

int main ()
{	
    if (datapool::get_main_template (*gPageitemID) == 468)
    {
        if (gElement == 1 && gGridPosX == 0.0 && gGridPosY == 0.0)
        {
            *gPageitemID = 399;
        }
    }
    else if (datapool::get_main_template (*gPageitemID) == 399)
    {
        if (gElement > 1 || gGridPosX != 0.0 || gGridPosY != 0.0)
        {
            *gPageitemID = 468;
        }
    }
    return 0; }

Das erste und letzte Produkt eines Kapitels erhalten jeweils ein abweichendes Template.

#include "internal/products.h"
int stFirst = 210; int stInner = 206; int stLast = 214;
int main () {     int pos = -1;     Product p;
    *gPageitemID = stInner;
    while (1)     {         // Erstes Produkt eines Kapitels?         // Das Produkt ist das erste der Liste oder sein Vorgänger ist ein Seitentemplate.         pos = productlist::get_pos (gProducts, gProduct, 1);         if (pos < 0) break;
        p = productlist::prev (gProducts);         if (!p || product::get (p, kProductType) == 4)         {             *gPageitemID = stFirst;             break;         }
        // Letztes Produkt eines Kapitels?         // Das Produkt ist das letzte der Liste oder sein Nachfolger ist ein Seitentemplate.         pos = productlist::get_pos (gProducts, gProduct, 1);         if (pos < 0) break;
        p = productlist::next (gProducts);         if (!p || product::get (p, kProductType) == 4)         {             *gPageitemID = stLast;             break;         }
        break;     }
    return 0; }

[Ab v3.3 R2690] Produkte können auf vorher festgelegten Seitenelementen platziert werden. Auch hier wird natürlich geprüft, ob der gewünschte Stellplatz noch frei und groß genug ist. Im Gegensatz zur freien Platzierung wird hier aber nicht im nächsten Seitenelement weitergemacht, wenn das Seitenelement nicht (mehr) verwendet werden kann. Hier wird dann eine neue Seite angelegt und das Produkt auf dem gewünschten Stellplatz der neuen Seite platziert.

1:N-Rahmen sind als Ziel für feste Platzierungen ungeeignet. Für den Konflikt zwischen festgelegtem Seitenelement und freier Platzierung im Seitenelement gibt es keine eindeutige Lösung.

Stellplatznummern in den Produkten müssen nicht aufsteigend sein. Sie können Produkte auch "rückwärts" platzieren. Aber auch in diesem Fall gilt : Der gewünschte Stellplatz muss frei und groß genug sein.

Fortsetzungen von Produkttemplates werden in den nächsten freien Seitenelementen angelegt, nicht wieder im festgelegten Seitenelement (was ja in diesem Fall ganz sicher jedesmal eine neue Seite generieren würde).

Für das Feature sind keine weiteren Installationen nötig.

Die Angabe der Stellplätzen erfolgt immer über die (1-basierte) Nummer der Seitenelemente. (Das sind die großen Zahlen, die Sie in den Seitenelementen sehen.) Seitenelemente können auf drei Arten festgelegt werden.

Die Produkte können bereits mit einem festgelegten Seitenelement geladen werden. Den Wert dazu liefert das zugehörige Panel- oder Findstatement im seinem vorletzten Parameter. Die Rückgabewerte von Panel- und Findstatements von Produkten sind hier beschrieben.

Um das Seitenelement eines Produktes in Skripten zu setzen verwenden Sie product::set mit dem Selektor kElementid.

Diese Möglichkeit bietet Ihnen völlig freie Hand bei der Vergabe der Seitenelemente. Anstelle einer festen Sequenznummer können Sie als Stellplatz auch eine ActionID angeben. Diese Aktion wird jedesmal dann ausgeführt, wenn Produktaufbau/Reorganisation das Seitenelement für das Produkt bestimmen müssen. ActionIDs werden als negative Zahlen angegeben.

Soll etwa das Skript mit der ID 20045 ausgeführt werden, geben Sie für die ElemenID des Produktes -20045 an.

Folgenden globalen Variablen sind in den Skripten definiert :
Variable Typ Beschreibung
gPageNum int aktuelle Seitennummer (1-basiert)

Unter InDesign® Server und comet_pdf ist die aktuelle Seite nicht definiert.

gTemplateID int aktuelles Template
gTemplateName char*
gPageTemplateID int aktuelles Seitentemplate
gPageTemplateName char*
gElement int aktuelles Seitenelement
gElementName char*
gSeq int* Die Variable enthält bei Skriptstart die Nummer des Seitenelementes, das als nächstes verwendet werden wird. Der Wert zum Skriptende wird als gewünschte Sequenznummer verwendet.

überspringe das zweite Seitenelement.

int main ()
{	
    if (*gSeq == 2) *gSeq = 3;
    return 0; }

Beim Textaufbau können Trenntexte zwischen den einzelnen Produkten eingefügt werden. Die Konfiguration erfolgt über das Template. Informationen zu Trenntexten finden Sie hier.

static Product product::alloc()

Erzeuge ein neues leeres Objekt vom Typ Product. Alle Werte des neuen Produktes werden mit 0 bzw. dem Leerstring initialisiert.

Weitere Informationen zu Produktlisten und Produkten in Listen finden Sie hier.

Name Typ Default Beschreibung
Return Product   Zeiger auf ein neues Produkt-Objekt
#include "internal/types.h"

Version 1.2.2 (24. Nov. 2004)

priint:comet InDesign® Plug-Ins, comet_pdf

release
productlist::clear
productlist::insert
productlist::append
clone

static Product product::clone(Product org)

Erzeuge eine Kopie eines Produktes.

Weitere Informationen zu Produktlisten und Produkten in Listen finden Sie hier.

Name Typ Default Beschreibung
Return Product   Zeiger auf ein neues Produkt-Objekt
org Product - Original, dessen Werte übernommen werden sollen
#include "internal/types.h"

Version 1.2.2 (24. Nov. 2004)

priint:comet InDesign® Plug-Ins, comet_pdf

release
productlist::clear
productlist::insert
productlist::append

static void product::release(Product p)

Lösche ein Produkt-Objekt aus dem Arbeitsspeicher.

Weitere Informationen zu Produktlisten und Produkten in Listen finden Sie hier.

#include "internal/types.h"

Version 1.2.2 (24. Nov. 2004)

priint:comet InDesign® Plug-Ins, comet_pdf

productlist::clear
productlist::remove

static void product::set(
  Product p,
  int selector,
  int v)

Setze einen Wert des Produktobjektes. Der Befehl benötigt den Include

#include "internal/products.h"

Name Typ Default Beschreibung
p Product - Gültiges Produktobjekt
selector int - Welcher Wert des Objektes soll gesetzt werden?

kID (int)
kID2 (int)
kID3 (int)
kStringID (String oder char*)
kPageitemid (int)
kDocid (int)
kMasterpage (String oder char*), Nur in PageTemplate-Objekten verwendet
Deprecated kGrid (String oder char*)
Deprecated kGridid (int)
Deprecated kElement (String oder char*)
Deprecated kElementid (int)
Deprecated kNeedsrequest (int)
Deprecated kDefined (int)
kLevel (int) - Schachtlungstiefe in der Produktrecherche. In Skripten zum Laden der Produktrecherche wird der Wert für das Icon in der Palette verwendet.
kSubstatement (int) - Panelstatement zum Laden der Untereinträge
kClassid (int)
kRow1 (String oder char*)- Anzeigetext der ersten Spalte der Produktrecherche
kRow2 (String oder char*) - Anzeigetext der zweiten Spalte der Produktrecherche
kPreRuleid (int)
    kNoRule
    Deprecated kNewPage
    Deprecated kNewLeftPage
    Deprecated kNewRightPage
    sonst : ID des auszuführenden Skriptes
Deprecated kPreRuleparams (String oder char*)
kPostRuleid (int)
    kNoRule
    sonst : ID des auszuführenden Skriptes
Deprecated kPostRuleparams (String oder char*)
Deprecated kAdparams (String oder char*) - Zuätzliche Angaben zur Platzierung von Werbebannern
kProductDocPosition (int) [Ab v3.3, R3144, 4. Sept. 2012]
kProductToDelete (int) [Ab v3.3, R3144, 4. Sept. 2012]

kProductKeepWithNext (int) [Ab v4.2 R31672, 26. Sep. 2022] Produkt mit nächstem Produkt der Liste zusammenhalten. Die Einstellung wird nur unterstützt, wenn das verwendete Template keine definierte Fortsetzung hat. Es können nur jeweils zwei Produkte zusammengehalten werden!

kProductInfos1, kProductInfos2 (String oder char*) [Ab v4.1.6 R26627] Inhalt für Infos1 bzw. Infos2 der Platzhalter im Produkttemplate. Die Werte werden vor dem Laden der Platzhalter eingesetzt.

kProductApplyInfos1, kProductApplyInfos2 (int) [Ab v4.1.6 R26627] In welchen Platzhaltern sollen Infos1 bzw. Infos2 gesetzt werden?
  • 0 : Keine
  • 1 : Textplatzhalter
  • 2 : Rahmenplatzhalter
  • 3 : alle Platzhalter
[Ab Comet 3.2, R 2110, 7. Sept. 2010] Die folgenden Werte werden von productlist::reorganization ausgewertet:
kSnippetAttr (String oder char*)
kProductTextmodel (ItemRef)
kProductStart (int)
kProductEnd (int)
kProductType (int)
  • 0 : Normal
  • 1 : Neues Produkt
  • 2 : Verschoben
  • 3 : Gelöscht
  • 4 : Seitentemplate. Die ID des Seitentemplates wird mit kID gesetzt.
  • 5 : Snippet. Die ID des Snippets wird mit kID gesetzt und snippets.xml muß existieren.

kProductLayer (ItemRef)
kProductTagID1 (int)
kProductTagID2 (int)
kProductPageType (int)
    0 : linke Seite
    1 : (neue) Seite
    2 : rechte Seite
kProductOriginals (ItemList)

[Ab Comet 3.1, R 1724, 5. Feb. 2009] In der Liste gProducts, die in Skripten zum Laden der Previewpalette verwendet wird, werden die folgenden Angaben zum Setzen der Previewwerte verwendet:
kID (int)
kID2 (int)
kID3 (int)
kStringID (String oder char*)
kPreviewName (String oder char*)
kPreviewPath (String oder char*)
kPreviewFormat (String oder char*)
kPreviewWidth (String oder char*)
kPreviewHeight (int)
kPreviewResolution (String oder char*)
kPreviewBitDepth (int)
kPreviewTextName (String oder char*)
kPreviewInfo1 (String oder char*)
kPreviewInfo2 (String oder char*)
kPreviewText (String oder char*)
kPreviewClassID (int)
kPreviewToDelete (int)
kPreviewSnippetTable (String oder char*)
kPreviewSnippetAttribute (String oder char*)
kPreviewButtonState (int), ab v3.2.2
kPreviewLinkScript (int), ab v3.2.2
v int/String oder char* - Neuer Wert. Der Datentyp des Wertes ist abhängig vom angegebenen Selector, siehe oben. Nicht korrekte Datentypen können zu Abstürzen führen.
#include "internal/products.h"

Mit Seitentemplate-Einträge in der Liste gProducts können Sie Seitenwechsel erzwingen. So erzeugen Sie ein neues Seitentemplate-Objekt für die Liste gProducts:

Product  p = product::alloc (kScriptStack);
:
product::set (p, kProductType, 4); product::set (p, kID, your_pagetemplate_id);
// ... und wenn es unbedingt eine linke Seite sein soll... product::set (p, kProductPageType, 0);

Die Produkte der aktuellen Auswahl sollen jeweils auf eine neue linke Seite platziert werden.

#include "internal/types.h"
#include "internal/products.h"
int main() { ProductList pl = productlist::get ("selected"); Product p; Product p2; int i;
for (i=0; i < productlist::length(pl); i++) { p2 = product::alloc (kScriptStack); product::set (p2, kProductType, 4); product::set (p2, kID, your_page_template-id); product::set (p2, kProductPageType, 0); productlist::insert (pl, p2, i, 1); i = i + 1; }
productlist::establish(pl, 0, 0, "", 1, 0, kShowProgress, 0, 0, "", 0, 0);
productlist::release(pl); return 0; }

Version 1.2.2 (24. Nov. 2004)

priint:comet InDesign® Plug-Ins, comet_pdf

get
gets

static int product::get(Product p, int selector)

Hole einen integer-Wert aus dem Produktobjekt. Der Befehl benötigt den Include

#include "internal/products.h"

Name Typ Default Beschreibung
Return int   Aktueller Wert, read-only!. Das Ergebnis darf nicht verändert werden. Beim nächsten Aufruf der Funktion wird der Wert überschrieben!
p Product - Gültiges Produktobjekt
selector int - Welcher Wert des Objektes soll geholt werden?

kID
kID2
kID3
kPageitemid
kDocid
Deprecated kGridid
Deprecated kElementid
Deprecated kNeedsrequest
Deprecated kDefined
kLevel - Schachtlungstiefe in der Produktrecherche
kSubstatement
kClassid
kPreRuleid
kPostRuleid
kProductDocPosition span[Deutlich]{[Ab v3.3, R3144, 4. Sept. 2012|}
kProductToDelete [Ab v3.3, R3144, 4. Sept. 2012]

kProductKeepWithNext (int) [Ab v4.2 R31672, 26. Sep. 2022] Produkt mit nächstem Produkt der Liste zusammenhalten. Die Einstellung wird nur unterstützt, wenn das verwendete Template keine definierte Fortsetzung hat. Es können nur jeweils zwei Produkte zusammengehalten werden!

kProductApplyInfos1, kProductApplyInfos2 : [Ab v4.1.6 R26627] In welchen Platzhaltern soll Infos1 bzw. Infos2 gesetzt gesetzt werden? Die Werte werden nur beim Einfügen von Templates verwendet und nicht aus dem Dokument gelesen.
  • 0 : Keine
  • 1 : Textplatzhalter
  • 2 : Rahmenplatzhalter
  • 3 : alle Platzhalter

[Ab Comet 3.2, R 2110, 7. Sept. 2010] Die folgenden Werte werden von productlist::reorganization ausgewertet:
kProductStart (int)
kProductEnd (int)
kProductType (int)
  • 0 : Normal
  • 1 : Neues Produkt
  • 2 : Verschoben
  • 3 : Gelöscht
  • 4 : Seitentemplate. Die ID des Seitentemplates wird mit kID gesetzt.
  • 5 : Snippet. Die ID des Snippets wird mitkID gesetzt und snippets.xml muß existieren.

kProductTagID1 (int)
kProductTagID2 (int)
kProductPageType (int) seit Version 3.2 R2267, 7. Feb. 2011

[Ab Comet 3.1, R 1724, 5. Feb. 2009] In der Liste gProducts, die in Skripten zum Laden der Previewpalette verwendet wird, werden die folgenden Angaben zum Lesen der Previewwerte verwendet:
kID (int)
kID2 (int)
kID3 (int)
kPreviewHeight (int)
kPreviewResolution (char*)
kPreviewBitDepth (int)
kPreviewClassID (int)
kPreviewToDelete (int)
kPreviewButtonState (int), ab v3.2.2
kPreviewLinkScript (int), ab v3.2.2
#include "internal/products.h"

Version 1.2.2 (24. Nov. 2004)

priint:comet InDesign® Plug-Ins, comet_pdf, Illustrator

gets
set
comet.CProduct.getAttribute
comet.CProduct.getID
comet.CProduct.getName

static char* product::gets(Product p, int selector)

Hole einen String-Wert aus dem Produktobjekt. Der Befehl benötigt den Include

#include "internal/products.h"

Name Typ Default Beschreibung
Return char*   Aktueller Wert

Der Rückgabewert darf nicht verändert werden und wird bei folgenden Aufrufen der Funktion überschrieben. Hier finden Sie Informationen zu readonly-Rückgaben von Funktionen.

Bei Fehlern wird ein Leerstring zurückgegeben.
p Product - Gültiges Produktobjekt
selector int - Welcher Wert des Objektes soll ermittelt werden?

kStringID
kMasterpage Nur in PageTemplate-Objekten verwendet
Deprecated kGrid
Deprecated kElement
kRow1 - Anzeige text der ersten Spalte der Produktrecherche
kRow2 ( - Anzeige text der zweiten Spalte der Produktrecherche
kPreRuleparams
kPostRuleparams
kAdparams
kSnippetAttr (char*)

kProductInfos1, kProductInfos1 (String oder char*) [Ab v4.1.6 R26627] Inhalt für Infos1 bzw. Infos2 der Platzhalter im Produlttemplate. Die Werte werden ausschließlich beim Einsetzen von Templates verwendet und nicht aus dem Dokument gelesen.

[Ab Comet 3.1, R 1724, 5. Feb. 2009] In der Liste gProducts, die in Skripten zum Laden der Previewpalette verwendet wird, werden die folgenden Angaben zum Lesen der Previewwerte verwendet:
kStringID (char*)
kPreviewName (char*)
kPreviewPath (char*)
kPreviewFormat (char*)
kPreviewWidth (char*)
kPreviewResolution (char*)
kPreviewTextName (char*)
kPreviewInfo1 (char*)
kPreviewInfo2 (char*)
kPreviewText (char*)
kPreviewSnippetTable (char*)
kPreviewSnippetAttribute (char*)
#include "internal/products.h"

Version 1.2.2 (24. Nov. 2004)

priint:comet InDesign® Plug-Ins, comet_pdf, Illustrator

get
set
comet.CProduct.getAttribute
comet.CProduct.getID
comet.CProduct.getName

static int product::get_itemref(
  Product p,
  int selector,
  ItemRef result = 0)

Hole einen ItemRef-Wert aus dem Produktobjekt. Der Befehl benötigt den Include

#include "internal/products.h"

Name Typ Default Beschreibung
Return int   0 oder Fehlercode
p Product - Gültiges Produktobjekt
selector int - Welcher Wert des Objektes soll ermittelt werden?

kProductTextmodel : Referenz auf das Textmodel
kProductLayer : referenz auf die Ebene
result ItemRef 0 Allokierter Speicher für das Ergebnis oder 0
#include "internal/products.h"

Version 3.2 R2110, 7. Sept. 2010

priint:comet InDesign® Plug-Ins, comet_pdf

get
set

static int product::get_itemlist(
  Product p,
  int selector,
  ItemList result = 0)

Hole einen ItemList-Wert aus dem Produktobjekt. Der Befehl benötigt den Include

#include "internal/products.h"

Name Typ Default Beschreibung
Return int   0 oder Fehlercode
p Product - Gültiges Produktobjekt
selector int - Welcher Wert des Objektes soll ermittelt werden?

kProductOriginals
result ItemList 0 Allokierter Speicher für die Ergebnisliste (oder 0)
#include "internal/products.h"

Version 3.2 R2110, 7. Sept. 2010

priint:comet InDesign® Plug-Ins, comet_pdf

get
set

static int product::get_parent(Product parent, Product p)

Ermittle das Elternobjekt eines Produktes. Die Suche beginnt immer in den sichtbaren Einträgen der Produktrecherche. Wird das Objekt dort nicht gefunden, werden ausgehend von der obersten Ebene der Produktrecherche rekursiv alle Unterebenen nach dem gewünschten Objekt durchsucht. Dazu müssen jeweils die Anweisungen zum Laden der Untereinträge ausgeführt werden. Das kann in Abhängigkeit von der Komplexität ihrer Suchanweisungen mitunter recht lange dauern.

Damit Elternobjekte gefunden werden können, muss zumindest die oberste Ebene der Produktrecherche geladen sein. Ist diese Liste leer, gibt die Funktion den Fehler itemEmpty (1116) zurück.

Elternobjekte sind abhängig von den in der Palette Produktrecherche geladenen Produkten und können je nach geladenen Produkten unterschiedlich sein. Es wird immer das Elternprodukt des ersten Produktes mit der gesuchten ID zurükgegeben.

Name Typ Default Beschreibung
Return int   0 oder Fehlercode

1116 : Es wurde kein Elterneintrag gefunden. Möglicherweise ist die Produktrecherche noch nicht geladen.
parent Product - allokiertes Produkt für das Ergebnis
⇨ Produkt definiert über ein Objekt vom Typ Product
p Product - Produkt, dessen Elternprodukt ermittelt werden soll
⇨ Produkt definiert über seine ID
id int - ID1 des Produktes dessen Elternprodukt ermittelt werden soll
id2 int - ID2 des Produktes dessen Elternprodukt ermittelt werden soll
id3 int - ID3 des Produktes dessen Elternprodukt ermittelt werden soll
sid String oder char* - StringID des Produktes dessen Elternprodukt ermittelt werden soll
#include "internal/products.h"
#include "internal/products.h"
int w_product (Product p, char * trailer) { wlog ("", "%s[%d, %d, %d, '%s']\n",   trailer,   product::get (p, kID),   product::get (p, kID2),   product::get (p, kID3),   product::gets (p, kStringID));
return 0; }
int main () { int id = 1; int id2 = 0; int id3 = 0; char * sid = "100014";
Product parent = product::alloc (); Product p; ProductList children = productlist::alloc ();
product::get_parent (parent, id, id2, id3, sid); product::get_children (children, id, id2, id3, sid);
w_product (parent, " "); wlog ("", " [%d, %d, %d, '%s']\n", id, id2, id3, sid); for (p = productlist::first (children); p; p = productlist::next (children)) w_product (p, " ");
return 0; }

Version 3.2.3 R2485, 1. Jun. 2011

priint:comet InDesign® Plug-Ins

static int product::get_children(ProductList children, Product p)

Ermittle die Untereinträge eines Produktes. Die Suche beginnt immer in den sichtbaren Einträgen der Produktrecherche. Wird das Objekt dort nicht gefunden, werden ausgehend von der obersten Ebene der Produktrecherche rekursiv alle Unterebenen nach dem gewünschten Objekt durchsucht. Dazu müssen jeweils die Anweisungen zum Laden der Untereinträge ausgeführt werden. Das kann in Abhängigkeit von der Komplexität ihrer Suchanweisungen mitunter recht lange dauern.

Damit Unterprodukte gefunden werden können, muss zumindest die oberste Ebene der Produktrecherche geladen sein. Ist diese Liste leer, gibt die Funktion den Fehler itemEmpty (1116) zurück.

Unterprodukte sind abhängig von den in der Palette Produktrecherche geladenen Produkten und können je nach geladenen Produkten unterschiedlich sein. Es werden immer die Unterprodukte des ersten Produktes mit der gesuchten ID zurükgegeben.

Name Typ Default Beschreibung
Return int   0 oder Fehlercode

1116 : Es wurde keine Unterprodukte gefunden. Möglicherweise ist die Produktrecherche noch nicht geladen.
children ProductList - allokierte Ergebnisliste. Alte Inhalte der Liste werden gelöscht.
⇨ Produkt definiert über ein Objekt vom Typ Product
p Product - Produkt dessen Unterprodukte ermittelt werden sollen
⇨ Produkt definiert über seine ID
id int - ID1 des Produktes dessen Unterprodukte ermittelt werden sollen
id2 int - ID2 des Produktes dessen Unterprodukte ermittelt werden sollen
id3 int - ID3 des Produktes dessen Unterprodukte ermittelt werden sollen
sid String oder char* - StringID des Produktes dessen Unterprodukte ermittelt werden sollen
#include "internal/products.h"
#include "internal/products.h"
int w_product (Product p, char * trailer) { wlog ("", "%s[%d, %d, %d, '%s']\n",   trailer,   product::get (p, kID),   product::get (p, kID2),   product::get (p, kID3),   product::gets (p, kStringID));
return 0; }
int main () { int id = 1; int id2 = 0; int id3 = 0; char * sid = "100014";
Product parent = product::alloc (); Product p; ProductList children = productlist::alloc ();
product::get_parent (parent, id, id2, id3, sid); product::get_children (children, id, id2, id3, sid);
w_product (parent, " "); wlog ("", " [%d, %d, %d, '%s']\n", id, id2, id3, sid); for (p = productlist::first (children); p; p = productlist::next (children)) w_product (p, " ");
return 0; }

Version 3.2.3 R2485, 1. Jun. 2011

priint:comet InDesign® Plug-Ins

static char* product::to_xml(Product object, char* rootElementName = "product")

Generiere die XML Struktur eines Produkt-Objekts.

Wenn Sie über die Verwendung dieser Funktion nachdenken, sind Sie möglicherweise an näheren Informationen zur Interaktion von cscript mit auf dem PubServer als PlugIn bereitgestellten Java-Methoden interessiert. Mehr Informationen dazu finden Sie hier.

Name Typ Default Beschreibung
Return char *   xml string oder 0 bei Fehlern. Der Ergebnisstring ist nur bis zum nächsten Aufruf einer to_xml-Funktion gültig und darf nicht verändert oder freigegeben werden.
product Product - Object
rootElementName String oder char* product Name des Root-Elements

4.0.5 R9650
comet.publication.toXMLProduct

static Product product::from_xml(char* xml)

Generiere ein Product-Objekt aus einer XML Struktur.

Wenn Sie über die Verwendung dieser Funktion nachdenken, sind Sie möglicherweise an näheren Informationen zur Interaktion von cscript mit auf dem PubServer als PlugIn bereitgestellten Java-Methoden interessiert. Mehr Informationen dazu finden Sie hier.

Name Typ Default Beschreibung
Return Product   Objekt vom Typ Product. Dieses Objekt muss mit product::release wieder freigegeben werden.
xml String oder char* - xml string

4.0.5 R9650
comet.publication.fromXMLProduct

static int product::copy(Product destination, Product source)

Kopiere alle Werte von Objekt source nach Objekt destination

Name Typ Default Beschreibung
Return int   0 oder Fehlercode
destination Product - Quellobjekt
destination Product - Zielobjekt

4.0.5 R9700

static int product::relink(
  Product product,
  int mappingFunction,
  int reloadPlaceholders = 0)

Finde alle Platzhalter eines Produktes und verknüpfe sie mit einer neuen ID.

Die Funktion sucht alle zu einem Produkt gehörenden Platzhalter, ermittelt die Produkt-ID und ruft für jede gefundene ID die als zweiter Parameter angegebene Mapping-Funktion auf.

Die Mapping-Funktion muss folgende Signatur aufweisen:

int myMappingFunction(IDType in, IDType out);
Wobei gilt:

Name Typ Default Beschreibung
Return int   0 oder Fehlercode
product Product - product to relink
mappingFunction int - Rückruf-Funktion für I D mapping
reloadPlaceholders int 0 Platzhalter anschließend neu laden (1) oder nicht (0)

Ändere die ID1 aller Platzhalter eines Produktes, sofern sie vom Wert 1 abweichen:

int normalizeId1(IDType in, IDType out)
{
    if (idtype::id(in) != 1)
    {
        idtype::set_id(out, 1);
        return 1;
    }
return 0; }
int main() { ProductList products = productlist::get_established(); int i = 0; int c = productlist::length(products); Product p = 0;
for (; i < c; ++i) { p = productlist::get_nth (products, i); product::relink(p, normalizeId1); }
productlist::release(products);
return 0; }

4.1.7 R26615
itemlist::relink

static int product::get_pageitem_type(Product product)

Get the page type of the template used to build this product.

Name Typ Default Beschreibung
Return int   kUndefPage, kLeftPage, kUnisexPage or kRightPage (all defined in "internal/types.h")
product Product - product to check

4.1.6 R26615

Preconditions
#include "internal/types.h"
#include "internal/products.h"

Seit
Version 1.2.2 (24. Nov. 2004)
Letzte Änderung
30.07.2025, 07:35 Uhr
Autor
Paul Seidel
Siehe auch
productlist
document::build_products

Alphabetic index HTML hierarchy of classes or Java