您可以使用現有資料預先填寫最適化表單的欄位。 使用者開啟表單時,會預填這些欄位的值。 有多種方式可預先填寫最適化表單欄位。 在本文中,我們將探討如何使用AEM Forms預填服務預填最適化表單。
若要進一步了解預先填入最適化表單的各種方法,請參閱本檔案🔗
若要使用預填服務預填適用性表單,您必須建立實作DataProvider介面的類別。 getPrefillData方法將具有邏輯,可建置並傳回最適化表單用來預先填入欄位的資料。 在此方法中,您可以從任何來源擷取資料,並傳回資料檔案的輸入流。 以下示例代碼提取登錄用戶的用戶配置檔案資訊,並構建XML文檔,其輸入流被返回以被自適應表單使用。
在以下的程式碼片段中,我們提供實作DataProvider介面的類別。 我們可以存取登入的使用者,然後擷取登入的使用者設定檔資訊。 然後,我們使用名為「data」的根節點元素建立XML文檔,並將適當的元素附加到此資料節點。 一旦構建XML文檔,則返回XML文檔的輸入流。
然後,此類會製作成OSGi套件組合併部署至AEM。 部署套件組合後,此預填服務便可用作最適化表單的預填服務。
public class PrefillAdaptiveForm implements DataProvider {
private Logger logger = LoggerFactory.getLogger(PrefillAdaptiveForm.class);
public String getServiceName() {
return "Default Prefill Service";
}
public String getServiceDescription() {
return "This is default prefill service to prefill adaptive form with user data";
}
public PrefillData getPrefillData(final DataOptions dataOptions) throws FormsException {
PrefillData prefillData = new PrefillData() {
public InputStream getInputStream() {
return getData(dataOptions);
}
public ContentType getContentType() {
return ContentType.XML;
}
};
return prefillData;
}
private InputStream getData(DataOptions dataOptions) throws FormsException {
try {
Resource aemFormContainer = dataOptions.getFormResource();
ResourceResolver resolver = aemFormContainer.getResourceResolver();
Session session = resolver.adaptTo(Session.class);
UserManager um = ((JackrabbitSession) session).getUserManager();
Authorizable loggedinUser = um.getAuthorizable(session.getUserID());
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("data");
doc.appendChild(rootElement);
Element firstNameElement = doc.createElement("fname");
firstNameElement.setTextContent(loggedinUser.getProperty("profile/givenName")[0].getString());
.
.
.
InputStream inputStream = new ByteArrayInputStream(rootElement.getTextContent().getBytes());
return inputStream;
} catch (Exception e) {
logger.error("Error while creating prefill data", e);
throw new FormsException(e);
}
}
}
要在伺服器上測試此功能,請執行以下操作
如果適用性表單以XSD為基礎,請確定預填服務傳回的XML檔案符合您適用性表單所依據的XSD。
如果適用性表單不是以XSD為基礎,則您必須手動系結欄位。 例如,要將適用性表單欄位綁定到XML資料中的fname元素,您將在適用性表單欄位的「綁定引用」中使用/data/fname
。