お勧めの参照資料

アダプティブフォームでは、フォームを送信する際にトリガーされる「送信アクション」を登録することができます。また、提出したデータにより AEM ワークフローをトリガすることもできます。

店のコンテンツをアダプティブフォームのアクションに関連付けるようなシナリオを考えてみましょう。アクションは、ユーザから送信されたデータを含むノード(sling:Folder)を作成します。

提出したペイロードからデータを読み込む AEM ワークフローをトリガするには、次の手順を実行します。また、ワークフローはユーザーの名前とメールアドレスを取得し、データ提出を確認する電子メールを送信します。

  1. 必要なペイロード(電子メールとユーザー名)と共に、アダプティブフォームを作成します。

  2. フォームを送信した後、ワークフローを定義するためのモデルを作成します。

    1. ワークフローコンポーネントを作成します。

    2. ワークフローモデルを定義します。

  3. モデルをイベント(この場合、フォーム送信時にsling:Folderを作成)にリンクされます。

アダプティブフォームの作成

ユーザ名と電子メールアドレスを取得するための「ユーザ名を入力」と「電子メール ID」の各フィールドを含む、「XML スキーマベースのアダプティブフォーム」を作成します。XML Schema ベースのアダプティブフォームを含むパッケージをダウンロードするには、ここをクリックします。

ワークフローモデルの作成

  1. プロジェクト」のホームページから、「ツール」 > 「操作」 > 「ワークフロー」に移動します。あるいは、http://:/libs/cq/workflow/content/console.html
    を直接開きます。

  2. 新規作成」をクリックして、独自のカスタムワークフローに向けたモデルを作成します。

  3. 編集」をクリックして、カスタムワークフローを定義します。

    ワークフローモデルの編集
  4. 様々なワークフローコンポーネントとハンドラが含まれるモデルに向けたワークフローを定義します。ユーザがデータを送信した際に電子メールを送信する、カスタムのアダプティブフォームワークフローステップを記述します。

  5. CRX リポジトリ内で、説明に従ってワークフローを作成します。コンポーネントを、ここからダウンロードします。

    CRX リポジトリでのワークフローの作成
  6. 電子メールを作成してユーザの電子メールアドレスに送信するためのプロセスを定義します。このプロセスのための OSGI バンドルを作成し、展開します。

    電子メールのワークフローを作成
  7. ワークフロープロセスにテンプレートを渡すには、 processargs が必要です。

    OSGI バンドルの作成

ワークフロープロセス

OSGI バンドルの作成に関する詳細は、『CRXDE を使用して Adobe Digital Marketing Suite 向けの OSGi バンドルを作成する』を参照してください。

package com.adobe.aemds.aemworkflow;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.*;
import javax.jcr.Node;
import javax.jcr.Session;
import javax.mail.Header;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.InternetHeaders;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import com.day.cq.workflow.exec.WorkflowProcess;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.text.StrSubstitutor;
import org.apache.commons.mail.HtmlEmail;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.tika.io.CountingInputStream;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.day.cq.commons.jcr.JcrConstants;
import com.day.cq.mailer.MessageGatewayService;
import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.WorkflowSession;
import com.day.cq.workflow.exec.WorkItem;
import com.day.cq.workflow.metadata.MetaDataMap;
import org.w3c.dom.Document;

/**
 * The <code>SendDownloadAssetEmailProcess</code> will send download asset email.
 */
@Component(metatype = false)
@Service
@Properties({
        @Property(name = Constants.SERVICE_DESCRIPTION, value = "Send   email notification on submission"),
        @Property(name = "process.label", value = "Send  Email Notification on submission")
})

public class MailWorkflow implements WorkflowProcess {

    private static final Logger log = LoggerFactory.getLogger(MailWorkflow.class);
    private static final String DEFAULT_CHARSET = "utf-8";

    /**
     * resource resolver factory.
     */
    @Reference
    private ResourceResolverFactory resourceResolverFactory;

    @Reference(policy = ReferencePolicy.STATIC)
    private MessageGatewayService messageGatewayService;

    @Reference(policy = ReferencePolicy.STATIC)
    private ResourceResolverFactory resolverFactory;

