Partager via


Complément SharePoint – Exemple de balisage automatique

L’exemple ECM.AutoTagging montre comment utiliser un complément hébergé par un fournisseur pour baliser automatiquement du contenu ajouté à une bibliothèque SharePoint avec des données provenant d’une propriété du profil utilisateur personnalisée.

Ce complément utilise des récepteurs d’événement distants hébergés sur un site web Azure aux fins suivantes :

  • Créer des champs, des types de contenus et des bibliothèques de documents.
  • Récupérer la valeur d’une propriété du profil utilisateur personnalisée.
  • Définir des champs de taxonomie.

Utilisez cette solution si vous souhaitez :

  • Implémenter des récepteurs d’événement dans SharePoint Online.
  • Améliorer les résultats de recherche en ajoutant des métadonnées à du contenu lors de sa création.
  • Classer votre contenu.
  • Moderniser votre code avant d’opérer une migration vers une version plus récente de SharePoint si vous avez utilisé des récepteurs d’événement dans le passé.

Avant de commencer

Pour commencer, téléchargez l’exemple de complément ECM.AutoTagging à partir du projet Pratiques et modèles Office 365 Développeur sur GitHub.

Remarque

Le code dans cet article est fourni tel quel, sans garantie d’aucune sorte, expresse ou implicite, y compris mais sans s’y limiter, aucune garantie implicite d’adéquation à un usage particulier, à une qualité marchande ou une absence de contrefaçon.

Avant d’exécuter ce complément, effectuez les opérations suivantes :

  1. Créez un site web Azure et déployez-y le projet ECM.AutoTaggingWeb.

  2. Inscrivez votre complément via la page Appregnew.aspx dans Office 365.

  3. Ce complément utilise des autorisations d’application seule. Vous devez attribuer des autorisations d’application seule via la page AppInv.aspx dans Office 365. Copiez le code XML suivant à partir du fichier AppManifest.xml dans la zone Code XML de la demande d’autorisation de la page AppInv.aspx, comme illustré dans la figure suivante.

       <AppPermissionRequests AllowAppOnlyPolicy="true">
         <AppPermissionRequest Scope="http://sharepoint/content/tenant" Right="FullControl" />
         <AppPermissionRequest Scope="http://sharepoint/taxonomy" Right="Read" />
         <AppPermissionRequest Scope="http://sharepoint/social/tenant" Right="Read" />
       </AppPermissionRequests>
    

    Capture d’écran de la page AppInv.aspx, avec les zones ID de l’application et Code XML de la demande d’autorisation mises en surbrillance.

  4. Dans le projet ECM.AutoTaggingWeb, dans le fichier ReceiverHelper.cs, dans la méthode CreateEventReciever, mettez à jour la propriété ReceiverUrl avec l’URL de votre site web Azure.

         public static EventReceiverDefinitionCreationInformation CreateEventReciever(string receiverName, EventReceiverType type)
             {
    
                 EventReceiverDefinitionCreationInformation _rer = new EventReceiverDefinitionCreationInformation();
                 _rer.EventType = type;
                 _rer.ReceiverName = receiverName;
                 _rer.ReceiverClass = "ECM.AutoTaggingWeb.Services.AutoTaggingService";
                 _rer.ReceiverUrl = "https://<Your domain>.azurewebsites.net/Services/AutoTaggingService.svc";
                 _rer.Synchronization = EventReceiverSynchronization.Synchronous;
                 return _rer;
             }
    
    

  5. Empaquetez et déployez votre complément.

Lorsque vous démarrez le complément, la page de démarrage du complément Balisage automatique de document hébergé par le fournisseur s’affiche, comme illustré dans la figure suivante. La page de démarrage présente des étapes de configuration à effectuer avant d’attribuer ou de supprimer les récepteurs d’événement.

Capture d’écran de la page de démarrage du complément de balisage automatique, avec trois étapes de configuration en surbrillance.

Utilisation de l’exemple de complément ECM.Autotagging

