使用Agent UI準備和發送互動式通信

代理UI允許代理準備並將互動式通信發送到後續進程。 代理程式會根據允許進行所需的修改,並將互動式通訊提交至後置程式,例如電子郵件或列印。

概覽

建立互動式通信後,代理可以在代理UI中開啟互動式通信,並通過輸入資料和管理內容和附件準備特定於收件人的副本。 最後,代理可將互動式通訊提交至後續程式。

使用代理UI準備互動式通訊時,代理在將互動式通訊提交至後續程式之前,會先在代理UI中管理互動式通訊的下列方面:

  • 資料:代理UI的「資料」頁簽顯示「交互通信」中任何可代理編輯的變數和未鎖定表單資料模型屬性。這些變數/屬性是在編輯或建立互動式通訊中包含的檔案片段時建立。 「資料」標籤也包含XDP/列印通道範本中建置的任何欄位。 只有當Interactive Communication中存在代理可編輯的任何變數、表單資料模型屬性或欄位時,才會顯示「資料」頁簽。
  • 內容:在「內容」頁簽中,代理管理互動式通信中的文檔片段和內容變數等內容。在這些文檔片段的屬性中建立交互通信時,代理可以按照允許的方式在文檔片段中進行更改。 如果允許,代理還可以重新排序、添加/刪除文檔片段以及添加分頁符。
  • 附件:僅當Interactive Communication具有任何附件或Agent具有庫訪問權時,Attachments頁簽才會顯示在代理UI中。代理可以更改或不能編輯附件。

使用代理UI準備互動式通訊

  1. 選取​Forms > Forms與檔案

  2. 選擇適當的「Interactive Communication(互動式通信)」,然後點選「Open Agent UI (開啟代理UI)」。

    注意

    只有選定的交互通信具有打印通道時,代理UI才工作。

    openagentiui

    根據互動式通訊的內容和屬性,代理程式UI會顯示以下三個標籤:資料、內容和附件。

    代理

    繼續輸入資料、管理內容及管理附件。

輸入資料

  1. 在「資料」頁簽中,根據需要輸入變數的資料、表單資料模型屬性和打印模板(XDP)欄位。 填寫標有星號(*)的所有必填欄位,以啟用​Submit​按鈕。

    在「互動式通訊」預覽中點選資料欄位值,以在「資料」標籤中反白顯示對應的資料欄位,反之亦然。

管理內容

在「內容」標籤中,管理互動式通訊中的內容,例如檔案片段和內容變數。

  1. 選擇​Content。 「互動式通訊」的內容標籤隨即出現。

    agentuicontentab

  2. 視需要在「內容」索引標籤中編輯檔案片段。 若要聚焦在內容階層中的相關片段,您可以在「互動式通訊」預覽中點選相關行或段落,或直接在「內容」階層中點選片段。

    例如,在下圖的預覽中選擇了行為「立即進行線上付款……」的單據片段,並在「內容」頁簽中選擇了相同的單據片段。

    contentmodulefocus

    在「內容」或「資料」頁簽中,點選預覽左上角的「在內容中突出顯示選定的模組」(highlightselectedmodulesincontentccr),可以禁用或啟用在預覽中點選/選擇相關文本、段落或資料欄位時轉到文檔片段的功能。

    建立互動式通訊時允許由代理編輯的片段具有「編輯選取的內容」(iconeditedcontent)圖示。 點選「編輯選取的內容」圖示,以在編輯模式中啟動片段,並在其中進行變更。 使用下列選項來格式化和管理文本:

    有關代理用戶介面中各種文檔片段可用操作的詳細資訊,請參閱代理用戶介面🔗中的可用操作和資訊。

  3. 要將分頁符添加到互動式通信的打印輸出中,請將游標放在要插入分頁符的位置,並選擇「分頁符在前」或「分頁符在後」(pagebreakafter)。

    在互動式通訊中插入明確的分頁符預留位置。 要查看顯式分頁符對互動式通信的影響,請參閱打印預覽。

    explocipagebreak

    繼續管理互動式通信的附件。