    public void execute(WorkItem workItem, WorkflowSession session, MetaDataMap metaData)
            throws WorkflowException {
        MetaDataMap workflowMetaDataMap = workItem.getWorkflowData().getMetaDataMap();
        Node submitNode = null;
        ResourceResolver resolver;
        try {
            resolver =
                    resourceResolverFactory.getResourceResolver(Collections.singletonMap("user.jcr.session",
                            (Object) session.getSession()));
        } catch (final Exception e) {
            throw new WorkflowException("could not get resource resolver", e);
        }

        // do not execute upon missing mail service. osgi component still needs to be available for UI
        // selection in workflow step configuration.


        if (messageGatewayService != null) {
            try {
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                if (factory != null) {
                    DocumentBuilder builder = factory.newDocumentBuilder();
                    Document doc = null;
                    String payloadPath = workItem.getWorkflowData().getPayload().toString();
                    submitNode = resolver.getResource(payloadPath).adaptTo(Node.class);
                    if (submitNode != null) {
                        InputStream is = submitNode.getProperty("jcr:data").getBinary().getStream();
                        byte[] fileBytes = IOUtils.toByteArray(is);
                        is.close();
                        String username = null, emailAdd = null;
                        doc = builder.parse(new ByteArrayInputStream(fileBytes));
                        XPath xPath = XPathFactory.newInstance().newXPath();
                        org.w3c.dom.Node domNode = (org.w3c.dom.Node) xPath.evaluate("//emailid", doc, XPathConstants.NODE);
                        if(domNode !=null) {
                            emailAdd = domNode.getFirstChild().getNodeValue();
                        }
                        org.w3c.dom.Node domNodeForName = (org.w3c.dom.Node) xPath.evaluate("//username", doc, XPathConstants.NODE);
                        if(domNodeForName != null) {
                            username = domNodeForName.getFirstChild().getNodeValue();
                        }

                        if(emailAdd !=null && username != null ) {
                            ArrayList<InternetAddress> emailRecipients = new ArrayList<InternetAddress>(10);
                            emailRecipients.add(new InternetAddress(emailAdd));
                            if (workflowMetaDataMap != null) {

                                if (emailRecipients != null && emailRecipients.size() != 0) {
                                    String template = getEmailTemplate(metaData, session);
                                    if (template != null) {
                                        // get the string substitutes
                                        Map<String, String> valuesMap = new HashMap<String, String>();
                                        valuesMap.put("event.TimeStamp", Calendar.getInstance().getTime().toString());
                                        valuesMap.put("username", username);
                                        StrSubstitutor substitutor = new StrSubstitutor(valuesMap);

                                        final HtmlEmail email = createEmail(template, substitutor);
                                        email.setTo(emailRecipients);
                                        messageGatewayService.getGateway(HtmlEmail.class).send(email);

                                        log.info("Email was sent.");
                                    } else {
                                        log.warn("Did not send email. No email template defined");
                                    }
                                } else {
                                    log.warn("Did not send email. No recipient addresses or download URL available.");
                                }
                            } else {
                                log.warn("Did not send email. No workflow metadata is null.");
                            }
                        }

                    }
                }


            } catch (Exception e) {
                e.printStackTrace();
                log.error("Fatal error while sending email in workflow", e);
            }
        } else {
            log.warn("cannot send email, mail service unavailable. Please configure Gateway in OSGi Console");
        }
    }

    private String getEmailTemplate(MetaDataMap workflowMetaDataMap, WorkflowSession session) {
        String template = workflowMetaDataMap.get("template", String.class);
        if (template == null) {
            // load mail template
            String templatePath = workflowMetaDataMap.get("templatePath", String.class);
            template = loadTemplate(session.getSession(), templatePath);
        }
        log.debug("Loaded template: {}", template);
        return template;
    }

