Fermer

mai 13, 2023

Soumettre une action pour enregistrer les contacts dans le gestionnaire de liste – Implémentation de base

Soumettre une action pour enregistrer les contacts dans le gestionnaire de liste – Implémentation de base


Une action de soumission personnalisée pour les formulaires Sitecore qui enregistrer les informations de contact dans la liste de contacts du gestionnaire de liste. Cela nous permettra de collecter les coordonnées de l’utilisateur final via un formulaire Sitecore et de les enregistrer dans la liste de contacts à l’intérieur du gestionnaire de liste. L’article contient un guide étape par étape pour la création d’une action de soumission personnalisée pour enregistrer les contacts dans le gestionnaire de liste de Sitecore.

Action de soumission de formulaire - Enregistrer dans la liste de contacts

Utilisation de l’action d’envoi personnalisée Enregistrer les contacts dans la liste de contacts dans l’éditeur de formulaire Sitecore

Ici, nous allons couvrir la mise en œuvre de base sans la possibilité de mapper les champs de formulaire à l’action d’envoi personnalisée. Cette action de soumission personnalisée n’aura que le champ Affichage de l’arborescence des éléments pour sélectionner la liste de contacts. Il peut être créé par clonage Rediriger vers la page (une action de soumission existante dans Sitecore) pour utiliser sa disposition d’éditeur SPEAK. Trouvez les étapes ci-dessous pour créer l’action de soumission personnalisée pour enregistrer des contacts dans la liste de contacts de Sitecore List Manager.

Développement d’une action de soumission personnalisée pour enregistrer les contacts dans le gestionnaire de liste

Étape 1 : Créer la mise en page de l’éditeur

Tout d’abord, nous allons créer un éditeur pour une action de soumission personnalisée dans la base de données Core.

Disposition de l'éditeur pour l'action Soumettre

Disposition de l’éditeur pour l’action Soumettre

Les dispositions de l’éditeur pour les actions de formulaire se trouvent dans le chemin indiqué ci-dessous. Tout d’abord, accédez à ce chemin.

Core: /sitecore/client/Applications/FormsBuilder/Components/Layouts/Actions

Maintenant, suivez les étapes mentionnées ci-dessous :

  1. Créez un élément en double pour l’élément « Redirection vers la page ».
  2. Remplacez le nom de l’élément par « Enregistrer dans la liste de contacts.« 
  3. Mettez à jour les champs du titre du navigateur et du nom d’affichage.
  4. Développez les éléments enfants de l’élément PageSettings.
    Core:/sitecore/client/Applications/FormsBuilder/Components/Layouts/Actions/SaveToContactList/PageSettings
  5. Sélectionner Titre de l’en-tête et changez le « Texte – Spécifie la légende pour les champs de bouton » valeur du champ.
    Example: "Select Contact list"
  6. Sélectionner En-têteSous-titre et changez le « Texte – Spécifie la légende pour les champs de bouton » valeur du champ.
    For instance, Select the desired contact list for storing the contact details.
  7. Sélectionner ItemTreeView et apportez des modifications dans les champs suivants :
    • IsCheckModeEnabled – Assurez-vous de ne pas le cocher.
    • Base de données – Mettez à jour la base de données de « $context_contentdatabase » à « master ».
    • Données statiques – Guide de mise à jour de Liste de contacts dossier situé dans « master : /sitecore/system/Panneau de configuration marketing/Listes de contacts » et son guide est « {3C94F086-453B-48FC-9F1B-2B00BC0A55C7}.« 

Note: La base de données de contexte actuelle est essentielle. Nous ne pouvons pas choisir directement le dossier de la liste de contacts (qui se trouve dans le maître) dans l’arborescence des éléments. Nous devons mettre à jour le champ avec le guid de l’élément. Activez l’affichage des valeurs de champ en tant que valeurs brutes, puis modifiez les valeurs de champ.

Enregistrer dans la liste de contacts Mise à jour des champs de mise en page de l'éditeur

Mise à jour des champs de mise en page de l’éditeur – Enregistrer dans la liste de contacts

Maintenant, la disposition de l’éditeur pour l’action de soumission SaveToContactList est prête. Après cela, nous devons créer un élément pour l’action de soumission dans la base de données principale.

Étape 2 : Créer un élément d’action de soumission

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

Master: /sitecore/system/Settings/Forms/Submit Actions
  1. Créez un élément en double pour l’élément « Redirection vers la page ».
  2. Renommez-le en « Enregistrer dans la liste de contacts ».
  3. Mettre à jour la valeur du champ de Message d’erreurExemple : « Échec de l’enregistrement des coordonnées ! »
  4. Sélectionnez l’option « Enregistrer dans la liste de contacts » pour Éditeur champ
  5. Changer l’icône de la section Apparence

