Methoden zur Verwendung der Objekte der Palette Produktrecherche.
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 |
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, | |
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.
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. |
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!
|
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!
|
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.
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 |
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 |
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.
static void product::set(
Product p,
int selector,
int v)
Setze einen Wert des Produktobjektes. Der Befehl benötigt den Include
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 Deprecated Deprecated Deprecated Deprecated Deprecated 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 Deprecated Deprecated sonst : ID des auszuführenden Skriptes Deprecated kPostRuleid (int) kNoRule sonst : ID des auszuführenden Skriptes Deprecated Deprecated 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?
kSnippetAttr (String oder char*) kProductTextmodel (ItemRef) kProductStart (int) kProductEnd (int) kProductType (int)
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. |
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; }
static int product::get(Product p, int selector)
Hole einen integer-Wert aus dem Produktobjekt. Der Befehl benötigt den Include
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 Deprecated Deprecated Deprecated 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.
[Ab Comet 3.2, R 2110, 7. Sept. 2010] Die folgenden Werte werden von productlist::reorganization ausgewertet: kProductStart (int) kProductEnd (int) kProductType (int)
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 |
static char* product::gets(Product p, int selector)
Hole einen String-Wert aus dem Produktobjekt. Der Befehl benötigt den Include
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 Deprecated 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*) |
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
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 |
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
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) |
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"
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; }
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"
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; }
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 |
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 |
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 |
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; }
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 |
Alphabetic index HTML hierarchy of classes or Java