管理附件

  1. 選擇​附件。 Agent UI將按建立互動式通信時設定的方式顯示可用附件。

    通過點選視圖表徵圖,您可以選擇不連同互動式通信一起提交附件,並且可以點選附件中的十字以從互動式通信中刪除附件(如果允許代理刪除或隱藏附件)。 對於在建立互動式通信時指定為強制的附件,將禁用「查看」和「刪除」表徵圖。

    附件代理

  2. 點選「資料庫存取」(資料庫存取)圖示以存取「內容資料庫」以插入DAM資產作為附件。

    注意

    只有在建立互動式通訊時已啟用程式庫存取(位於列印管道的「檔案容器」屬性中)時,才可使用「程式庫存取」圖示。

  3. 如果建立「互動式通信」時未鎖定附件的順序,則可以通過選擇附件並點選向下和向上箭頭來重新排序附件。

  4. 使用「Web預覽」和「打印預覽」,查看兩個輸出是否符合您的要求。

    如果您發現預覽結果令人滿意,請點選​Submit​以提交/將互動式通訊傳送至後置程式。 或者,若要進行變更,請退出預覽,返回進行變更。

格式化文字

在代理UI中編輯文字片段時,工具列會根據您選擇進行的編輯類型而變更:字型、段落或清單:

typeofformattingtoolbar字型工具欄

字型工具列

段落工具欄

段落工具欄

清單工具列

清單工具列

加亮/強調部分文本

要突出顯示/強調可編輯片段中的部分文本,請選擇文本並點選「突出顯示顏色」。

highlighttextagentui

貼上格式化文字

貼文文字

在文本中插入特殊字元

代理UI內建支援210個特殊字元。 管理員可以透過自訂🔗來新增對更多/自訂特殊字元的支援。

附件傳送

  • 使用伺服器端API將互動式通訊轉譯為互動式或非互動式PDF時,轉譯的PDF會以PDF附件的形式包含附件。
  • 當使用代理程式UI載入與互動式通訊相關聯的貼文程式作為提交的一部分時,附件會以List<com.adobe.idp.Document> inAttachmentDocs參數的形式傳遞。
  • 傳送機制工作流程(例如電子郵件和列印)也會傳送附件以及互動式通訊的PDF版本。

代理用戶介面中可用的操作和資訊

檔案片段

  • 向上/向下箭頭:在互動式通訊中向上或向下移動檔案片段的箭頭。
  • 刪除:如果允許,請從「交互通信」中刪除文檔片段。
  • 前分頁符 (適用於目標區域的子片段):在文檔片段前插入分頁符。
  • 縮進:增加或減少文檔片段的縮進。
  • 後續分頁 (適用於目標區域的子片段):在文檔片段後插入分頁符。

docfragoptions

  • 編輯(僅限文字片段):開啟RTF編輯器以編輯文字檔案片段。 有關詳細資訊,請參閱格式化文本

  • 選擇(眼睛表徵圖):包括\排除互動式通信中的文檔片段。

  • 未填充的值(資訊):指示文檔片段中未填充的變數的數量。

列出文檔片段

listoptions

  • 插入空白行:插入新的空行。
  • 選擇(眼睛表徵圖):包括\排除互動式通信中的文檔片段。
  • 跳過項目符號/編號:啟用以跳過清單文檔片段中的項目符號/編號。
  • 未填充的值(資訊):指示文檔片段中未填充的變數的數量。

將互動式通訊儲存為草稿

您可以使用代理UI為每個互動式通訊儲存一或多個草稿,並稍後擷取草稿以繼續處理。 您可以為每個草稿指定不同的名稱以加以識別。

Adobe建議依序執行這些指示,以成功將互動式通訊儲存為草稿。

啟用另存為草稿功能

