Generic Child Bucket Table Placeholder
Overview
| Placeholder Id | 537412003 |
| Placeholder type | Text |
| Entity | Works with both planning records and bucket records |
| Context | Supported: _language, _country |
| Function variables | Config Id — Id of the table defined inside childBucketTable.xml |
| Data Query | com.print.accpack.childbuckettable.dataquery.BucketQueryPlugin.getBucketOrPlannedBucket |
| Data Mapping | com.print.accpack.childbuckettable.datamapping.TableDataMappingPlugin.getChildBucketTable |
| Data Processing | com.priint.pubserver.comet.bridge.dataprocessing.IndesignTaggedTextFunctions.tableDataToTaggedTextWithOptionOptions: ColumnWidthFromRowWithMostCells, TidyFirst, AutoLoadOff |
The AutoLoadOff option of Data Processing tells the Publishing Server to skip autoloading placeholders inside table cells on placement.
- Consider a table with 100 cells: the plugin fills all cell values during the initial table build.
- You can still assign individual placeholders to cells to allow reloading specific values if the underlying data changes — this lets users do manual finishing without rebuilding the whole table.
- Without
AutoLoadOff: all placeholders in the cells would load on placement as part of the template build. Since the plugin already set the initial values, this loading adds no value — it only adds unnecessary requests and hurts performance. - If a placeholder performs additional logic (e.g. loading a sub-template or an image placeholder), it still needs to run — in that case, remove
AutoLoadOfffrom the Data Processing options. SeetemplateId.
XML Configuration File
The XML configuration file childBucketTable.xml should be created in ISON Eclipse, located at:
com.priint.accpack.childbuckettable.GenericChildBucketTablePlugin/<client>/default
Example for <client> = WerkII:
The sections below document all elements and attributes of childBucketTable.xml. Required elements are marked with (*).
tableConfiguration(*)
Defines the overall table behavior, including how child records are collected, whether a header row is generated, and when the optional last column is displayed.
| Attribute | Required | Description |
|---|---|---|
configId | yes | Configuration ID used as the placeholder function variable |
tableStyle | Table style to be applied | |
mode | yes | Detects children of a bucket or a planning record. • bucket: children of a parent bucket or parent planned bucket• planning: sub-planning records of a planning record |
headerRow | Whether to build the header row. • true (default): builds the header row using the <header> column configuration. If all header cells are empty, the row is removed.• false: skips the header row; the <header> configuration is ignored | |
showLastColumnWhen | Controls when to display <lastColumn>:• none (default): does not display the last column• any: always displays the last column (<lastColumn> should be defined)• grouping: only displays when the table contains grouping rows, to keep groups together (<lastColumn> should be defined) |
Example:
<tableConfiguration configId="Full" tableStyle="TableStyle" mode="bucket" headerRow="true" showLastColumnWhen="none">
rowFilters
Filters the child buckets before they are added to the table. Multiple filter conditions can be combined using the configured logical operator.
| Attribute | Required | Description |
|---|---|---|
operator | yes | Determines how multiple <rowFilter> conditions are combined.• and: includes a row if the child bucket matches all conditions• or: includes a row if the child bucket matches at least one condition |
rowFilter
Each child element defines one condition
| Attribute | Required | Description |
|---|---|---|
sort | yes | Ordering of the condition to filter (integer) |
entityIdentifier | yes | Entity identifier of the child bucket to filter |
Example:
<rowFilters operator="or">
<rowFilter sort="1" entityIdentifier="article" />
</rowFilters>
groupColumns
Groups body rows by one or more key values. Contains one or more <keyValue> child elements defining the grouping fields.
| Attribute | Description |
|---|---|
cellStylePostfix | Appends a postfix to the cell style defined by the <groupFormats>. Useful for applying different cell styles to individual columns without defining additional row formats |
paraStylePostfix | Appends a postfix to the paragraph style defined by the <groupFormats>. Useful for applying different paragraph styles to individual columns while reusing the same row format |
cellValueDelimiter | When grouping by multiple key values, this string delimits each value in the group cell |
groupedSortStrategy | Sort order for grouping rows. Only takes effect when groupedSort is set.• asc• desc• (empty string): keeps the original sort order but still groups records |
keyValue(*)
Each child element defines one grouping field
| Attribute | Required | Description |
|---|---|---|
sort | yes | Ordering of the value of the key value on the grouping row (integer) |
entityIdentifier | yes | Entity identifier of the key value to filter |
key | yes | Key of the key value to filter |
groupedValue | yes | Which field of key value to group. Supports XPath (v1) expressions |
groupedSort | Which field to use for sorting. Supports XPath (v1) expressions. Empty value means no sorting; the grouping rows follow the bucket tree order | |
cellValue | yes | Which value to display on the grouping row. Supports XPath (v1) expressions. In most cases equals groupedValue, but can differ if you want to display a different value on the grouping row |
Example (group by multiple key values):
<groupColumns cellStylePostfix="" paraStylePostfix="" cellValueDelimiter="," groupedSortStrategy="asc">
<keyValue sort="1" entityIdentifier="category_attribute" key="brand" groupedValue="@value" groupedSort="@value" cellValue="concat(@keyLabel, ': ', @value)" />
<keyValue sort="2" entityIdentifier="category_attribute" key="name" groupedValue="@value" groupedSort="@value" cellValue="concat(@keyLabel, ': ', @value)" />
</groupColumns>
Example (group by single key value):
<groupColumns cellStylePostfix="" paraStylePostfix="">
<keyValue sort="1" entityIdentifier="category_attribute" key="brand" groupedValue="@value" groupedSort="@value" groupedSortStrategy="asc" cellValue="concat(@keyLabel, ': ', @value)" />
</groupColumns>
columns(*)
Contains a list of <column> elements that define the table columns.
| Attribute | Description |
|---|---|
uniqueRow | true: deduplicates rows with identical values across all columns, keeping only one instancefalse (default): duplicate rows are always shown |
removeEmptyRow | true: removes rows where every column value is empty/null false (default): empty/null rows are always shown |
uniqueColumn | true: deduplicates columns with identical values across all rows, keeping only one instance false (default): duplicate columns are always shown |
removeEmptyColumn | true: removes columns where every row value is empty/null false (default): empty/null columns are always shown |
column(*)
Each <column> defines a header cell and a body cell. Header and body can contain one or more cells. Cells display key value or media asset data.
| Attribute | Required | Description |
|---|---|---|
sort | yes | Display order of the column in the table (integer) |
width | Column width in mm |
Attributes shared by <header> and <body> cells
| Attribute | Description |
|---|---|
cellStylePostfix | Appends a postfix to the cell style defined by the <rowFormat>. Useful for applying different cell styles to individual columns without defining additional row formats |
paraStylePostfix | Appends a postfix to the paragraph style defined by the <rowFormat>. Useful for applying different paragraph styles to individual columns while reusing the same row format |
cellValueDelimiter | When a cell contains multiple values, this string delimits each value in the cell. Supports HTML-escaped characters, e.g. <br/> for a new line |
keyValue (inside <header>/<body>)
Defines one cell used to display a key value in the table cell.
| Attribute | Required | Description |
|---|---|---|
entityIdentifier | yes | Entity identifier of the key value to filter |
key | yes | Key of the key value to filter |
cellValue | yes | Which field value to display on the cell. Supports XPath (v1) expressions |
prefix | Characters added before the cell value. Supports HTML-escaped characters, e.g. <br/> | |
suffix | Characters added after the cell value. Supports HTML-escaped characters | |
characterStyle | Formatting character style | |
placeholderId | Placeholder ID to place inside the cell (optional) |
Example:
<columns hideRowSameValue="false">
<column sort="2" width="20">
<header cellStylePostfix="" paraStylePostfix="">
<keyValue entityIdentifier="category_attribute" key="name" cellValue="@keyLabel" placeholderId="" />
</header>
<body cellStylePostfix="" paraStylePostfix="" cellValueDelimiter="<br/>">
<keyValue entityIdentifier="category_attribute" key="latin_name" cellValue="@value" placeholderId="" characterStyle="" />
<keyValue entityIdentifier="category_attribute" key="name" cellValue="@value" placeholderId="" characterStyle="" />
</body>
</column>
</columns>
search
Child element of <keyValue>.
One <search> element is supported per <keyValue>. This element extends the existing <keyValue> configuration to support dynamic lookup of key-value pairs based on a matching criterion, instead of requiring the exact entityIdentifier + key pair to be hard-coded.
<keyValue cellValue="@keyLabel" placeholderId="" characterStyle="" >
<search field="entityIdentifier" operator="eq" value="product_attribute" />
</keyValue>
Search attributes:
| Attribute | Required | Description |
|---|---|---|
field | yes | Which property of a key-value record to match against (see Supported fields below) |
operator | yes | How to compare the record's field value against value (see Supported operators below) |
value | yes | The value to compare against (a literal string or, for regex, a regular expression pattern) |
Each <search> targets exactly one field at a time.
Supported fields:
| Field | Matches against |
|---|---|
entityIdentifier | The entityIdentifier of a key-value record |
key | The key of a key-value record |
keyLabel | The keyLabel of a key-value record |
keySymbol | The keySymbol of a key-value record |
groupIdentifier | The groupIdentifier of a key-value record |
Supported operators:
| Operator | Meaning |
|---|---|
eq | Field value equals value (case-insensitive) |
neq | Field value does not equal value (case-insensitive) |
contains | Field value contains value as a substring (case-insensitive) |
ncontains | Field value does not contain value (case-insensitive) |
startsWith | Field value starts with value (case-insensitive) |
nstartsWith | Field value does not start with value (case-insensitive) |
endsWith | Field value ends with value (case-insensitive) |
nendsWith | Field value does not end with value (case-insensitive) |
regex | Field value fully matches the regular expression in value (case-sensitive) |
mediaAsset
Child element of <body>.
Defines one cell used to display an image in the table cell.
| Attribute | Required | Description |
|---|---|---|
entityIdentifier | yes | Entity identifier of the media asset to filter |
cellValue | yes | Use either @url or @file, depending on how the media asset is stored. Only one should be used per media asset configuration |
label | Each value is delimited by ; supports regular expressions with prefix regexp: to search images by label | |
width | yes | Width in mm |
height | yes | Height in mm |
placeholderId | Placeholder ID to place inside the cell (optional) | |
templateId | Places a sub-template inside the cell instead of a direct image reference (optional) | |
placement | yes | Position of the image inside the cell: center, left, or right |
When using
templateIdorplaceholderId, removeAutoLoadOfffrom the Data Processing options to enable image loading.
Example:
<column sort="30" width="30">
<body cellStylePostfix="" paraStylePostfix="">
<mediaAsset entityIdentifier="ArticleAsset" label="PRODUCT_IMAGE" cellValue="@url" placeholderId="" width="30" height="30" placement="center"/>
</body>
</column>
Value Transformation
Cell values can be transformed before they are written to the table. Two mechanisms are supported.
a) Static transform (//static_transform)
Transforms a key value to a mapped value using an identifier in staticContent.xml.
cellValue="//static_transform['1']": finds identifier"1"insidestaticContent.xmlby contextcellValue="//static_transform[@value]": finds the identifier by evaluating XPath@value, then looks it up instaticContent.xmlusing context
b) Publishing Server plugin method
Calls a custom Publishing Server plugin method. The method receives a KeyValue entity cast from Object:
cellValue="plugin(globalName='com.priint.project.demo.ChildBucketTableTransformPlugin',methodName='transformName')"
Example implementation of the method:
public String transformName(Object object){
KeyValue kv = (KeyValue)object;
//your implementation
}
Placeholder inside cell
See ChildBucket_StaticContent and ChildBucket_KeyValueById for supported placeholder types.
functionVariables
Defines function variables for a placeholder in the table cell. How many variables depend on the placeholder ID configured.
variable
Child element of <functionVariables>.
| Attribute | Description |
|---|---|
name | Name of the function variable — placeholder option name |
value | Initial value of the function variable — placeholder option value. Supports XPath (v1) expressions |
ChildBucket_KeyValueById supports an XPath function variable, defined as follows:
<column sort="2" width="40">
<body cellStylePostfix="" paraStylePostfix=" Copy">
<keyValue entityIdentifier="product_attribute" key="plant_name" cellValue="@value" placeholderId="537688584" characterStyle="Body-Bold">
<functionVariables>
<variable name="xpath" value="@value"/>
</functionVariables>
</keyValue>
</body>
</column>
lastColumn
Useful when the table has grouping rows. Keeps the grouping row visually connected to its body rows. Only takes effect when showLastColumnWhen is set to any or grouping.
| Attribute | Description |
|---|---|
width | Column width in mm |
cellStyle | Cell style applied to the last column |
Example:
<lastColumn width="1.1" cellStyle="Last"/>
footer
Similar to body columns, but all the cells will be merged for each row. Helpful if you want to display a static text translation.
Example:
<footer cellStylePostfix="" paraStylePostfix="">
<keyValue cellValue="//static_transform[footer_note]" />
</footer>
Row Format
groupFormats
Applies to grouping rows only, when the table contains grouping rows.
<groupFormats>
<rowFormat sort="1" height="7" first="1" next="1" cellStyle="PTHeaderGroup" paraStyle="PTHeaderGroup" />
</groupFormats>
headerFormats
Applies to the header row only, when headerRow is true.
<headerFormats>
<rowFormat sort="1" height="7" first="1" next="1" cellStyle="PTHeader" paraStyle="PTHeader" />
</headerFormats>
footerFormats
Applies to footer rows only, as configured by <footer>.
<footerFormats>
<rowFormat sort="1" height="7" first="1" next="1" cellStyle="PTBodyFooter" paraStyle="PTBodyFooter" />
</footerFormats>
rowFormats
Applies to body rows only. The table supports separate formats for header, grouping, body, and footer rows. When override behavior is enabled, the corresponding header, grouping, or footer row uses the row formats defined in <rowFormats> instead of its dedicated format section.
Multiple <rowFormat> elements can be defined to create alternating row styles. The first and next attributes determine how the formats repeat across body rows.
Example (two alternating row formats for body rows):
Odd rows (1, 3, 5, 7, ...) use the first format (PTBodyWithoutBackground cell style, PTBody paragraph style); even rows (2, 4, 6, 8, ...) use the second format (PTBodyWithBackground cell style, PTBody paragraph style).
<rowFormat sort="1" height="7" first="1" next="2" cellStyle="PTBodyWithoutBackground" paraStyle="PTBody"/>
<rowFormat sort="2" height="7" first="2" next="2" cellStyle="PTBodyWithBackground" paraStyle="PTBody" />
| Attribute | Description |
|---|---|
overrideFormatHeader | true: overrides <headerFormats> with the body row format (the element is not needed)false (default): does not override |
overrideFormatGroup | true: overrides <groupFormats> false (default): does not override |
overrideFormatFooter | true: overrides <footerFormats> false (default): does not override |
Example:
<rowFormats overrideFormatHeader="true" overrideFormatGroup="true" overrideFormatFooter="true">
<rowFormat sort="1" height="7" first="1" next="2" cellStyle="PTBodyWithoutBackground" paraStyle="PTBody"/>
<rowFormat sort="2" height="7" first="2" next="2" cellStyle="PTBodyWithBackground" paraStyle="PTBody" />
</rowFormats>