Process Taxonomies for Media Content
Due to Sitefinity's limitations, media content taxonomies cannot be resolved out of the box from the connector and a custom search service should be created for this.
This article provides an example of extending the search service and developing a logic for exporting media content taxonomies.
Prerequisite
Installed Connector - https://bridgeline.atlassian.net/wiki/spaces/CON/pages/3468472522
Register Custom Search Service
In order to use your custom search service instead of the built-in one you need to register it in the backend.
Please refer to this documentation - https://bridgeline.atlassian.net/wiki/spaces/CON/pages/3468466897
Add Taxonomy Fields to the Index
Go to Sitefinity’s Search indexes backend page and open the the desired index (your-website-domain/Sitefinity/Administration/Search).
In the Advanced section of the search index editor add - Category, Tags
Add a Tag or a Category to one of your Media Content - Documents
Setup search service
In order to add taxonomy fields to the index you need to create a custom search service which inherits the HawkseachService class and overrides the CreateIndex and UpdateIndex methods. Please refer to the code snippet below.
Process Media Content Taxonomies
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using Hawksearch.Search;
using Telerik.OpenAccess;
using Telerik.Sitefinity.Modules.Libraries;
using Telerik.Sitefinity.Publishing;
using Telerik.Sitefinity.Services.Search.Data;
using Telerik.Sitefinity.Taxonomies;
using Telerik.Sitefinity.Taxonomies.Model;
namespace SitefinityWebApp.Search
{
public class CustomSearchService : HawksearchService
{
private const string DocumentType = "Telerik.Sitefinity.Libraries.Model.Document";
public override void UpdateIndex(string name, IEnumerable<IDocument> documents)
{
var documentList = documents.ToList();
var contentType = string.Empty;
var doc = documentList.FirstOrDefault();
if (doc != null && doc.Fields.FirstOrDefault(f => f.Name == "ContentType") != null)
{
var contentTypeField = doc.Fields.FirstOrDefault(f => f.Name == "ContentType").Value;
if (contentTypeField != null)
{
contentType = contentTypeField.ToString();
}
}
if (string.Equals(contentType, DocumentType, StringComparison.InvariantCultureIgnoreCase))
{
var librariesManager = LibrariesManager.GetManager();
var taxonomyManager = TaxonomyManager.GetManager();
var mediaDocuments = librariesManager.GetDocuments().ToList();
var taxonomies = taxonomyManager.GetTaxa<Taxon>().ToList();
foreach (var document in documentList.Cast<Telerik.Sitefinity.Services.Search.Model.Document>())
{
var id = document.Fields.FirstOrDefault(f => f.Name == "Id");
var documentId = Guid.Empty;
if (id != null)
{
documentId = Guid.Parse(id.Value.ToString());
}
var properties = TypeDescriptor.GetProperties(mediaDocuments.FirstOrDefault(m => m.Id == documentId));
foreach (PropertyDescriptor property in properties)
{
if (property != null)
{
if (property.PropertyType == typeof(TrackedList<Guid>))
{
var taxonomyIds = mediaDocuments.FirstOrDefault(m => m.Id == documentId).GetPropertyValue<TrackedList<Guid>>(property.Name);
var taxonomyNames = new List<string>();
foreach (var taxonomyId in taxonomyIds)
{
var taxonName = string.Empty;
var taxon = taxonomies.FirstOrDefault(t => t.Id == taxonomyId);
if (taxon != null)
{
taxonName = taxon.Title;
}
taxonomyNames.Add(taxonName);
}
if (document.Fields.FirstOrDefault(f => f.Name == property.Name) != null)
{
document.Fields.FirstOrDefault(f => f.Name == property.Name).Value = taxonomyNames.ToArray();
}
}
}
}
}
}
base.UpdateIndex(name, documentList);
}
}
}
Â
Â
Â