預設情況下,「另存為草稿」(Save as a Draft)功能未啟用。 執行下列步驟以啟用功能:

  1. 實作ccrDocumentInstance服務提供商介面(SPI)。

    SPI可讓您將互動式通訊的草稿版本以草稿ID作為唯一識別碼,儲存至資料庫。 這些指示假設您先前已了解如何使用Maven專案建立OSGi套件組合。

    有關SPI實施示例,請參閱示例ccrDocumentInstance SPI實施

  2. 開啟http://<hostname>:<port>/ system/console/bundles並點選​安裝/更新​以上傳OSGi套件組合。 驗證已上載包的狀態顯示為​活動。 如果包的狀態未顯示為​活動,請重新啟動伺服器。

  3. 前往 https://'[server]:[port]'/system/console/configMgr.

  4. 點選​建立通信配置

  5. 選擇「啟用使用CCRDocumentInstanceService​保存」,然後點選「保存」。

將互動式通訊儲存為草稿

執行下列步驟將互動式通訊儲存為草稿:

  1. 在Forms Manager中選取「互動式通訊」,然後點選​開啟代理UI

  2. 在代理程式UI中進行適當的變更,然後點選​另存為草稿

  3. 在​Name​欄位中指定草稿的名稱,然後點選​Done

將「互動式通訊」儲存為草稿後,請點選​儲存變更​以儲存草稿的任何進一步變更。

檢索互動式通信的草稿

將互動式通訊儲存為草稿後,您可以擷取它以繼續處理。 使用以下內容檢索互動式通信:

https://server:port/aem/forms/createcorrespondence.hmtl?draftid=[draftid]

[] 草稿是指將互動式通訊儲存為草稿後產生的草稿版本唯一識別碼。

示例ccrDocumentInstance SPI實施

實作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;
    }
}

saveupdategetgetAll操作調用資料庫服務,以將交互通信另存為草稿、更新交互通信、從資料庫中檢索資料,以及檢索資料庫中所有可用的交互通信的資料。 此示例使用mySQLDataBaseServiceCRUD作為資料庫服務的名稱。

下表說明範例ccrDocumentInstance SPI實作。 它示範saveupdategetgetAll操作如何在範例實施中呼叫資料庫服務。

操作

資料庫服務示例

您可以建立互動式通訊的草稿,或直接提交。 儲存操作的API會檢查互動式通訊是否以草稿形式提交,且包含草稿名稱。 然後,API會以「儲存」作為輸入方法來呼叫mySQLDataBaseServiceCRUD服務。



[#$sd1_sf1_dp9]

mySQLDataBaseServiceCRUD服務驗證「另存為」作為輸入方法,並生成自動生成的草稿ID並將其返回到AEM。 產生草稿ID的邏輯可能因資料庫而異。



[#$sd1_sf1_dp13]

更新操作的API將檢索互動式通信草稿的狀態,並檢查互動式通信是否包含草稿名稱。 API調用mySQLDataBaseServiceCRUD服務以更新資料庫中的該狀態。



[#$sd1_sf1_dp17]

mySQLDataBaseServiceCRUD服務驗證Update作為輸入方法,並將Interactive Communication草稿的狀態保存在資料庫中。

get操作的API會檢查互動式通訊是否包含草稿ID。 然後,API調用mySQLDataBaseServiceCRUD服務,使用Get作為輸入方法來檢索互動式通信的資料。

mySQLDataBaseServiceCRUD服務驗證Get作為輸入方法,並基於草稿ID檢索互動式通信的資料。



[#$sd1_sf1_dp29]

getAll操作的API調用mySQLGetALLData服務,以檢索儲存在資料庫中的所有互動式通信的資料。

mySQLGetALLData服務檢索儲存在資料庫中的所有互動式通信的資料。



[#$sd1_sf1_dp37]

以下是實作中的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>
注意

請務必將aemfd-client-sdk檔案中的pom.xml相依性更新為6.0.160。

本頁內容