本节介绍如何开发批量编辑器工具以及如何扩展产品列表组件(基于批量编辑器)。
使用批量编辑器时,可以将多个查询参数添加到URL中以使用特定配置调用批量编辑器。 如果您希望批量编辑器始终与特定配置一起使用(例如,与产品列表组件中一样),则必须编辑 bulkeditor.jsp
(在/libs/wcm/core/components/bulkeditor中)或创建具有特定配置的组件。 使用查询参数所做的更改不是永久性的。
例如,如果您在浏览器的URL中键入以下内容:
https://<servername><port_number>/etc/importers/bulkeditor.html?rootPath=/content/geometrixx/en&queryParams=geometrixx&initialSearch=true&hrp=true
此时将显示批量编辑器,但不包含 根路径 字段,因为hrp=true会隐藏该字段。 使用参数hrp=false,将显示字段(默认值)。
以下是Bulk Editor查询参数的列表:
每个参数可以有一个长名称和短名称。 例如,搜索根路径的长名称为 rootPath
,则简短的一点是 rp
. 如果未定义长名称,则从请求中读取短名称。
参数 (长名称/短名称) |
类型 |
描述 |
rootPath / rp |
字符串 | 搜索根路径 |
queryParams / qp |
字符串 | 搜索查询 |
contentMode / cm |
布尔值 | 为true时,启用内容模式 |
colsValue / cv |
字符串[] | 搜索的属性(colsSelection中的选中值显示为复选框) |
extraCols / ec |
字符串[] | 额外的搜索属性(显示在以逗号分隔的文本字段中) |
initialSearch / is |
布尔值 | 如果为true,则查询在页面加载时执行 |
colsSelection / cs |
字符串[] | 搜索属性选择(显示为复选框) |
showGridOnly / sgo |
布尔值 | 如果为true,则仅显示网格,而不显示搜索面板 |
searchPanelCollapsed / spc | 布尔值 | 为true时,搜索面板在加载时折叠 |
hideRootPath / hrp | 布尔值 | 为true时,隐藏根路径字段 |
hideQueryParams / hqp | 布尔值 | 为true时,隐藏查询字段 |
hideContentMode / hcm | 布尔值 | 为true时,隐藏内容模式字段 |
hideColsSelection / hcs | 布尔值 | 为true时,隐藏列选择字段 |
hideExtraCols / hec | 布尔值 | 为true时,隐藏额外的列字段 |
hideSearchButton | 布尔值 | 如果为true,则隐藏搜索按钮 |
hideSaveButton / hsavep | 布尔值 | 为true时,隐藏保存按钮 |
hideExportButton / hexpb | 布尔值 | 如果为true,则隐藏导出按钮 |
hideImportButton / hib | 布尔值 | 为true时,隐藏导入按钮 |
hideResultNumber / hrn | 布尔值 | 如果为true,则隐藏网格搜索结果编号文本 |
hideInsertButton / hinsertb | 布尔值 | 为true时,隐藏网格插入按钮 |
hideDeleteButton / hdelb | 布尔值 | 为true时,隐藏网格删除按钮 |
hidePathCol / hpc | 布尔值 | 为true时,隐藏网格“路径”列 |
本节概述如何使用批量编辑器,并介绍基于批量编辑器的现有Geometrixx组件:产品列表组件。
通过产品列表组件,用户可显示和编辑数据表。 例如,您可以使用产品列表组件表示目录中的产品。 该信息会显示在标准HTML表中,并且任何编辑操作都将在中执行 编辑 对话框,其中包含BulkEditor构件。 (此批量编辑器与在/etc/importers/bulkeditor.html上或通过“工具”菜单访问的编辑器相同)。 产品列表组件已针对特定的有限批量编辑器功能进行了配置。 可以配置批量编辑器的每个部分(或从批量编辑器派生的组件)。
使用批量编辑器,您可以添加、修改、删除、筛选和导出行,保存修改并导入一组行。 每行都作为节点存储在产品列表组件实例本身下。 每个单元格都是每个节点的属性。 这是一种设计选择,可以轻松更改,例如,您可以将节点存储在存储库中的其他位置。 查询servlet的角色是返回要显示的节点列表;搜索路径被定义为产品列表实例。
产品列表组件的源代码在存储库的/apps/geometrixx/components/productlist中提供,它由多个部分组成,如所有Adobe Experience Manager (AEM)组件:
以下是对话框子节点的XML表示形式:
<editor
jcr:primaryType="cq:Widget"
colsSelection="[ProductId,ProductName,Color,CatalogCode,SellingSku]"
colsValue="[ProductId,ProductName,Color,CatalogCode,SellingSku]"
contentMode="false"
exportURL="/etc/importers/bulkeditor/export.tsv"
extraCols="Selection"
hideColsSelection="false"
hideContentMode="true"
hideDeleteButton="false"
hideExportButton="false"
hideExtraCols="true"
hideImportButton="false"
hideInsertButton="false"
hideMoveButtons="false"
hidePathCol="true"
hideRootPath="true"
hideSaveButton="false"
hideSearchButton="false"
importURL="/etc/importers/bulkeditor/import"
initialSearch="true"
insertedResourceType="geometrixx/components/productlist/sku"
queryParams=""
queryURL="/etc/importers/bulkeditor/query.json"
saveURL="/etc/importers/bulkeditor/save"
xtype="bulkeditor">
<saveButton
jcr:primaryType="nt:unstructured"
text="Save modifications"/>
<searchButton
jcr:primaryType="nt:unstructured"
text="Apply filter"/>
<queryParamsInput
jcr:primaryType="nt:unstructured"
fieldDescription="Enter here your filters"
fieldLabel="Filters"/>
<searchPanel
jcr:primaryType="nt:unstructured"
height="200">
<defaults
jcr:primaryType="nt:unstructured"
labelWidth="150"/>
</searchPanel>
<grid
jcr:primaryType="nt:unstructured"
height="275"/>
<store jcr:primaryType="nt:unstructured">
<sortInfo
jcr:primaryType="nt:unstructured"
direction="ASC"
field="CatalogCode"/>
</store>
<colModel
jcr:primaryType="nt:unstructured"
width="150"/>
<colsMetadata jcr:primaryType="nt:unstructured">
<Selection
jcr:primaryType="nt:unstructured"
checkbox="true"
forcedPosition="0"
headerText=""/>
<ProductId
jcr:primaryType="nt:unstructured"
cellCls="productlist-cell-productid"
headerText="Product Id"/>
<ProductName
jcr:primaryType="nt:unstructured"
cellStyle="background-color: #FFCC99;"
headerText="Product Name"/>
<CatalogCode
jcr:primaryType="nt:unstructured"
cellStyle="background-color: #EDEDED;"
headerText="Catalog Code"/>
<Color jcr:primaryType="nt:unstructured">
<editor
jcr:primaryType="nt:unstructured"
store="[Blue,Red,Yellow]"
triggerAction="all"
typeAhead="true"
xtype="combo"/>
</Color>
<SellingSku
jcr:primaryType="nt:unstructured"
headerText="Sku Id"/>
</colsMetadata>
</editor>
可以配置批量编辑器的每个部分。 下表列出了批量编辑器的所有配置属性。
属性名称 | 定义 |
rootPath | 搜索根路径 |
queryParams | 搜索查询 |
内容模式 | True表示启用内容模式:属性在jcr:content节点上读取,而不是在搜索结果节点上读取 |
colsvalue | 搜索的属性(colsSelection中选中的值显示为复选框) |
额外栏 | 额外的搜索属性(以逗号分隔的文本字段显示) |
初始搜索 | True表示在页面加载时执行查询 |
colsSelection | 搜索属性选择(显示为复选框) |
showGridOnly | True表示仅显示网格,而不显示搜索面板(不要忘记将initialSearch设置为true) |
searchPanelCollapsed | 如果为True,则默认情况下折叠搜索面板 |
hideRootPath | 隐藏根路径字段 |
隐藏查询参数 | 隐藏查询字段 |
隐藏内容模式 | 隐藏内容模式字段 |
hideColsSelection | 隐藏列选择字段 |
hideExtraCols | 隐藏额外栏位 |
hideSearchButton | 隐藏搜索按钮 |
hideSaveButton | 隐藏保存按钮 |
hideExportButton | 隐藏导出按钮 |
hideImportButton | 隐藏导入按钮 |
hideResultNumber | 隐藏网格搜索结果编号文本 |
隐藏插入按钮 | 隐藏网格插入按钮 |
hideDeleteButton | 隐藏网格删除按钮 |
hidePathCol | 隐藏网格“路径”列 |
queryURL | 查询servlet的路径 |
exportURL | 导出servlet的路径 |
importURL | 导入servlet的路径 |
insertedResourceType | 插入行时添加到节点的资源类型 |
saveButton | 保存按钮构件配置 |
searchButton | 搜索按钮构件配置 |
exportButton | 导出按钮构件配置 |
importButton | 导入按钮构件配置 |
searchPanel | 搜索面板构件配置 |
网格 | 网格构件配置 |
存储 | 存储配置 |
colModel | 网格列模型配置 |
rootPathInput | rootPath构件配置 |
queryParamsInput | queryParams构件配置 |
contentModeInput | contentMode构件配置 |
colsSelectionInput | colsSelection小组件配置 |
extraColsInput | extraCols构件配置 |
colsMetadata | 列元数据配置。 可能的属性包括(应用于列的所有单元格):
|
您可以为每个列配置:
显示属性:html样式、CSS类和只读
复选框
强制位置
CSS和只读列
批量编辑器具有三个列配置:
必须将配置定义为以下配置:
"colsMetadata": {
"Column name": {
"cellStyle": "html style",
"cellCls": "CSS class",
"readOnly": true/false
}
}
以下示例可在productlist组件(/apps/geometrixx/components/productlist/dialog/items/editor/colsMetadata?lang=zh-Hans)中找到:
<colsMetadata jcr:primaryType="nt:unstructured">
<Selection
jcr:primaryType="nt:unstructured"
checkbox="true"
forcedPosition="0"
headerText=""/>
<ProductId
jcr:primaryType="nt:unstructured"
cellCls="productlist-cell-productid"
headerText="Product Id"/>
<ProductName
jcr:primaryType="nt:unstructured"
cellStyle="background-color: #FFCC99;"
headerText="Product Name"/>
<CatalogCode
jcr:primaryType="nt:unstructured"
cellStyle="background-color: #EDEDED;"
headerText="Catalog Code"/>
<Color jcr:primaryType="nt:unstructured">
<editor
jcr:primaryType="nt:unstructured"
store="[Blue,Red,Yellow]"
triggerAction="all"
typeAhead="true"
xtype="combo"/>
</Color>
<SellingSku
jcr:primaryType="nt:unstructured"
headerText="Sku Id"/>
</colsMetadata>
复选框
如果复选框配置属性设置为true,则该列的所有单元格都将呈现为复选框。 选中框将发送 true 到服务器保存servlet, false 否则。 在标题菜单中,您还可以 全选 或 全部不选. 如果所选标题是复选框列的标题,则会启用这些选项。
在前面的示例中,选择列只包含复选框,例如checkbox="true"。
强制位置
强制位置元数据forcedPosition允许您指定列在网格中的放置位置:0是第一个位置,而 <number of="" columns="">-1是最后一个位置。 任何其他值将被忽略。
在前面的示例中,选择列是第一列,即forcedPosition="0"。
默认情况下,查询servlet位于 /libs/wcm/core/components/bulkeditor/json.java
. 您可以配置其他路径以检索数据。
查询servlet的工作方式如下:它接收GQL查询和要返回的列,计算结果,并将结果作为JSON流发送回批量编辑器。
在产品列表组件用例中,发送到查询servlet的两个参数如下:
并且JSON流将按如下方式返回:
{
"hits": [{
"jcr:path": "/content/geometrixx/en/products/jcr:content/par/productlist/1258674828905",
"ProductId": "21",
"ProductName": "Cube",
"Color": "Blue",
"CatalogCode": "43244",
"SellingSku": "32131"
}
],
"results": 1
}
每个点击都对应一个节点及其属性,并在网格中显示为一行。
您可以扩展查询servlet以返回复杂的继承模型或返回存储在特定逻辑位置的节点。 查询servlet可用于执行任何类型的复杂计算。 然后,网格可以显示存储库中多个节点的聚合行。 在这种情况下,这些行的修改和保存必须由保存Servlet管理。
在批量编辑器的默认配置中,每行都是一个节点,此节点的路径存储在行记录中。 批量编辑器通过jcr路径保持行和节点之间的链接。 当用户编辑网格时,将生成所有修改的列表。 用户点击时 保存,则会向每个路径发送一个POST查询,其中包含更新后的属性值。 这是Sling概念的基础,如果每个单元格都是节点的属性,则它工作正常。 但是,如果实施查询servlet来执行继承计算,则此模型无法工作,因为查询servlet返回的属性可以从其他节点继承。
保存servlet概念是,修改不会直接发布到每个节点,而是发布到执行保存作业的一个servlet。 这使此servlet能够分析修改并将属性保存在正确的节点上。
每个更新的属性都会以下列格式发送到servlet:
参数名称: <jcr path="">/<property name="">
示例: /content/geometrixx/en/products/jcr:content/par/productlist/1258674859000/SellingSku
值: <value>
示例: 12123
servlet需要知道catalogCode属性的存储位置。
/libs/wcm/bulkeditor/save/POST.jsp上提供了默认的Save servlet实施,该实施用在产品列表组件中。 它获取请求中的所有参数(使用 <jcr path="">/<property name=""> format)和使用JCR API在节点上写入属性。 如果节点不存在,它还会创建节点(网格插入行)。
默认代码不应按原样使用,因为它重新实现了服务器本机执行的操作(POST <jcr path="">/<property name="">),因此它只是构建可管理属性继承模型的保存servlet的良好起点。