开发批量编辑器 developing-the-bulk-editor
本节介绍如何开发批量编辑器工具以及如何扩展产品列表组件(基于批量编辑器)。
批量编辑器查询参数 bulk-editor-query-parameters
使用批量编辑器时,可以将多个查询参数添加到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
。 如果未定义长名称,则从请求中读取短名称。开发基于批量编辑器的组件:产品列表组件 developing-a-bulk-editor-based-component-the-product-list-component
本节概述了如何使用批量编辑器,并介绍了基于批量编辑器的现有Geometrixx组件:产品列表组件。
利用产品列表组件,用户可显示和编辑数据表。 例如,您可以使用产品列表组件表示目录中的产品。 该信息显示在标准HTML表中,并且任何编辑操作都在 编辑 对话框中执行,该对话框包含BulkEditor构件。 (此批量编辑器与在/etc/importers/bulkeditor.html上或通过“工具”菜单访问的编辑器相同)。 产品列表组件已针对特定的有限批量编辑器功能进行了配置。 可以配置批量编辑器的每个部分(或从批量编辑器派生的组件)。
使用批量编辑器,您可以添加、修改、删除、过滤和导出行,保存修改并导入一组行。 每一行都作为节点存储在Product List组件实例本身下。 每个单元格都是每个节点的属性。 这是一种设计选择,可以轻松进行更改,例如,您可以将节点存储在存储库中的其他位置。 查询servlet的角色是返回要显示的节点列表;搜索路径被定义为产品列表实例。
产品列表组件的源代码位于存储库/apps/geometrixx/components/productlist中,它由若干部分组成,如所有Adobe Experience Manager (AEM)组件:
- HTML渲染:渲染在JSP文件(https://experienceleague.adobe.com/apps/geometrixx/components/productlist/productlist.jsp?lang=zh-Hans)中完成。 JSP读取当前Product List组件的子节点,并将每个子节点显示为HTML表的行。
- “编辑”对话框,可在其中定义批量编辑器配置。 配置对话框以符合组件的需要:可用列以及对网格或搜索可能执行的操作。 有关所有配置属性的信息,请参阅批量编辑器配置属性。
以下是对话框子节点的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>
批量编辑器配置属性 bulk-editor-configuration-properties
可以配置批量编辑器的每个部分。 下表列出了批量编辑器的所有配置属性。
列元数据配置 columns-metadata-configuration
您可以为每个列配置:
-
显示属性:html样式、CSS类和只读
-
复选框
-
强制位置
CSS和只读列
批量编辑器具有三个列配置:
- 单元格CSS类名称(cellCls):添加到已配置列的每个单元格的CSS类名称。
- 单元格样式(cellStyle):添加到已配置列的每个单元格的HTML样式。
- 只读(readOnly):为已配置列的每个单元格设置只读。
配置必须定义为以下配置:
"colsMetadata": {
"Column name": {
"cellStyle": "html style",
"cellCls": "CSS class",
"readOnly": true/false
}
}
以下示例可以在productlist组件(https://experienceleague.adobe.com/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 发送到服务器Save servlet,否则 false。 在标题菜单中,您也可以 全选 或 不选。 如果所选标题是复选框列的标题,则会启用这些选项。
在前面的示例中,selection列仅包含复选框,如checkbox="true"。
强制位置
强制位置元数据forcedPosition允许您指定列在网格中的放置位置:0是第一个位置,<列数>-1是最后一个位置。 任何其他值将被忽略。
在前面的示例中,选择列是第一列,即forcedPosition="0"。
查询Servlet query-servlet
默认情况下,可在/libs/wcm/core/components/bulkeditor/json.java
找到查询Servlet。 您可以配置其他路径以检索数据。
查询servlet的工作方式如下:它接收GQL查询并接收要返回的列,计算结果,并将结果作为JSON流发送回批量编辑器。
在产品列表组件用例中,发送到查询servlet的两个参数如下:
- 查询: "path:/content/geometrixx/en/customers/jcr:content/par/productlist Cube"
- 列:“Selection、ProductId、ProductName、Color、CatalogCode、SellingSku”
并且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管理。
保存Servlet save-servlet
在批量编辑器的默认配置中,每一行都是一个节点,此节点的路径存储在行记录中。 批量编辑器通过jcr路径保持行和节点之间的链接。 当用户编辑网格时,将生成所有修改的列表。 当用户单击 保存 时,将会向每个路径发送一个POST查询,其中具有更新的属性值。 这是Sling概念的基础,如果每个单元格是节点的属性,则它工作正常。 但是,如果实施查询Servlet来执行继承计算,则该模型无法工作,因为查询Servlet返回的属性可以从其他节点继承。
保存Servlet的概念是,修改不会直接发布到每个节点,而是发布到执行保存作业的一个Servlet。 这使此servlet能够分析修改并将属性保存在正确的节点上。
每个更新的属性都将以下列格式发送到servlet:
-
参数名称: <jcr path>/<property name>
示例: /content/geometrixx/en/products/jcr:content/par/productlist/1258674859000/SellingSku
-
值: <值>
示例: 12123
servlet需要知道catalogCode属性的存储位置。
/libs/wcm/bulkeditor/save/POST.jsp上提供了默认的保存Servlet实施,该实施用在产品列表组件中。 它采用请求中的所有参数(采用<jcr path>/<property name>格式)并使用JCR API在节点上写入属性。 如果节点不存在,它还会创建节点(网格插入行)。
请勿按原样使用默认代码,因为它重新实现了服务器本地的功能(<jcr path>/<property name>上的POST),因此只是一个很好的起点,可让您构建可管理属性继承模型的保存servlet。