Notre action de soumission personnalisée est presque prête, mais fait toujours référence à la Rediriger vers la page code. Nous devons créer une nouvelle classe pour enregistrer les données du formulaire dans la liste de contacts. Le Enregistrer dans la liste de contacts utilise également la même clé de paramètre (utilisée dans Rediriger vers la page) nommé « ID de référence ». Cette clé de paramètre stocke la valeur sélectionnée des champs ItemTreeValue affichés dans l’image ci-dessous.

Champ Paramètres - Enregistrer dans la liste de contacts Soumettre un élément d'action

Champ Paramètres – Enregistrer dans l’élément de la liste de contacts

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

Créez une nouvelle classe de modèle pour les données de paramètre comme indiqué ci-dessous.

using System;

namespace Feature.FormsExtensions.Models
{
    public class ContactListParameters
    {
        public Guid ReferenceId { get; set; }
    }
}

Nous allons maintenant créer une nouvelle classe et remplacer la méthode Execute. Ajoutez un nouveau fichier de classe nommé SaveToContactList.cs dans le dossier SubmitActions.

Note: Nous utilisons API client xConnect au lieu de API du gestionnaire de liste pour cette implémentation. Les listes de contacts sont stockées dans Sitecore en tant que définitions marketing. Vous ne pouvez accéder aux listes de contacts que par programmation via l’API List Manager sur l’instance CM ; l’API List Manager ne fonctionnera pas sur les instances de CD parce que l’application List Manager est désactivée.

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 = formSubmitContext.Fields.FirstOrDefault(field => field.Name.Equals("FirstName"));
            var lastNameField = formSubmitContext.Fields.FirstOrDefault(field => field.Name.Equals("LastName")); ;
            var emailField = formSubmitContext.Fields.FirstOrDefault(field => field.Name.Equals("Email"));

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

            try
            {
                using (var client = CreateClient())
                {
                    return SaveContactInListManager(client, firstNameField, lastNameField, emailField, data.ReferenceId);
                }
            }
            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;
        }
    }
}

Note: Le code actuel utilise des valeurs codées en dur pour prendre des références de champ. Ainsi, le formulaire doit avoir des champs FirstName, LastName et Email.

var firstNameField = formSubmitContext.Fields.FirstOrDefault(field => field.Name.Equals("FirstName"));
var lastNameField = formSubmitContext.Fields.FirstOrDefault(field => field.Name.Equals("LastName")); ;
var emailField = formSubmitContext.Fields.FirstOrDefault(field => field.Name.Equals("Email"));

Après la création et le déploiement, mettez à jour l’élément d’action de soumission avec notre type de modèle étendu. Assurez-vous d’avoir mis à jour les champs d’action de soumission comme ci-dessous.

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

Enregistrer dans la liste de contacts Envoyer l’élément d’action.

L’action de soumission personnalisée Enregistrer dans la liste de contacts est maintenant prête.

Ajoutons cette action de soumission et testons sa fonctionnalité

  1. Créez une liste de contacts vide dans Launchpad> Gestionnaire de listes> Créer> Liste de contacts vide et nommez-la «Liste de contacts client».
  2. Créez un formulaire Sitecore et ajoutez les champs FirstName, LastName et Email.
  3. Ajoutez le bouton Soumettre et attribuez-lui l’action de soumission « Enregistrer dans la liste de contacts ».
  4. Sélectionnez la liste de contacts nouvellement créée et enregistrez le formulaire.
  5. Insérez ce formulaire Sitecore dans une page et enregistrez-le.
  6. Parcourez la page et soumettez le formulaire avec les champs fournis.
  7. Vérifiez les données soumises dans Launchpad > List Manager > Contact List > « Customer Contact List ».
Enregistrer dans la liste de contacts - Démo

Enregistrer dans la liste de contacts – Démo

Comme le montre l’image ci-dessus, l’ajout de l’action de soumission aux formulaires nous invite à sélectionner la liste de contacts. Après avoir soumis le formulaire, nous pouvons voir que le contact a été ajouté à la liste de contacts (List Manager).

Mais les concepteurs de formulaires ont certaines restrictions ici car ils sont obligés d’utiliser le même nom de champ dans les formulaires que nous avons codés en dur dans le code. Dans le prochain article, nous verrons comment l’ajuster pour les concepteurs de formulaires, leur permettant de choisir le nom de champ de leur choix et de le mapper aux paramètres de contact. Restez à l’écoute pour le prochain post.

Bon apprentissage!!






Source link