シナリオ:通信を作成ユーザーインターフェイスのカスタマイズ

通信を作成ユーザーインターフェイスは、プロジェクトの要件に合わせてカスタマイズできます。このユーザーストーリーでは、一般的なカスタマイズの一部について実行方法を説明しています。

実装の概要

次の例では、通信を作成ユーザーインターフェイスを変更する手順について詳しく説明します。通信を作成ユーザーインターフェイスアプリケーションでは、次のプロジェクトのスタイルが使用されます。
  • [SDK]/riaservices/assetcomposer/10.0.0.0/flex/adobe-acm-ccr-styles.swc

  • [SDK]/riaservices/assetcomposer/10.0.0.0/flex/adobe-acm-authoring-styles.swc

  • [SDK]/riaservices/riacore/10.0.0.0/flex/adobe-lcc-styles.swc

これらのスタイルプロジェクトは、テーマとして通信を作成アプリケーションに適用されます。通信を作成ソリューションテンプレートスタイルは、CreateCorrespondence/src/CSS/ccr_styles.css ファイルで定義されます。新しいスタイルを適用するか、既存のスタイルを変更するには、通信を作成ソリューションテンプレートアプリケーションでこれらのスタイルをオーバーライドします。

アプリケーションコンテキストのカスタマイズ

通信を作成ユーザーインターフェイスの URL を変更するには、以下のタスクを実行します。
  1. 以下のファイル内の変数 CM_APPLICATION_CONTEXT の値を更新します。
    • CorrespondenceManagementSolutionTemplate/CreateCorrespondence/src/com/adobe/solutions/cmg/ccr/presentation/CCRApplication.as

    • CorrespondenceManagementSolutionTemplate/ManageAssets/src/com/adobe/solutions/cmg/manage\presentation/AMApplication.as

  2. 新しいアプリケーションコンテキストを反映するために、CorrespondenceManagementSolutionTemplate/Services/src/com/adobe/icc/bootstrap/AssetDefinitionsDeployer.java 内の CORRESPONDENCE_MANAGEMENT_ROOT_FOLDER 定数の値を更新します。

  3. 構築ブロックの設定ファイルで指定されるソリューションの場所を更新します。構築ブロック設定ファイルの場所を以下に示します。

    CorrespondenceManagementSolutionTemplate\package-resources\etc\aep\config\BuildingBlockName

    設定ファイルで指定されるソリューションの場所は、構築ブロックの設定フォルダーの場所に、ソリューションのアプリケーションコンテキストを付加して表されます(「/content」はオプション)。

    特に、以下を変更する必要があります。

    • CorrespondenceManagementSolutionTemplate\package-resources\etc\aep\config\assetcomposer\apps\cm

    • CorrespondenceManagementSolutionTemplate\package-resources\etc\aep\config\datadictionary\apps\cm

  4. 再構築と再デプロイを行います。再構築および再デプロイについては、Solution Template の構築とデプロイを参照してください。

日付の形式のカスタマイズ

Correspondence Management Solution のデフォルトの日付の形式を変更できます。
  1. 管理者アカウントを使用して CRXDE にログインします。デフォルトのユーザー ID は admin で、デフォルトのパスワードは admin です。

  2. 左ペインの /content/cm フォルダーに移動します。

  3. tbxeditor-config.xml ファイルをテキストエディターで開きます。

  4. XML ファイル内で <defaultDateFormat> タグを探して形式を変更します。

  5. tbxeditor-config.xml ファイルを保存します。

  6. ソリューションテンプレートを再構築して再デプロイし、変更を反映します。

通信を作成ユーザーインターフェイスのインデントボタンの削除

通信を作成ユーザーインターフェイスのコンテンツのインデントを変更する機能は、削除できます。インデントボタンがユーザーインターフェイスに表示されないようにするには、ツールバースキンファイルをカスタマイズしてボタンを非表示にします。
  1. Flash Builder で、CreateCorrespondence プロジェクトをパッケージエクスプローラービューで開きます。

  2. CreateCorrespondence/src/com.adobe.solutions.cmg.ccr/skins に移動します。

  3. ここにスキンファイルを作成します。例えば、toolbarSkin.mxml をスキンファイル com.adobe.solutions.acm.ccr.skins.ToolBarSkin のコピーとして作成します。

  4. 新しい toolbarSkin.mxml ファイルを変更し、インデントボタンが表示されないように、そのボタンの「includeInLayout」および「visible」プロパティを「false」に設定します。
    <s:HGroup gap="-1" > 
        <s:Button  id="rightIndentBtn" styleName="increaseIndentButton" toolTip="{resourceManager.getString('Iccuser interfaceStrings','increaseIndentBtnToolTip')}" height="23" width="29" visible="false" includeInLayout="false"/> 
        <s:Button  id="leftIndentBtn" styleName="decreaseIndentButton" toolTip="{resourceManager.getString('Iccuser interfaceStrings','decreaseIndentBtnToolTip')}"  height="23" width="29" visible="false" includeInLayout="false"/> 
    </s:HGroup>
  5. カスタマイズされたスキンファイルを使用する Solution Template スタイルシートを CreateCorrespondence/src/CSS に作成します。例えば、custom_styles.css を作成します。次のエントリを CreateCorrespondence/src/CSS/custom_styles.css に追加し、カスタマイズされたスキンがツールバークラスで使用されるようにします。
    @namespace ccrpresentation "com.adobe.solutions.acm.ccr.presentation.*"; 
     
    ccrpresentation|toolbar 
    { 
        backgroundGradientStartColor : #656565; 
        backgroundGradientEndColor    : #353535;     
        borderContainerBgColor : #525252; 
        borderColor : #222222; 
        skinClass: ClassReference("com.adobe.solutions.cmg.ccr.skins.toolbarSkin"); 
    }
  6. 新しい CSS ファイルを CreateCorrespondence/src/(デフォルトのパッケージ)/index.mxml に追加します。
    <fx:Style source="/css/custom_styles.css"/>
  7. 再構築と再デプロイを行います。再構築および再デプロイについては、Solution Template の構築とデプロイを参照してください。

インデントボタンがツールバーから削除されます。

ユーザーグループに基づいたテキストモジュールの編集

通信を作成ユーザーインターフェイスのテキストモジュールを編集する機能は、要件に応じてユーザーグループに基づいて制限できます。それには、次の手順を実行します。
  1. ユーザーグループを作成します。ユーザーグループの作成について詳しくは、http://dev.day.com/content/docs/en/crx/current/administering/user_group_ac_admin.html を参照してください。

  2. Flash Builder で、CreateCorrespondence プロジェクトをパッケージエクスプローラービューで開きます。

  3. CreateCorrespondence/src/com.adobe.solutions.cmg.ccr/presentation に移動します。

  4. ここに ActionScript クラスを作成します。例えば、com.adobe.solutions.acm.ccr.presentation.contentcapture.ModuleItemRenderer クラスを拡張する CustomModuleItemRenderer.as を作成します。このクラス内の commitProperties 関数をオーバーライドし、ユーザーグループに基づいて編集ボタンを無効にします。以下のソースコードは、「EditText」など、定義済みのユーザーグループがあることを前提としています。また、編集ボタンは、このグループに含まれるユーザーに対してのみ有効です。
    package com.adobe.solutions.cmg.ccr.presentation 
    { 
        import com.adobe.icc.services.ServiceProvider; 
        import com.adobe.icc.services.user.ISSOManager; 
        import com.adobe.solutions.acm.ccr.presentation.contentcapture.ModuleItemRenderer; 
         
        import mx.collections.IList; 
         
        import spark.components.Button; 
         
        public class CustomModuleItemRenderer extends ModuleItemRenderer 
        { 
            public var userManager:ISSOManager = ServiceProvider.getUserService(); 
            public function enableTextEditBtnBasedOnUserGroup():void 
            { 
                if(userManager && userManager.currentUser) 
                {     
                    var listGroups:IList = userManager.currentUser.groups; 
                    //If the EditText group is not assigned to the user disable the Edit button. 
                    if(listGroups.getItemIndex("EditText") == -1) 
                        textEditBtn.enabled = false;     
                }     
            } 
             
            override protected function commitProperties():void 
            { 
                super.commitProperties() 
                if(textEditBtn && textEditBtn.visible) 
                { 
                    enableTextEditBtnBasedOnUserGroup(); 
                } 
                invalidateDisplayList(); 
            } 
        } 
    }
  5. CreateCorrespondence/src/com.adobe.solutions.cmg.ccr/skins に移動します。スキンファイル TargetAreaRendererSkin.mxml を、スキンファイル com.adobe.solutions.acm.ccr.skins.contentcapture.TargetAreaRendererSkin.mxml のコピーとして作成します。新しい TargetAreaRendererSkin.mxml ファイルの moduleViewList を、CustomModuleItemRenderer を使用するように変更します。
    <s:List id="moduleViewList" contentBackgroundAlpha="1.0" 
        alternatingItemColors="[0xffffff, 0xf8f8f8]" contentBackgroundColor="0xf8f8f8" 
        itemRenderer="com.adobe.solutions.cmg.ccr.presentation.CustomModuleItemRenderer" 
        width="100%" minHeight="0" > 
        <s:layout > 
             <s:VerticalLayout horizontalAlign="contentJustify" variableRowHeight="true" gap="0" paddingTop="0" paddingBottom="0"/> 
        </s:layout> 
    </s:List>
  6. カスタマイズされたファイルを使用するスタイルシートを作成します(custom_styles.css など)。次のエントリを CreateCorrespondence/src/CSS/custom_styles.css に追加します。
    /* CSS file */ 
    @namespace s "library://ns.adobe.com/flex/spark"; 
    @namespace mx "library://ns.adobe.com/flex/mx"; 
    @namespace contentcapture "com.adobe.solutions.acm.ccr.presentation.contentcapture.*"; 
    @namespace presentation "com.adobe.solutions.cmg.ccr.presentation.*"; 
     
    contentcapture|TargetAreaRenderer 
    { 
        backgroundGradientStartColor : #656565; 
        backgroundGradientEndColor    : #353535;     
        borderContainerBgColor : #454545; 
        borderColor : #222222; 
        skinClass: ClassReference("com.adobe.solutions.cmg.ccr.skins.TargetAreaRendererSkin"); 
    } 
     
    presentation|CustomModuleItemRenderer 
    { 
        backgroundGradientStartColor : #656565; 
        backgroundGradientEndColor    : #353535;     
        borderContainerBgColor : #454545; 
        borderColor : #222222; 
        skinClass: ClassReference("com.adobe.solutions.acm.ccr.skins.contentcapture.ModuleItemRendererSkin"); 
    }
  7. このカスタム CSS ファイルが index.mxml ファイルに含まれるように index.mxml を更新します。これは、他のすべての CSS ファイルの後に追加します。
    <fx:Style source="/css/custom_styles.css"/>
  8. 再構築と再デプロイを行います。再構築および再デプロイについては、Solution Template の構築とデプロイを参照してください。

ユーザーが「EditText」グループに含まれている場合は、編集ボタンが有効になります。

表示用ターゲット領域のフィルタリング

