Fermer

juin 4, 2023

Soumettre une action pour enregistrer les contacts dans le gestionnaire de liste avec le mappage des champs Partie 2 Créer une action de soumission / Blogs / Perficient

Soumettre une action pour enregistrer les contacts dans le gestionnaire de liste avec le mappage des champs Partie 2 Créer une action de soumission / Blogs / Perficient


Cet article est le troisième post sur la création d’un Soumettre une action pour enregistrer les contacts dans le gestionnaire de liste de Sitecore. Dans le post précédentnous avons développé la mise en page de l’éditeur SPEAK pour l’action de soumission personnalisée dans la base de données principale pour Soumettre une action pour avoir Capacité de mappage de terrain. Dans cette partie, nous allons construire une classe pour enregistrer les détails de la liste de contacts dans List Manager (Sitecore). Nous allons également créer un élément d’action Soumettre dans la base de données principale et l’associer à l’élément de l’éditeur SPEAK que nous avons créé dans l’article précédent.

La série comprend les pièces suivantes :

  1. Soumettre une action pour enregistrer les contacts dans le gestionnaire de liste – Implémentation de base
  2. Soumettre une action pour enregistrer les contacts dans le gestionnaire de liste avec le mappage des champs Partie 1 : Créer un éditeur SPEAK
  3. Soumettre une action pour enregistrer les contacts dans le gestionnaire de liste avec le mappage des champs Partie 2 : Créer une action de soumission

Créer une classe d’action de soumission et un élément d’action de soumission

Étape 1 : Créer une classe d’action d’envoi pour enregistrer les contacts dans la liste des contacts :

Créer un nouveau modèle ContactListParameter.cs pour les données de paramètres comme indiqué ci-dessous.

using System;

namespace Feature.FormsExtensions.Models
{
    public class ContactListParameters
    {
        public Guid FirstNameFieldId { get; set; }
        public Guid LastNameFieldId { get; set; }
        public Guid EmailFieldId { get; set; }
        public Guid ContactListId { get; set; }
    }
}

Nous allons maintenant créer une nouvelle classe et remplacer la méthode Execute. Ajouter un nouveau fichier de classe nommé SaveToContactList.cs dans le dossier SubmitActions. Le Référentiel GitHub contient la solution entière.

using System;
using System.Collections.Generic;
using System.Linq;
using Sitecore.Diagnostics;
using Sitecore.ExperienceForms.Models;
using Sitecore.ExperienceForms.Processing;
using Sitecore.ExperienceForms.Processing.Actions;
using Sitecore.XConnect;
using Sitecore.XConnect.Client;
using Sitecore.XConnect.Client.Configuration;
using Sitecore.XConnect.Collection.Model;
using Feature.FormsExtensions.Models;

namespace Feature.FormsExtensions.SubmitActions
{
    public class SaveToContactList : SubmitActionBase<ContactListParameters>
    {
        public SaveToContactList(ISubmitActionData submitActionData) : base(submitActionData)
        {
        }

        protected override bool Execute(ContactListParameters data, FormSubmitContext formSubmitContext)
        {
            Assert.ArgumentNotNull(data, nameof(data));
            Assert.ArgumentNotNull(formSubmitContext, nameof(formSubmitContext));

            var firstNameField = GetFieldById(data.FirstNameFieldId, formSubmitContext.Fields);
            var lastNameField = GetFieldById(data.LastNameFieldId, formSubmitContext.Fields);
            var emailField = GetFieldById(data.EmailFieldId, formSubmitContext.Fields);

            if (firstNameField == null && lastNameField == null && emailField == null)
            {
                return false;
            }

            try
            {
                using (var client = CreateClient())
                {
                    return SaveContactInListManager(client, firstNameField, lastNameField, emailField, data.ContactListId);
                }
            }
            catch (XdbExecutionException exception)
            {
                Logger.LogError(exception.Message, exception);
                return false;
            }
        }

        private bool SaveContactInListManager(IXdbContext client, IViewModel firstNameField, IViewModel lastNameField, IViewModel emailField, Guid contactListId)
        {
            try
            {
                var reference = new IdentifiedContactReference("ListManager", GetValue(emailField));

                var expandOptions = new ContactExpandOptions(
                        CollectionModel.FacetKeys.PersonalInformation,
                        CollectionModel.FacetKeys.EmailAddressList,
                        CollectionModel.FacetKeys.ListSubscriptions);

                var executionOptions = new ContactExecutionOptions(expandOptions);

                Contact contact = client.Get<Contact>(reference, executionOptions);

                if (contact == null)
                {
                    contact = new Sitecore.XConnect.Contact();
                    client.AddContact(contact);
                }

                SetPersonalInformation(GetValue(firstNameField), GetValue(lastNameField), contact, client);
                SetEmail(GetValue(emailField), contact, client);
                SetSubscriptionList(client, contact, contactListId);

                var contactIdentifier = new ContactIdentifier("ListManager", GetValue(emailField), ContactIdentifierType.Known);
                if (!contact.Identifiers.Contains(contactIdentifier))
                {
                    client.AddContactIdentifier(contact, contactIdentifier);
                }

                client.Submit();
                return true;
            }
            catch (XdbExecutionException exception)
            {
                Logger.LogError(exception.Message, exception);
                return false;
            }
        }