    private HtmlEmail createEmail(final String template, final StrSubstitutor substitutor) {
        final HtmlEmail email = new HtmlEmail();
        try {
            // Note that substitutions must be called, because they are expected to be
            // US-ASCII only or specially encoded using MimeUtils class, but substitutions might introduce other chars,
            // like e.g. Japanese characters.
            // Further the CountingInputStream class does not seem to properly count when reading Japanese characters.
            final CountingInputStream in = new CountingInputStream(new ByteArrayInputStream(template.getBytes(DEFAULT_CHARSET)));
            final InternetHeaders iHdrs = new InternetHeaders(in);
            final Map<String, String[]> hdrs = new HashMap<String, String[]>();
            final Enumeration e = iHdrs.getAllHeaders();
            while (e.hasMoreElements()) {
                final Header hdr = (Header) e.nextElement();
                final String name = hdr.getName();
                log.debug("Header: {} = {}", name, hdr.getValue());
                hdrs.put(name, iHdrs.getHeader(name));
            }

            // use the counting stream reader to read the mail body
            String templateBody = template.substring(in.getCount());

            // create email
            email.setCharset(DEFAULT_CHARSET);

            // set subject
            final String[] ret = hdrs.remove("subject");
            final String subject = (ret == null ? "" : ret[0]);
            log.info("Email subject: " + subject);
            if (!StringUtils.isEmpty(subject)) {
                email.setSubject(substitutor.replace(subject));
            }

            // set message body
            templateBody = substitutor.replace(templateBody);
            log.debug("Substituted mail body: {}", templateBody);
            email.setMsg(templateBody);

            IOUtils.closeQuietly(in);
        } catch (Exception e) {
            log.error("Create email: ", e.getMessage());
        }
        return email;
    }

    /**
     * Loads the mail templates from the repository.
     *
     * @param path    mail templates root path
     * @param session session
     * @param charSet The character set
     * @return a reader to the template or <code>null</code> if not valid.
     */
    public String loadTemplate(final Session session, final String path) {
        InputStream is = null;
        try {
            final Node content = session.getNode(path + "/" + JcrConstants.JCR_CONTENT);
            is = content.getProperty(JcrConstants.JCR_DATA).getBinary().getStream();
            final InputStreamReader r = new InputStreamReader(is, DEFAULT_CHARSET);
            final StringWriter w = new StringWriter();
            IOUtils.copy(r, w);
            return w.toString();
        } catch (final Exception e) {
            log.error("Error while loading mail template {}:{}", path, e.toString());
        } finally {
            IOUtils.closeQuietly(is);
        }
        return null;
    }

}

ダウンロード

WorkflowProcess(com.day.cq.workflow)インターフェイスの実装

public void execute(WorkItem workItem, WorkflowSession session, MetaDataMap metaData) throws WorkflowException {  

// implement it

}

Null 値を持つには、messageGatewayService 向けの『CQ メールサービス』を設定します。

このコードは、ユーザから提出された XML ファイルに表示される電子メールの ID と名前の最初のインスタンスに依存しています。データは、ユーザが提出したデータに基づいて作成されたノードの jcr:data プロパティに格納されます。

 

ワークフローモデルの承認

注意:

新しいコンポーネントは、モデルの「編集」ページにまだ表示されません。デザインモードに切り替えて、コンポーネントに対してコンポーネントグループを有効にます。

  1. コンポーネントをドラッグします。コンポーネントを編集し、電子メールテンプレートを選択します。あるいは、テンプレートを作成し、モデルを保存します。

    電子メールワークフローコンポーネントの編集
  2. 小さな電子メールテンプレートを作成します。

    電子メールテンプレートの作成
  3. ワークフロー内のステップ間の自動移行について、ハンドラを確認します。

ワークフローの起動

 

 

  1. 特定のイベントに対するワークフロープロセスをトリガします。ワークフローユーザインターフェイスに移動し、「ランチャー」タブをクリックしてランチャーを追加します。

  2. EventType として「作成済み」、NodeType として「sling:Folder」、およびパスに/content/user generated/content/forms/af を指定します。ワークフローモードとして、「AF 送信後に電子メールを送信する」を選択します。また、トポロジに基づいて、実行モード(作成、公開、または両方)を選択します。

  3. ワークフローをテストするには、アダプティブフォームを開いて詳細を記入し、「送信」をクリックします。

    ワークフローのテスト
  4. ワークフローパッケージをダウンロードするには、以下のリンクをクリックしてください。

    ダウンロード

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー