Scénario : Personnalisation de l’interface utilisateur de création de correspondance

L’interface utilisateur de création de correspondance peut être personnalisée en fonction des exigences relatives à vos projets. L’exemple ci-après décrit de quelle façon effectuer certaines des personnalisations courantes.

Présentation de l’implémentation

Les exemples suivants décrivent les étapes détaillées pour modifier l’interface utilisateur de création de correspondance. L’application de l’interface utilisateur de création de correspondance utilise les styles des projets suivants :
  • [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

Ces projets de style sont appliqués en tant que thème dans l’application de création de correspondance. Le style du modèle de solution de création de correspondance est défini dans le fichier CreateCorrespondence > src > CSS > ccr_styles.css. Pour appliquer un nouveau style ou modifier les styles existants, remplacez les styles de l’application de modèle de solution de création de correspondance.

Personnalisation du contexte d’une application

Pour modifier l’URL de l’interface utilisateur de création de correspondance, effectuez les tâches suivantes :
  1. Mettez à jour la valeur de la variable CM_APPLICATION_CONTEXT dans les fichiers suivants :
    • CorrespondenceManagementSolutionTemplate/CreateCorrespondence/src/com/adobe/solutions/cmg/ccr/presentation/CCRApplication.as

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

  2. Mettez à jour la valeur de la constante CORRESPONDENCE_MANAGEMENT_ROOT_FOLDER dans le fichier CorrespondenceManagementSolutionTemplate/Services/src/com/adobe/icc/bootstrap/AssetDefinitionsDeployer.java afin d’appliquer le nouveau contexte de l’application.

  3. Mettez à jour l’emplacement des fichiers de configuration fournis du bloc de création. L’emplacement des fichiers de configuration du bloc de création est le suivant :

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

    L’emplacement des fichiers de configuration fournis du bloc de création correspond à l’emplacement du dossier de configuration du bloc de création + le contexte d’application de la solution (l’arborescence « /content » est facultative).

    Vous devez modifier en particulier :

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

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

  4. Procédez ensuite à la régénération et au redéploiement. Pour plus d’informations sur la régénération et le redéploiement, voir Génération et déploiement du modèle de solution.

Personnalisation du format de date

Vous pouvez modifier le format de date par défaut de la solution Correspondence Management.
  1. Connectez-vous à CRXDE à l’aide d’un compte administrateur. L’ID utilisateur par défaut est admin et le mot de passe par défaut est admin.

  2. Accédez au dossier /content/cm dans le volet gauche.

  3. Ouvrez le fichier tbxeditor-config.xml dans un éditeur de texte.

  4. Localisez la balise <defaultDateFormat> dans le fichier XML file et modifiez le format.

  5. Enregistrez le fichier tbxeditor-config.xml.

  6. Régénérez et redéployez le modèle de solution pour que vos modifications prennent effet.

Suppression des boutons de retrait dans l’interface utilisateur de création de correspondance

Vous pouvez supprimer la fonction de modification de mise en retrait du contenu dans l’interface de création de correspondance. Il est possible de personnaliser le fichier d’habillage de la barre d’outils pour masquer les boutons de retrait afin qu’ils n’apparaissent pas dans l’interface utilisateur.
  1. Dans Flash Builder, ouvrez le projet CreateCorrespondence dans la vue Explorateur de package.

  2. Accédez à CreateCorrespondence > src > com.adobe.solutions.cmg.ccr > skins.

  3. Copiez un exemplaire nommé toolbarSkin.mxml du fichier d’habillage com.adobe.solutions.acm.ccr.skins.ToolBarSkin.

  4. Modifiez le nouveau fichier toolbarSkin.mxml et définissez les propriétés includeInLayout et visible des boutons de retrait sur false pour que ceux-ci ne soient plus affichés.
    <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. Pour utiliser le fichier d’habillage personnalisé, créez une feuille de style du modèle de solution (custom_styles.css par exemple) dans CreateCorrespondence > src > CSS. Pour que la classe de barre d’outils utilise l’habillage personnalisé, ajoutez l’entrée suivante dans 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. Ajoutez le nouveau fichier CSS dans CreateCorrespondence > src > (package par défaut) > index.mxml :
    <fx:Style source="/css/custom_styles.css"/>
  7. Procédez ensuite à la régénération et au redéploiement. Pour plus d’informations sur la régénération et le redéploiement, voir Génération et déploiement du modèle de solution.

Les boutons de retrait n’apparaissent plus dans la barre d’outils.

Modification d’un module de texte par groupe d’utilisateurs

Selon vos besoins, vous pouvez restreindre la possibilité de modifier un module de texte dans l’interface utilisateur de création de correspondance par groupe d’utilisateurs. Pour ce faire, procédez comme suit :
  1. Créez un groupe d’utilisateurs (pour plus d’informations, voir la documentation se trouvant à l’emplacement suivant : http://dev.day.com/content/docs/en/crx/current/administering/user_group_ac_admin.html).

  2. Dans Flash Builder, ouvrez le projet CreateCorrespondence dans la vue Explorateur de package.

  3. Accédez à CreateCorrespondence > src > com.adobe.solutions.cmg.ccr > presentation.

  4. Créez une classe ActionScript nommée CustomModuleItemRenderer.as permettant d’étendre la classe com.adobe.solutions.acm.ccr.presentation.contentcapture.ModuleItemRenderer. Remplacez la fonction commitProperties de ce fichier afin de désactiver le bouton de modification du groupe d’utilisateurs. Le code source ci-dessous suppose qu’un groupe d’utilisateurs est défini, tel que EditText. Le bouton de modification est activé uniquement pour les utilisateurs faisant partie de ce groupe.
    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. Accédez au fichier d’habillage TargetAreaRendererSkin.mxml, sous CreateCorrespondence > src > com.adobe.solutions.cmg.ccr > skins, qui est une copie du fichier com.adobe.solutions.acm.ccr.skins.contentcapture.TargetAreaRendererSkin.mxml. Modifiez moduleViewList dans le nouveau fichier TargetAreaRendererSkin.mxml afin d’utiliser CustomModuleItemRenderer, comme suit :
    <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. Créez une feuille de style (telle que custom_styles.css) afin d’utiliser les fichiers personnalisés. Ajoutez les entrées suivantes dans le fichier 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. Mettez à jour le fichier index.mxml pour qu’il inclue ce fichier CSS personnalisé après y avoir déjà inclus tous les autres fichiers CSS :
    <fx:Style source="/css/custom_styles.css"/>
  8. Procédez ensuite à la régénération et au redéploiement. Pour plus d’informations sur la régénération et le redéploiement, voir Génération et déploiement du modèle de solution.

Le bouton de modification est alors activé pour les utilisateurs faisant partie du groupe EditText.

Filtrage de l’affichage des zones ciblées

Selon vos besoins, vous pouvez filtrer l’affichage des zones ciblées dans l’interface utilisateur de création de correspondance. Par exemple, vous pouvez masquer les zones ciblées sur lesquelles l’utilisateur ne peut réaliser aucune action. Pour ce faire, procédez comme suit :
  1. Dans Flash Builder, ouvrez le projet CreateCorrespondence dans la vue Explorateur de package.

  2. Accédez à CreateCorrespondence > src > com.adobe.solutions.cmg.ccr > presentation et ajoutez une fonction de filtrage de zones ciblées personnalisé dans le fichier 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. Modifiez la fonction partAdded dans le fichier CCRApplication.as, puis configurez la fonction de filtrage de zones ciblées personnalisé pour 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. Procédez ensuite à la régénération et au redéploiement. Pour plus d’informations sur la régénération et le redéploiement, voir Génération et déploiement du modèle de solution.

Les zones ciblées dans l’affichage de contenu sont affichées selon la fonction de filtrage définie.

Personnalisation des options d’affichage de l’interface utilisateur de création de correspondance

Par défaut, si vous ouvrez une instance de lettre dans l’interface utilisateur de création de correspondance, vous avez la possibilité d’afficher la lettre en mode Données ou Contenu. Vous pouvez personnaliser l’affichage par défaut (Données ou Contenu) de l’instance de lettre. Vous pouvez également personnaliser l’affichage (Données ou Contenu).

Personnalisation de l’affichage Création de correspondance

  1. Accédez au fichier [CorrespondenceManagementSolutionTemplate]\package-resources\content\cm\tbxeditor-config.xml et ouvrez le fichier dans un éditeur de texte.

  2. Accédez au nœud suivant :

    CCRDefaultView

    AUTO
    Par défaut. Si l’instance de lettre contient des variables ou des champs, l’instance s’ouvre par défaut en mode d’affichage Données. Sélectionnez Contenu dans la liste déroulante pour passer en mode d’affichage Contenu. Si l’instance de lettre ne contient aucune variable ni champ, elle s’ouvre en mode d’affichage Contenu. Cependant, vous pourrez sélectionner Données dans la liste déroulante pour accéder au mode d’affichage Données.

    DATA
    L’instance de lettre s’ouvre en mode d’affichage Données. Sélectionnez Contenu dans la liste déroulante pour passer en mode d’affichage Contenu.

    CONTENT
    L’instance de lettre s’ouvre en mode d’affichage Contenu. Sélectionnez Données dans la liste déroulante pour passer au mode d’affichage Données.

    DATA_ONLY
    L’instance de lettre s’ouvre en mode d’affichage Données. La liste déroulante contient uniquement l’option Données. Utilisez ce paramètre pour vous assurer qu’un utilisateur qui ouvre une instance de lettre ne sera pas autorisé à afficher l’instance en mode d’affichage Contenu.

    CONTENT_ONLY
    L’instance de lettre s’ouvre en mode d’affichage Contenu. La liste déroulante contient uniquement l’option Contenu. Utilisez ce paramètre pour vous assurer qu’un utilisateur qui ouvre une instance de lettre ne sera pas autorisé à afficher l’instance en mode d’affichage Données.

  3. Enregistrez le fichier tbxeditor-config.xml.

  4. Régénérez et redéployez le modèle de solution pour que vos modifications prennent effet.

Création d’une capture de données alternative

Selon vos besoins, vous pouvez créer une interface utilisateur de capture de données alternative pour l’application de création de correspondance. Cette interface peut afficher la liste des éléments de données d’une lettre que l’utilisateur doit remplir avant d’envoyer la lettre. Il n’existe aucune vue de contenu ni aucun affichage au format PDF de la lettre permettant un traitement plus rapide. Procédez comme suit :
  1. Dans Flash Builder, ouvrez le projet CreateCorrespondence dans la vue Explorateur de package.

  2. Accédez à CreateCorrespondence > src > com.adobe.solutions.cmg.ccr > presentation.

  3. Ouvrez le fichier CCRApplication.as et ajoutez le code source ci-dessous.
    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. Modifiez la fonction initLetterInstance comme suit :

    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. Ajoutez le gestionnaire de clics pour le bouton d’envoi dans la fonction partAdded, comme suit :
     else if(instance == submitBtn) 
        submitBtn.addEventListener(MouseEvent.CLICK, onSubmitBtnClick); 
  6. Accédez à CreateCorrespondence > src > com.adobe.solutions.cmg.Create Correspondence > skins. Ouvrez le fichier CCRApplicationSkin.mxml. Remplacez l’intégralité du contenu de ce fichier par le code source ci-dessous pour créer un formulaire avec les éléments de données et un bouton Envoyer. Vous pouvez également créer un fichier d’habillage. Fournissez la référence du fichier d’habillage nouvellement créés dans 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. Procédez ensuite à la régénération et au redéploiement. Pour plus d’informations sur la régénération et le redéploiement, voir Génération et déploiement du modèle de solution.

L’application de création de correspondance génère désormais des formulaires avec tous les éléments de données. Pour créer la lettre, l’utilisateur peut saisir les valeurs et appuyer sur le bouton Envoyer situé dans la partie inférieure de la fenêtre.

Les étapes présentent l’approche permettant de créer la fonction de capture de données alternative ; toutefois l’implémentation ci-dessus comporte certaines limites :
  • La fonction ne permet pas effectuer le rendu des champs de formulaire de capture de données en fonction du type de données.

  • Elle ne permet pas non plus d’afficher les valeurs par défaut des éléments de données récupérés, tous les champs d’éléments de données sont vides.

  • La fonction _dataDictionaryInstance.setValue comporte également des limites ; en effet, elle ne prend pas en charge les types de collection des éléments de dictionnaire de données.

Outils utilisés

Ce scénario utilise Flash Builder pour créer l’habillage et modifier le modèle de solution.