通信を作成ユーザーインターフェイスの表示用ターゲット領域は、要件に応じてフィルタリングできます。例えば、エージェントのどの種類のアクションに対しても閉じているターゲット領域を非表示にできます。それには、次の手順を実行します。
  1. Flash Builder で、CreateCorrespondence プロジェクトをパッケージエクスプローラービューで開きます。

  2. CreateCorrespondence/src/com.adobe.solutions.cmg.ccr/presentation に移動し、カスタムフィルターターゲット領域フィルター関数を CCRApplication.as ファイルに追加します。
    import com.adobe.icc.dc.domain.IModuleInstance; 
                import com.adobe.icc.dc.domain.TargetInstance; 
                import com.adobe.icc.dc.domain.VariableInstance; 
                    import com.adobe.icc.dc.domain.TextModuleInstance; 
     
            /** 
             * Returns true if the target area needs to displayed, 
             * false if it is not to be displayed 
             */ 
            private function customTargetInstanceFilterFunction(item:Object):Boolean 
            { 
                if(! (item is TargetInstance)) 
                    return false; 
                var targetInstance:TargetInstance = item as TargetInstance; 
                //Show the target area if it allows free text 
                if(targetInstance.allowFreeText) 
                    return true; 
                if(!targetInstance.contents || targetInstance.contents.length < 1) 
                    return false; 
                //If the order is not fixed show the target area 
                if(!targetInstance.ordered) 
                    return true; 
                //Check if there is any optional content in the target area 
                for(var i:int=0; i<targetInstance.contents.length; i++) 
                { 
                    var moduleInst:IModuleInstance = targetInstance.contents[i] as IModuleInstance; 
                    if(moduleInst.optional) 
                        return true; 
                    //If there is a TextModule which is editable show the target area 
                    if(moduleInst is TextModuleInstance && moduleInst.editable) 
                        return true; 
                } 
                 
                //Check if there are any editable content variables in the target area 
                if(targetInstance.contentVariables && targetInstance.contentVariables.length > 0) 
                {     
                    for(var i:int=0; i<targetInstance.contentVariables.length; i++) 
                    { 
                        var varInst:VariableInstance = targetInstance.contentVariables[i] as VariableInstance; 
                        if(varInst.editable) 
                            return true; 
                    } 
                }     
                return false; 
            };
  3. CCRApplication.as ファイルの partAdded 関数を変更し、contentCapturePod のカスタムターゲット領域フィルター関数を設定します。
    else if(instance == contentCapturePod) 
    { 
        //Set the custom filter function here 
        contentCapturePod.targetInstanceFilterFunction = customTargetInstanceFilterFunction; 
     
        BindingUtils.bindSetter(updateContentCaptureProvider, this, ["letterInstance", "targetInstances"]); 
        BindingUtils.bindSetter(updateContentCaptureVariableList, this, ["letterInstance", "variableInstances"]); 
        contentCapturePod.addEventListener("libraryInsertEvent", handleLibraryInsertEvent); 
        contentCapturePod.addEventListener("textEditEvent", handleTextEditEvent); 
        contentCapturePod.addEventListener("activeContentChange", contentCapturePod.handleActiveContentEvent); 
        addEventListener("ItemMoveUpClickEvent", handleItemMoveUpClick); 
        addEventListener("ItemMoveDownClickEvent", handleItemMoveDownClick); 
        addEventListener("ItemDeleteClickEvent", handleItemDeleteClick); 
        addEventListener("LeftIndentClickEvent", handleLeftIndentClick); 
        addEventListener("RightIndentClickEvent", handleRightIndentClick); 
    }
  4. 再構築と再デプロイを行います。再構築および再デプロイについては、Solution Template の構築とデプロイを参照してください。

コンテンツビューのターゲット領域は、定義されたフィルター関数に基づいて表示されます。

通信を作成ユーザーインターフェイスの表示オプションのカスタマイズ

デフォルトで、通信を作成ユーザーインターフェイスでレターインスタンスを開くと、レターをデータ表示またはコンテンツ表示で表示するオプションがあります。レターインスタンスのデフォルト表示(データまたはコンテンツ)をカスタマイズできます。また、データまたはコンテンツ表示のどちらを表示するか、表示をカスタマイズすることもできます。