        private static void SetPersonalInformation(string firstName, string lastName, Contact contact, IXdbContext client)
        {
            if (string.IsNullOrEmpty(firstName) && string.IsNullOrEmpty(lastName))
            {
                return;
            }

            PersonalInformation personalInfoFacet = contact.Personal() ?? new PersonalInformation();
            if (personalInfoFacet.FirstName == firstName && personalInfoFacet.LastName == lastName)
            {
                return;
            }

            personalInfoFacet.FirstName = firstName;
            personalInfoFacet.LastName = lastName;

            client.SetPersonal(contact, personalInfoFacet);
        }

        private static void SetEmail(string email, Contact contact, IXdbContext client)
        {
            if (string.IsNullOrEmpty(email))
            {
                return;
            }

            EmailAddressList emailFacet = contact.Emails();
            if (emailFacet == null)
            {
                emailFacet = new EmailAddressList(new EmailAddress(email, false), "Preferred");
            }
            else
            {
                if (emailFacet.PreferredEmail?.SmtpAddress == email)
                {
                    return;
                }

                emailFacet.PreferredEmail = new EmailAddress(email, false);
            }

            client.SetEmails(contact, emailFacet);
        }

        private void SetSubscriptionList(IXdbContext client, Contact contact, Guid contactListId)
        {
            var subscriptions = contact.ListSubscriptions();
            
            var listSubscription = subscriptions?.Subscriptions.FirstOrDefault(sub => sub.ListDefinitionId == contactListId && sub.IsActive == true);

            if (listSubscription != null)
            {
                return;
            }

            if (subscriptions == null)
            {
                subscriptions = new ListSubscriptions();
            }

            var listId = contactListId;
            var isActive = true;
            var added = DateTime.UtcNow;

            ContactListSubscription subscription = new ContactListSubscription(added, isActive, listId);

            subscriptions.Subscriptions.Add(subscription);
            client.SetListSubscriptions(contact, subscriptions);
        }

        protected virtual IXdbContext CreateClient()
        {
            return SitecoreXConnectClientConfiguration.GetClient();
        }

        private static string GetValue(object field)
        {
            return field?.GetType().GetProperty("Value")?.GetValue(field, null)?.ToString() ?? string.Empty;
        }

        private static IViewModel GetFieldById(Guid id, IList<IViewModel> fields)
        {
            return fields.FirstOrDefault(field => Guid.Parse(field.ItemId) == id);
        }
    }
}

Créez et déployez maintenant la solution.

Étape 2 : Créer un élément d’action de soumission dans la base de données principale :

Basculez vers la base de données principale et accédez à l’emplacement suivant.

Master: /sitecore/system/Settings/Forms/Submit Actions
  1. Faites un clic droit sur le Soumettre des actions article.
  2. Cliquer sur Insérerpuis sélectionnez Insérer à partir du modèle.
  3. Sélectionnez le /Système/Formulaires/Soumettre une action modèle et ajoutez un élément avec le nom Enregistrer dans la liste de contacts.
  4. Mettre à jour la valeur du Type de modèle champ avec notre nom de type de modèle personnalisé.
  5. Mettre à jour la valeur du Message d’erreur champ. Exemple : « Échec de l’enregistrement des coordonnées ».
  6. Sélectionnez l’option « Enregistrer dans la liste de contacts » pour Éditeur champ.
  7. Modifiez l’icône de la section Apparence.
Enregistrer dans la liste de contacts Soumettre un élément d'action

Enregistrer dans la liste de contacts Soumettre un élément d’action

L’action de soumission personnalisée Enregistrer dans la liste de contacts est maintenant prête. Vous obtiendrez cet élément d’action de soumission créé ci-dessus en tant que package Sitecore à Master-SaveToContactList-SubmitAction.

Ajout de l’action de soumission et test de sa fonctionnalité

  1. Créez une liste de contacts vide appelée « Liste de contacts client » dans Launchpad > Gestionnaire de listes > Créer > Liste de contacts vide.
    Créer une liste de contacts vide

    Créer une liste de contacts vide

  2. Créez un formulaire Sitecore avec les champs Prénom, Nom et E-mail.
  3. Ajoutez un bouton Soumettre et liez-le à l’action de soumission « Enregistrer dans la liste de contacts ».
  4. Mappez les champs du formulaire pour le prénom, le nom et l’e-mail.
  5. Enregistrez le formulaire après avoir sélectionné la liste de contacts nouvellement créée.
    Action de soumission de formulaire Enregistrer dans la liste de contacts avec le mappage des champs

    Action de soumission de formulaire – Enregistrer dans la liste de contacts – Avec mappage de champs

  6. Ajouter Emballage de formulaire Sitecore rendu sur une page et définissez la source de données sur le formulaire créé précédemment.
  7. Parcourez la page Web et remplissez les informations requises du formulaire.
  8. Vérifiez les données qui ont été fournies (Launchpad > List Manager > Contact List > « Customer Contact List » > Faites défiler ci-dessous jusqu’à la section Contacts)
    Soumission du formulaire et vérification des résultats

    Soumission du formulaire et vérification des résultats

Conclusion

Les blogs ont fourni un guide complet pour la mise en œuvre de l’action de soumission pour enregistrer les contacts dans List Manager.

Dans le premier blognous avons exploré le processus de mise en œuvre de base, qui nous permet uniquement d’enregistrer des contacts dans une liste de contacts spécifique.

Dans le deuxième blog, nous nous sommes concentrés sur la création d’un éditeur SPEAK pour prendre en charge le mappage des champs, offrant des informations sur la personnalisation de l’interface utilisateur. Enfin, dans ce troisième blog, nous avons couvert la création d’un élément d’action de soumission et sa logique principale qui prend en charge la capacité de mappage de champs.

Nous espérons que vous avez trouvé ces blogs utiles. Bon apprentissage !!






Source link