代理UI允许代理准备交互式通信并将其发送到后处理。 代理根据允许进行所需的修改,并将交互式通信提交到帖子流程,如电子邮件或打印。
创建交互式通信后,代理可以在代理UI中打开交互式通信,并通过输入数据并管理内容和附件来准备特定于收件人的副本。 最后,代理可将交互式通信提交到后处理。
在使用代理UI准备交互式通信时,代理在将交互式通信提交到帖子流程之前,会在代理UI中管理交互式通信的以下方面:
选择Forms > Forms和文档。
选择相应的交互式通信,然后点按打开代理UI。
代理UI仅在选定的交互式通信具有打印渠道时才起作用。
根据交互式通信的内容和属性,将显示代理UI,其中包含以下三个选项卡:数据、内容和附件。
继续输入数据、管理内容和管理附件。
在数据选项卡中,根据需要输入变量、表单数据模型属性和打印模板(XDP)字段的数据。 填写所有标有星号(*)的必填字段,以启用Submit按钮。
点按“交互式通信”预览中的数据字段值,以在“数据”选项卡中突出显示相应的数据字段,反之亦然。
在“内容”选项卡中,在交互式通信中管理内容,如文档片段和内容变量。
选择内容。 此时将显示交互式通信的内容选项卡。
在“内容”选项卡中,根据需要编辑文档片段。 要将焦点集中在内容层次结构中的相关片段,您可以点按交互式通信预览中的相关行或段落,也可以直接点按内容层次结构中的片段。
例如,在下图的预览中选择了行为“立即联机付款……”的文档片段,并且在“内容”选项卡中选择了相同的文档片段。
在“内容”或“数据”选项卡中,通过点按预览左上角的高亮显示内容中的选定模块(),可以禁用或启用在预览中点按/选择相关文本、段落或数据字段后转到文档片段的功能。
创建交互式通信时允许代理编辑的片段具有“编辑选定内容”()图标。 点按编辑选定内容图标,以在编辑模式下启动片段并在其中进行更改。 使用以下选项设置文本格式和管理文本:
有关Agent用户界面中各种文档片段可用的操作的详细信息,请参阅Agent用户界面中可用的操作和信息。
要向交互式通信的打印输出添加分页符,请将光标放在要插入分页符的位置,然后选择“分页前”或“分页后”()。
在交互式通信中插入显式分页符占位符。 要查看显式分页符对交互式通信的影响,请参阅打印预览。
继续管理交互式通信的附件。
选择附件。 代理UI在创建交互式通信时显示设置的可用附件。
您可以通过点按视图图标,选择不连同交互式通信一起提交附件,然后可以点按附件中的十字,从交互式通信中删除附件(如果允许代理删除或隐藏附件)。 对于在创建交互式通信时指定为必需的附件,将禁用“查看”和“删除”图标。
点按库访问()图标以访问内容库,以将DAM资产作为附件插入。
仅当在创建交互式通信时启用了库访问(在打印渠道的文档容器属性中)时,才可使用库访问图标。
如果在创建交互式通信时未锁定附件的顺序,则可以通过选择附件并点按向下和向上箭头来重新排序附件。
使用“Web预览”和“打印预览”可查看这两个输出是否符合您的要求。
如果您发现预览效果令人满意,请点按Submit以提交/发送交互式通信到帖子进程。 或者,要进行更改,请退出预览以返回进行更改。
在代理UI中编辑文本片段时,工具栏会根据您选择进行的编辑类型而发生更改:字体、段落或列表:
字体工具栏
段落工具栏
列表工具栏
要突出显示可编辑片段中的部分文本,请选择文本,然后点按高亮显示颜色。
代理UI内置了对210个特殊字符的支持。 管理员可以通过自定义🔗添加对更多/自定义特殊字符的支持。
编辑(仅限文本片段):打开富文本编辑器以编辑文本文档片段。 有关更多信息,请参阅格式化文本。
选择(眼睛图标):包括\排除交互式通信中的文档片段。
未填充的值(信息):指示文档片段中未填充变量的数量。
您可以使用代理UI为每个交互式通信保存一个或多个草稿,稍后检索草稿以继续处理该草稿。 您可以为每个草稿指定不同的名称以标识它。
Adobe建议按顺序执行这些说明,以成功将交互式通信另存为草稿。
默认情况下,“另存为草稿”功能未启用。 执行以下步骤以启用该功能:
实施ccrDocumentInstance服务提供商接口(SPI)。
SPI允许您将交互式通信的草稿版本保存到数据库中,并使用草稿ID作为唯一标识符。 这些说明假定您事先知道如何使用Maven项目构建OSGi包。
有关SPI实现的示例,请参阅Sample ccrDocumentInstance SPI实现。
打开http://<hostname>:<port>/ system/console/bundles
并点按Install/Update以上传OSGi包。 验证上传包的状态是否显示为Active。 如果包的状态未显示为Active,请重新启动服务器。
转到 https://'[server]:[port]'/system/console/configMgr
.
点按创建通信配置。
选择使用CCRDocumentInstanceService启用保存,然后点按保存。
执行以下步骤以将交互式通信另存为草稿:
在Forms Manager中选择交互式通信,然后点按Open Agent UI。
在代理UI中进行适当的更改,然后点按另存为草稿。
在名称字段中指定草稿的名称,然后点按Done。
将交互式通信另存为草稿后,点按保存更改以保存对草稿的任何进一步更改。
将交互式通信另存为草稿后,您可以检索它以继续处理它。 使用以下方法检索交互式通信:
https://server:port/aem/forms/createcorrespondence.hmtl?draftid=[draftid]
[] 拖动指向在将交互式通信另存为草稿后生成的草稿版本的唯一标识符。
实施ccrDocumentInstance
SPI以将交互式通信另存为草稿。 以下是ccrDocumentInstance
SPI的示例实现。
package Implementation;
import com.adobe.fd.ccm.ccr.ccrDocumentInstance.api.exception.CCRDocumentException;
import com.adobe.fd.ccm.ccr.ccrDocumentInstance.api.model.CCRDocumentInstance;
import com.adobe.fd.ccm.ccr.ccrDocumentInstance.api.services.CCRDocumentInstanceService;
import org.apache.commons.lang3.StringUtils;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
@Component(service = CCRDocumentInstanceService.class, immediate = true)
public class CCRDraftService implements CCRDocumentInstanceService {
private static final Logger logger = LoggerFactory.getLogger(CCRDraftService.class);
private HashMap<String, Object> draftDataMap = new HashMap<>();
@Override
public String save(CCRDocumentInstance ccrDocumentInstance) throws CCRDocumentException {
String documentInstanceName = ccrDocumentInstance.getName();
if (StringUtils.isNotEmpty(documentInstanceName)) {
logger.info("Saving ccrData with name : {}", ccrDocumentInstance.getName());
if (!CCRDocumentInstance.Status.SUBMIT.equals(ccrDocumentInstance.getStatus())) {
ccrDocumentInstance = mySQLDataBaseServiceCRUD(ccrDocumentInstance,null, "SAVE");
}
} else {
logger.error("Could not save data as draft name is empty");
}
return ccrDocumentInstance.getId();
}
@Override
public void update(CCRDocumentInstance ccrDocumentInstance) throws CCRDocumentException {
String documentInstanceName = ccrDocumentInstance.getName();
if (StringUtils.isNotEmpty(documentInstanceName)) {
logger.info("Saving ccrData with name : {}", documentInstanceName);
mySQLDataBaseServiceCRUD(ccrDocumentInstance, ccrDocumentInstance.getId(), "UPDATE");
} else {
logger.error("Could not save data as draft Name is empty");
}
}
@Override
public CCRDocumentInstance get(String id) throws CCRDocumentException {
CCRDocumentInstance cCRDocumentInstance;
if (StringUtils.isEmpty(id)) {
logger.error("Could not retrieve data as draftId is empty");
cCRDocumentInstance = null;
} else {
cCRDocumentInstance = mySQLDataBaseServiceCRUD(null, id,"GET");
}
return cCRDocumentInstance;
}
@Override
public List<CCRDocumentInstance> getAll(String userId, Date creationTime, Date updateTime,
Map<String, Object> optionsParams) throws CCRDocumentException {
List<CCRDocumentInstance> ccrDocumentInstancesList = new ArrayList<>();
HashMap<String, Object> allSavedDraft = mySQLGetALLData();
for (String key : allSavedDraft.keySet()) {
ccrDocumentInstancesList.add((CCRDocumentInstance) allSavedDraft.get(key));
}
return ccrDocumentInstancesList;
}
//The APIs call the service in the database using the following section.
private CCRDocumentInstance mySQLDataBaseServiceCRUD(CCRDocumentInstance ccrDocumentInstance,String draftId, String method){
if(method.equals("SAVE")){
String autoGenerateId = draftDataMap.size() + 1 +"";
ccrDocumentInstance.setId(autoGenerateId);
draftDataMap.put(autoGenerateId, ccrDocumentInstance);
return ccrDocumentInstance;
}else if (method.equals("UPDATE")){
draftDataMap.put(ccrDocumentInstance.getId(), ccrDocumentInstance);
return ccrDocumentInstance;
}else if(method.equals("GET")){
return (CCRDocumentInstance) draftDataMap.get(draftId);
}
return null;
}
private HashMap<String, Object> mySQLGetALLData(){
return draftDataMap;
}
}
save
、update
、get
和getAll
操作调用数据库服务,以将交互式通信保存为草稿,更新交互式通信,从数据库中检索数据,并检索数据库中所有可用交互式通信的数据。 此示例使用mySQLDataBaseServiceCRUD
作为数据库服务的名称。
下表说明了ccrDocumentInstance
SPI实现示例。 它演示了save
、update
、get
和getAll
操作如何在示例实施中调用数据库服务。
操作 |
数据库服务示例 |
您可以为交互式通信创建草稿,也可以直接提交。 用于保存操作的API会检查交互式通信是否作为草稿提交,并且它包含草稿名称。 然后,API使用“保存”作为输入方法调用mySQLDataBaseServiceCRUD服务。 ![]() |
mySQLDataBaseServiceCRUD服务验证“另存为”作为输入方法,并生成一个自动生成的草稿ID,并将其返回到AEM。 生成草稿ID的逻辑可能因数据库而异。 ![]() |
用于更新操作的API可检索交互式通信草稿的状态,并检查交互式通信是否包含草稿名称。 API会调用mySQLDataBaseServiceCRUD服务以在数据库中更新该状态。 ![]() |
mySQLDataBaseServiceCRUD服务将Update验证为输入方法,并将Interactive Communication草稿的状态保存在数据库中。 ![]() |
用于获取操作的API会检查交互式通信是否包含草稿ID。 然后,API调用mySQLDataBaseServiceCRUD服务,并使用Get作为输入方法,以检索用于交互式通信的数据。 ![]() |
mySQLDataBaseServiceCRUD服务验证Get作为输入方法,并根据草稿ID检索交互式通信的数据。 ![]() |
getAll操作的API会调用mySQLGetALLData服务,以检索数据库中保存的所有交互式通信的数据。 ![]() |
mySQLGetALLData服务可检索数据库中保存的所有交互式通信的数据。 ![]() |
以下是实施中包含的pom.xml
文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.adobe.livecycle</groupId>
<artifactId>draft-sample</artifactId>
<version>2.0.0-SNAPSHOT</version>
<name>Interact</name>
<packaging>bundle</packaging>
<dependencies>
<dependency>
<groupId>com.adobe.aemfd</groupId>
<artifactId>aemfd-client-sdk</artifactId>
<version>6.0.160</version>
</dependency>
</dependencies>
<!-- ====================================================================== -->
<!-- B U I L D D E F I N I T I O N -->
<!-- ====================================================================== -->
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>3.3.0</version>
<extensions>true</extensions>
<executions>
<!--Configure extra execution of 'manifest' in process-classes phase to make sure SCR metadata is generated before unit test runs-->
<execution>
<id>scr-metadata</id>
<goals>
<goal>manifest</goal>
</goals>
</execution>
</executions>
<configuration>
<exportScr>true</exportScr>
<instructions>
<!-- Enable processing of OSGI DS component annotations -->
<_dsannotations>*</_dsannotations>
<!-- Enable processing of OSGI metatype annotations -->
<_metatypeannotations>*</_metatypeannotations>
<Bundle-SymbolicName>${project.groupId}-${project.artifactId}</Bundle-SymbolicName>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>autoInstall</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.sling</groupId>
<artifactId>maven-sling-plugin</artifactId>
<executions>
<execution>
<id>install-bundle</id>
<phase>install</phase>
<goals>
<goal>install</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
确保在pom.xml
文件中将aemfd-client-sdk
依赖项更新为6.0.160。