通信を作成の表示をカスタマイズするには

  1. [CorrespondenceManagementSolutionTemplate]\package-resources\content\cm\tbxeditor-config.xml のファイルに移動し、任意のテキストエディターでファイルを開きます。

  2. 次のノードに移動します。

    CCRDefaultView

    AUTO
    デフォルト. レターインスタンスに変数やフィールドがある場合、デフォルトで、インスタンスはデータ表示で開かれます。ドロップダウンリストで「コンテンツ」を選択して、コンテンツ表示に移動します。レターインスタンスに変数やフィールドがない場合、インスタンスはコンテンツ表示で開きます。ただし、ドロップダウンリストで「データ」を選択してデータ表示に移動できます。

    DATA
    レターインスタンスはデータ表示で開かれます。ドロップダウンリストで「コンテンツ」を選択して、コンテンツ表示に移動します。

    CONTENT
    レターインスタンスはコンテンツ表示で開かれます。ドロップダウンリストで「データ」を選択して、データ表示に移動します。

    DATA_ONLY
    レターインスタンスはデータ表示で開かれます。ドロップダウンリストにあるのは「データ」オプションのみです。この設定を使用して、レターインスタンスを開くユーザーがコンテンツ表示でインスタンスを表示できないように、許可が与えられないことを保証します。

    CONTENT_ONLY
    レターインスタンスはコンテンツ表示で開かれます。ドロップダウンリストにあるのは「コンテンツ」オプションのみです。この設定を使用して、レターインスタンスを開くユーザーがデータ表示でインスタンスを表示できないように、許可が与えられないことを保証します。

  3. tbxeditor-config.xml ファイルを保存します。

  4. ソリューションテンプレートを再構築して再デプロイし、変更を反映します。

代替データ取得の作成