Cet exemple utilise un récepteur d’événement distant pour baliser automatiquement (par l’ajout de métadonnées) des documents ajoutés à une bibliothèque de documents avec des données d’une propriété du profil utilisateur personnalisée.

Le processus de balisage automatique de documents à l’aide du récepteur d’événement distant est illustré dans la figure suivante.

Illustration du processus d’étiquetage d’un document dans une bibliothèque. Lorsque l’utilisateur crée du contenu, le complément contacte le récepteur d’événements, qui accède au profil de l’utilisateur et envoie des informations à SharePoint.

Pour attribuer des métadonnées au document créé dans la bibliothèque de documents à l’aide d’un récepteur d’événement distant :

  1. Un utilisateur crée ou charge un nouveau contenu dans une bibliothèque de documents. Un récepteur d’événement distant est affecté au traitement des événements ItemAdding ou ItemAdded sur cette bibliothèque de documents.

  2. La méthode ItemAdding ou ItemAdded appelle le récepteur d’événement distant.

  3. Le complément hébergé par le fournisseur récupère la valeur d’une propriété du profil utilisateur personnalisée dans le service de profil utilisateur SharePoint pour cet utilisateur. Dans cet exemple de complément, la propriété du profil utilisateur personnalisée Classification ajoutée précédemment est récupérée.

  4. Le récepteur d’événement distant met à jour les métadonnées sur le nouveau document avec la valeur de la propriété du profil utilisateur personnalisée pour cet utilisateur.

Bouton Exécuter scénario 1

Lorsque vous choisissez le bouton Exécuter scénario 1, le complément effectue les opérations suivantes :

  1. Il crée une bibliothèque de documents.

  2. Il crée le récepteur d’événement distant pour l’événement ItemAdding.

    Remarque

    Cet article décrit le type de récepteur d’événement ItemAdding. En règle générale, le type de récepteur d’événement ItemAdding fonctionne mieux que le type de récepteur d’événement ItemAdded. L’exemple ECM.AutoTagging fournit le code pour les types de récepteurs d’événement ItemAdding et ItemAdded.

  3. Ajoute le récepteur d’événement distant à la bibliothèque de documents.

Le code suivant, dans la méthode btnScenario1_Click de la page Default.aspx.cs du projet ECM.AutoTaggingWeb présente ces étapes.

protected void btnScenario1_Click(object sender, EventArgs e)
        {
            var _libraryToCreate = this.GetLibaryInformationItemAdding();
 
            var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
            using (var ctx = spContext.CreateUserClientContextForSPHost())
            {
                try 
                { 
                    if(!ctx.Web.ListExists(_libraryToCreate.Title))
                    {
                        ScenarioHandler _scenario = new ScenarioHandler();
                        _scenario.CreateContosoDocumentLibrary(ctx, _libraryToCreate);
                    }
                    List _list = ctx.Web.Lists.GetByTitle(_libraryToCreate.Title);
                    EventReceiverDefinitionCreationInformation _rec = ReceiverHelper.CreateEventReciever(ScenarioHandler.AUTOTAGGING_ITEM_ADDING_RERNAME, EventReceiverType.ItemAdding);
                    ReceiverHelper.AddEventReceiver(ctx, _list, _rec);
                }
                catch(Exception _ex)
                {

                }
            }
        }  

La méthode CreateContosoDocumentLibrary est appelée. Le code suivant dans le fichier ScenarioHandler.cs utilise des méthodes d’OfficeDevPnP.Core pour créer une bibliothèque de documents personnalisée avec un type de contenu personnalisé. Le type de contenu par défaut dans la bibliothèque de documents est supprimé.

public void CreateContosoDocumentLibrary(ClientContext ctx, Library library)
        {
            // Check the fields.
            if (!ctx.Web.FieldExistsById(FLD_CLASSIFICATION_ID))
            {
                ctx.Web.CreateTaxonomyField(FLD_CLASSIFICATION_ID,
                                            FLD_CLASSIFICATION_INTERNAL_NAME,
                                            FLD_CLASSIFICATION_DISPLAY_NAME,
                                            FIELDS_GROUP_NAME,
                                            TAXONOMY_GROUP,
                                            TAXONOMY_TERMSET_CLASSIFICATION_NAME);
            }

            // Check the content type.
            if (!ctx.Web.ContentTypeExistsById(CONTOSODOCUMENT_CT_ID))
            {
                ctx.Web.CreateContentType(CONTOSODOCUMENT_CT_NAME,
                                          CT_DESC, CONTOSODOCUMENT_CT_ID,
                                          CT_GROUP);
            }

            // Associate fields to content types.
            if (!ctx.Web.FieldExistsByNameInContentType(CONTOSODOCUMENT_CT_NAME, FLD_CLASSIFICATION_INTERNAL_NAME))
            {
                ctx.Web.AddFieldToContentTypeById(CONTOSODOCUMENT_CT_ID,
                                                  FLD_CLASSIFICATION_ID.ToString(),
                                                  false);
            }

            
            CreateLibrary(ctx, library, CONTOSODOCUMENT_CT_ID);
        }

private void CreateLibrary(ClientContext ctx, Library library, string associateContentTypeID)
        {
            if (!ctx.Web.ListExists(library.Title))
            {
                ctx.Web.AddList(ListTemplateType.DocumentLibrary, library.Title, false);
                List _list = ctx.Web.GetListByTitle(library.Title);
                if (!string.IsNullOrEmpty(library.Description))
                {
                    _list.Description = library.Description;
                }

                if (library.VerisioningEnabled)
                {
                    _list.EnableVersioning = true;
                }

                _list.ContentTypesEnabled = true;
                _list.RemoveContentTypeByName("Document");
                _list.Update();
                
     
                ctx.Web.AddContentTypeToListById(library.Title, associateContentTypeID, true);
                ctx.Web.Context.ExecuteQuery();
               
            }
            else
            {
                throw new Exception("A list, survey, discussion board, or document library with the specified title already exists in this website.  Please choose another title.");
            }
        }

Après exécution de ce code, la bibliothèque de documents AutoTaggingSampleItemAdding est créée dans Contenu du site 4.

Capture d’écran de la page Contenu du site avec la nouvelle bibliothèque de documents AutoTaggingSampleItemAdd.


Dans le projet ECM.AutoTaggingWeb, dans le fichier ReceiverHelper.cs, la méthode CreateEventReciever crée la définition de récepteur d’événement ItemAdding. Dans le projet ECM.AutoTaggingWeb, le dossier Services inclut un service web appelé AutoTaggingService.svc. Après la publication du projet ECM.AutoTaggingWeb sur votre site web Azure, ce service web a également été déployé sur votre site. La méthode CreateEventReciever assigne ce service web en tant que récepteur d’événement distant sur la bibliothèque de documents.

Le code suivant de la méthode CreateEventReciever montre comment attribuer le service web au récepteur d’événement distant.

public static EventReceiverDefinitionCreationInformation CreateEventReciever(string receiverName, EventReceiverType type)
        {

            EventReceiverDefinitionCreationInformation _rer = new EventReceiverDefinitionCreationInformation();
            _rer.EventType = type;
            _rer.ReceiverName = receiverName;
            _rer.ReceiverClass = "ECM.AutoTaggingWeb.Services.AutoTaggingService";
            _rer.ReceiverUrl = "https://<Your domain>.azurewebsites.net/Services/AutoTaggingService.svc";
            _rer.Synchronization = EventReceiverSynchronization.Synchronous;
            return _rer;
        }


Le code suivant de la méthode AddEventReceiver attribue le récepteur d’événement distant à la bibliothèque de documents.

public static void AddEventReceiver(ClientContext ctx, List list, EventReceiverDefinitionCreationInformation eventReceiverInfo)
        {
            if (!DoesEventReceiverExistByName(ctx, list, eventReceiverInfo.ReceiverName))
            {
                list.EventReceivers.Add(eventReceiverInfo);
                ctx.ExecuteQuery();
            }
        }


Le récepteur d’événement distant est désormais ajouté à la bibliothèque de documents. Quand vous chargez un document dans la bibliothèque de documents AutoTaggingSampleItemAdding, le document est balisé avec la valeur de la propriété du profil utilisateur personnalisée Classification pour cet utilisateur.

La figure suivante montre comment afficher les propriétés sur un document.

Capture d’écran d’un document de test dans la bibliothèque avec les propriétés développées.


La figure suivante présente les métadonnées du document avec le champ Classification.

Capture d’écran montrant les métadonnées du document de test avec HBI dans le champ Classification.


La méthode HandleAutoTaggingItemAdding dans le fichier AutoTaggingService.svc.cs utilise la méthode GetProfilePropertyFor pour récupérer la valeur de la propriété de profil utilisateur Classification.

public void HandleAutoTaggingItemAdding(SPRemoteEventProperties properties,SPRemoteEventResult result)
        {
            using (ClientContext ctx = TokenHelper.CreateRemoteEventReceiverClientContext(properties))
            {
                if (ctx != null)
                {
                    var itemProperties = properties.ItemEventProperties;
                    var _userLoginName = properties.ItemEventProperties.UserLoginName;
                    var _afterProperites = itemProperties.AfterProperties;
                    if(!_afterProperites.ContainsKey(ScenarioHandler.FLD_CLASSIFICATION_INTERNAL_NAME))
                    {
                        string _classficationToSet = ProfileHelper.GetProfilePropertyFor(ctx, _userLoginName, Constants.UPA_CLASSIFICATION_PROPERTY);
                        if(!string.IsNullOrEmpty(_classficationToSet))
                        { 
                            var _formatTaxonomy = AutoTaggingHelper.GetTaxonomyFormat(ctx, _classficationToSet);
                            result.ChangedItemProperties.Add(ScenarioHandler.FLD_CLASSIFICATION_INTERNAL_NAME, _formatTaxonomy);
                        }
                    }
                }
            }
        }


> [! IMPORTANT] > Après avoir récupéré la valeur **Classification** à partir de la méthode **GetProfilePropertyFor**, la valeur **Classification** doit être mise en forme d’une certaine manière avant de pouvoir être stockée en tant que métadonnées dans le document. La méthode **GetTaxonomyFormat** dans le fichier AutoTaggingHelper.cs montre comment mettre en forme la valeur **Classification**.
public static string GetTaxonomyFormat(ClientContext ctx, string term)
        { 
            if(string.IsNullOrEmpty(term))
            {
                throw new ArgumentException(string.Format(EXCEPTION_MSG_INVALID_ARG, "term"));
            }
            string _result = string.Empty;
            var _list = ctx.Web.Lists.GetByTitle(TAXONOMY_HIDDEN_LIST_NAME);
            CamlQuery _caml = new CamlQuery();

            _caml.ViewXml = string.Format(TAXONOMY_CAML_QRY, term);
            var _listItemCollection = _list.GetItems(_caml);

            ctx.Load(_listItemCollection,
                eachItem => eachItem.Include(
                    item => item,
                    item => item.Id,
                    item => item[TAXONOMY_FIELDS_IDFORTERM]));
            ctx.ExecuteQuery();

            if (_listItemCollection.Count > 0)
            {
                var _item = _listItemCollection.FirstOrDefault();
                var _wssId = _item.Id;
                var _termId = _item[TAXONOMY_FIELDS_IDFORTERM].ToString(); ;
                _result = string.Format(TAXONOMY_FORMATED_STRING, _wssId, term, _termId);
            }

            return _result;
        }

Bouton Supprimer scénario d’événement 1

Lorsque vous cliquez sur le bouton Supprimer scénario d’événement 1, le code suivant s’exécute pour supprimer le récepteur d’événement de la bibliothèque de documents.

public static void RemoveEventReceiver(ClientContext ctx, List list, string receiverName)
        {
            ctx.Load(list, lib => lib.EventReceivers);
            ctx.ExecuteQuery();

            var _rer = list.EventReceivers.Where(e => e.ReceiverName == receiverName).FirstOrDefault();
            if(_rer != null)
            {
                _rer.DeleteObject();
                ctx.ExecuteQuery();
            }
        }

Voir aussi