通信を作成アプリケーションの代替データ取得ユーザーインターフェイスは、要件に応じて作成できます。このインターフェイスには、エージェントが入力および送信する必要があるレターのデータ要素リストが示されています。レターのコンテンツビューや PDF 表示がないので、処理が速くなります。それには、次の手順を実行します。
  1. Flash Builder で、CreateCorrespondence プロジェクトをパッケージエクスプローラービューで開きます。

  2. CreateCorrespondence/src/com.adobe.solutions.cmg.ccr/presentation に移動します。

  3. CCRApplication.as ファイルを開き、以下のソースコードを追加します。
    import com.adobe.dct.event.DCTServiceEvent; 
    import com.adobe.dct.model.DataDictionaryInstanceModel; 
    import com.adobe.dct.service.DataDictionaryUtilService; 
    import com.adobe.dct.transfer.DataDictionaryElement; 
    import com.adobe.icc.services.render.ILetterRenderService; 
    import com.adobe.icc.util.Map; 
    import com.adobe.icc.vo.Field; 
    import com.adobe.icc.vo.Variable; 
    import flash.events.MouseEvent; 
    import mx.collections.ArrayCollection;     
    import mx.rpc.remoting.RemoteObject; 
    import mx.rpc.IResponder; 
    import spark.components.FormItem; 
    import spark.components.TextInput; 
     
            [SkinPart(required="false")] 
            /** 
             * The data capture form. 
             */ 
            public var dataCaptureForm:spark.components.Form; 
             
            [SkinPart(required="false")] 
            /** 
             * Submit button which the agent will press to submit the form. 
             */ 
            public var submitBtn:Button; 
             
            private var _dataDictionaryInstance:DataDictionaryInstanceModel = null; 
            private var fieldList:IList = null; 
            private var phList:IList = null; 
            private var ddeList:IList = null; 
             
            private var textInputFieldList:ArrayCollection = new ArrayCollection(); 
            private var textInputDDEList:ArrayCollection = new ArrayCollection(); 
            private var textInputVariableList:ArrayCollection = new ArrayCollection(); 
             
            /** 
             * Wrapper function which invokes the getLetterDataElements of the LetterService 
             * running on the server 
             */ 
            public function letterServiceGetLetterDataElements(letterId:String):AsyncToken 
            { 
                var _service:RemoteObject; 
                _service = com.adobe.icc.services.ServiceLocator.getInstance().getRemoteObject("lc.icc.dbservices.letterService"); 
                var operationToken:AsyncToken = _service.getLetterDataElements(letterId); 
                return operationToken;     
            } 
             
            protected function getLetterDataElements(invokeParams:InvokeParams):void 
            { 
                var operationToken:AsyncToken = letterServiceGetLetterDataElements(invokeParams.letterId); 
                var responder:IResponder = new Responder( 
                    function(event:ResultEvent):void 
                    { 
                        Debug.info("getLetterDataElements success"); 
                        var dataElem:Map = Map.fromObject(event.result as Object); 
                         
                        if(dataElem.hasKey("Field")) 
                        { 
                            fieldList = dataElem.value("Field"); 
                            if(fieldList != null && fieldList.length > 0) 
                            { 
                                for(var i:int = 0; i<fieldList.length; i++) 
                                { 
                                    var fd:Field = fieldList[i]; 
                                    var dataCaptureFormItem:FormItem = new FormItem(); 
                                    dataCaptureFormItem.label = fd.displayName + " Field " + fd.type; 
                                    var ti:TextInput = new TextInput(); 
                                    textInputFieldList.addItemAt(ti, i); 
                                    dataCaptureFormItem.addElement(ti); 
                                    dataCaptureForm.addElementAt(dataCaptureFormItem, i); 
                                }     
                            }     
                        } 
                        if(dataElem.hasKey("DDE")) 
                        { 
                            ddeList = dataElem.value("DDE"); 
                            if(ddeList != null && ddeList.length > 0) 
                            { 
                                for(var j:int = 0; j<ddeList.length; j++) 
                                { 
                                    var dde:DataDictionaryElement = ddeList[j]; 
                                    var dataCaptureFormItem:FormItem = new FormItem(); 
                                    dataCaptureFormItem.label = dde.displayName + " DDE " + dde.elementType; 
                                    var ti:TextInput = new TextInput(); 
                                     
                                    textInputDDEList.addItemAt(ti, j); 
                                    dataCaptureFormItem.addElement(ti); 
                                    dataCaptureForm.addElementAt(dataCaptureFormItem, i+j); 
                                }     
                            }     
                        } 
                        if(dataElem.hasKey("PH")) 
                        { 
                            phList = dataElem.value("PH"); 
                            if(phList != null && phList.length > 0) 
                            { 
                                for(var k:int = 0; j<phList.length; k++) 
                                { 
                                    var ph:Variable = phList[k]; 
                                    var dataCaptureFormItem:FormItem = new FormItem(); 
                                    dataCaptureFormItem.label = ph.name + " PH " + ph.dataType; 
                                    var ti:TextInput = new TextInput(); 
                                    textInputVariableList.addItemAt(ti, k); 
                                    dataCaptureFormItem.addElement(ti); 
                                    dataCaptureForm.addElementAt(dataCaptureFormItem, i+j+k); 
                                }     
                            }     
                        } 
                    }, 
                    function(faultEvent:FaultEvent):void 
                    { 
                        Debug.error("Error in getLetterDataElements", faultEvent); 
                    } 
                ); 
                operationToken.addResponder(responder);     
            } 
             
            /** 
             * Wrapper function which invokes the serializeDataElementsToXML of the LetterRenderService 
             * running on the server 
             */ 
            public function letterRenderServiceSerializeDataElementsToXML(ddiDataAsXml:String, phValues:Object,fieldValues:Object):AsyncToken 
            { 
                var _service:RemoteObject; 
                _service = com.adobe.icc.services.ServiceLocator.getInstance().getRemoteObject("lc.icc.renderlib.letterRenderService"); 
                var operationToken:AsyncToken = _service.serializeDataElementsToXML(ddiDataAsXml, phValues, fieldValues); 
                return operationToken;     
            } 
             
            private function serializeDataElementsToXML(ddi:String, mapVar:Map, mapField:Map) 
            { 
                var operationToken:AsyncToken = letterRenderServiceSerializeDataElementsToXML(ddi, mapVar.toObject(), mapField.toObject()); 
                var responder:IResponder = new Responder( 
                    function(event:ResultEvent):void 
                    { 
                        Debug.info("serializeDataElementsToXML success"); 
                        var serializedXML:String = event.result as String; 
                        trace(serializedXML); 
                        var letterRenderService:ILetterRenderService = ServiceProvider.getLetterRenderService(); 
                        letterRenderService.renderLetterToFile(invocationParams.letterId, true, serializedXML, false, false).addHandlers( 
                            function(event:ResultEvent):void 
                            { 
                                Debug.info("renderLetter success"); 
                            }, 
                            function(faultEvent:FaultEvent):void 
                            { 
                                Debug.error("Error in renderLetter", faultEvent); 
                            } 
                        )     
                    }, 
                    function(faultEvent:FaultEvent):void 
                    { 
                        Debug.error("Error in serializeDataElementsToXML", faultEvent); 
                    } 
                ); 
                operationToken.addResponder(responder); 
            }         
             
            private function onSubmitBtnClick(e:Event) 
            { 
                var mapField:Map = new Map(); 
                var mapVar:Map = new Map(); 
                for(var i:int=0;i<textInputFieldList.length; i++) 
                { 
                    var textInput:TextInput = textInputFieldList.getItemAt(i) as TextInput; 
                    if(textInput) 
                        trace(textInput.text); 
                    mapField.assign((fieldList[i] as Field).path, textInput.text); 
                } 
                for(var i:int=0;i<textInputVariableList.length; i++) 
                { 
                    var textInput:TextInput = textInputVariableList.getItemAt(i) as TextInput; 
                    if(textInput) 
                        trace(textInput.text); 
                    mapVar.assign((phList[i] as Variable).name, textInput.text); 
                } 
                for(var i:int=0;i<textInputDDEList.length; i++) 
                { 
                    var textInput:TextInput = textInputDDEList.getItemAt(i) as TextInput; 
                    if(textInput) 
                        trace(textInput.text); 
                    if(textInput.text  && textInput.text != "") 
                        _dataDictionaryInstance.setValue((ddeList[i] as DataDictionaryElement).referenceName, textInput.text); 
                } 
                 
                 
                var dDEUtilservice:DataDictionaryUtilService = DCTServiceProvider.getUtilService(); 
                dDEUtilservice.serializeDDItoXML(_dataDictionaryInstance.vo, 
                    function(event:DCTServiceEvent):void 
                    { 
                        Debug.info("serializeDDItoXML success"); 
                        trace(event.data as String) 
                        serializeDataElementsToXML(event.data as String, mapVar, mapField); 
                    }, 
                    function(faultEvent:FaultEvent):void 
                    { 
                        Debug.error("Error in serializeDDItoXML", faultEvent); 
                    } 
                )     
            }
  4. initLetterInstance 関数を次のように変更します。

    protected function initLetterInstance(invokeParams:InvokeParams):void 
    { 
        var letterInstanceBuilder:LetterInstanceBuilder = new LetterInstanceBuilder(); 
        letterInstanceBuilder.setInitialXmlData(invokeParams.xmlData); 
        letterInstanceBuilder.setInitialXmlDataUrl(invokeParams.dataUrl); 
        letterInstanceBuilder.setLetterId(invokeParams.letterId); 
        letterInstanceBuilder.setLetterName(invokeParams.letterName); 
        letterInstanceBuilder.setLetterVersion(invokeParams.letterVersion); 
        letterInstanceBuilder.setUseTestData(invokeParams.useTestData); 
        letterInstanceBuilder.setUseLatest(invokeParams.useLatest); 
        letterInstanceBuilder.build().addHandlers( 
            function(event:ResultEvent):void 
            { 
                Debug.info("LetterInstanceBuilder success"); 
                initialXmlData = event.result.initialXmlData; 
                letterInstance = event.result.letterInstance; 
                _dataDictionaryInstance = event.result.dataDictionaryInstance; 
                 
                if(letterInstance) 
                { 
                    getLetterDataElements(invokeParams); 
                }     
            }, 
            function(faultEvent:FaultEvent):void 
            { 
                Debug.error("Error in letter Load", faultEvent); 
                if(faultEvent.fault && (faultEvent.fault.faultCode == "loadLetterFault" || faultEvent.fault.faultCode == "letterInstanceBuildFailure")) 
                { 
                    ErrorManager.showMessage(resourceManager.getString('Messages', 'errorTitle'),resourceManager.getString('Iccuser interfaceStrings', 'errorLoadLetterTitle'),null,ErrorManager.Error_Icon,0xFFFF); 
                    return; 
                } 
                ErrorManager.handleFault(faultEvent.fault, resourceManager.getString("Common","typeLetter")); 
            } 
        ); 
    }
  5. 次のように、送信ボタンのクリックハンドラーを partAdded 関数に追加します。
     else if(instance == submitBtn) 
        submitBtn.addEventListener(MouseEvent.CLICK, onSubmitBtnClick); 
  6. CreateCorrespondence/src/com.adobe.solutions.cmg.Create Correspondence/skins に移動します。CCRApplicationSkin.mxml ファイルを開きます。このファイルのコンテンツ全体を以下のソースコードに置き換えて、データ要素および「送信」ボタンが含まれるフォームを作成します。また、スキンファイルを作成することもできます。新しく作成したスキンファイルの参照を CreateCorrespondence/src/CSS/CSS_styles.css に設定します。
    <?xml version="1.0" encoding="utf-8"?> 
    <s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" 
                 xmlns:s="library://ns.adobe.com/flex/spark" 
                 xmlns:mx="library://ns.adobe.com/flex/mx" 
                 width="100%" height="100%" > 
         
        <fx:Metadata> 
            [HostComponent("com.adobe.solutions.cmg.ccr.presentation.CCRApplication")] 
        </fx:Metadata> 
         
         
         
        <fx:Script> 
            <![CDATA[ 
                import mx.collections.ArrayCollection; 
                import mx.core.user interfaceComponent; 
                 
            ]]> 
        </fx:Script> 
         
        <s:states> 
            <s:State name="initializing" /> 
            <s:State name="normal" /> 
            <s:State name="review" /> 
            <s:State name="disabled"/>         
        </s:states> 
         
        <s:Rect left="0" right="0" top="0" bottom="0"  > 
            <s:fill> 
                <s:SolidColor id="bgColor" color="0xeeeeee" alpha="1.0" /> 
            </s:fill> 
        </s:Rect> 
         
        <s:Group width="100%" height="100%" > 
            <s:layout> 
                <s:VerticalLayout gap="0" /> 
            </s:layout> 
            <s:Scroller width="100%" height="100%" > 
                <s:VGroup gap="0" width="100%" > 
                    <s:Form id="dataCaptureForm" width="100%" height="100%" > 
                        <!-- dataCaptureItems here dynamically --> 
                    </s:Form> 
                </s:VGroup> 
            </s:Scroller> 
            <s:Button id="submitBtn" width="50" height="20" label="Submit"/> 
        </s:Group> 
         
    </s:SparkSkin>
  7. 再構築と再デプロイを行います。再構築および再デプロイについては、Solution Template の構築とデプロイを参照してください。

これで、通信を作成によって、すべてのデータ要素が含まれるフォームが作成されました。エージェントは、値を入力し、下部にある送信ボタンを使用して、レターを作成できます。

このアプローチの手順では代替データ取得機能が作成されますが、前述の実装には次の制限があります。
  • データ取得フォームフィールドは、データ型に基づいてレンダリングされません。

  • 取得されたデータ要素のデフォルト値は表示されず、すべてのデータ要素について空白のテキストフィールドが示されます。

  • _dataDictionaryInstance.setValue 関数には制限があり、DDE のコレクションタイプでは失敗します。

使用ツール

このシナリオでは、Flash Builder を使用してスキンを作成し、ソリューションテンプレートを変更します。