Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • Base Framework for putting products into queue for processing

  • Full import job

  • Import job for products changed last 30 days

  • Syncronizing products that is in queue

...

Episerver Fields in Digizuite

In Digizuite UI, there is an Episerver Commerce panel with ProductIds field. Example bellow and Example package are using this field to connect DAM assets to products in commerce.

...

Example code

Querying DAM for assets by codes

This code is essential for querying the DAM. Example taken from Example package source file CommerceAssetConnector.cs

Code Block
//Query to Digizuite
AssetQueryParameters aq = new Digizuite.Episerver.Models.AssetQueryParameters
{
    FoldersToSearch = null,
    AssetTypes = null,
    CropName = null,
    Sort = null,
    Limit = -1,
    Page = -1,
    OptionalFilters = new System.Collections.Generic.Dictionary<string, string>()
};
aq.OptionalFilters.Add("sProductIds_type_multistrings", "1");
aq.OptionalFilters.Add("sProductIds", code);
//possible to add products/skus
//aq.OptionalFilters.Add("sProductIds", nextcode);

IEnumerable<IContent> connectedMedia = IDigizuiteClient.Search(aq);

The IDigizuiteClient returns the IContent representation of the asset from DAM, that can be connected to Episerver Product/SKU CommerceMediaCollection where Media is connected.

How to connect assets to an Episerver product/SKU

This code sample attaches the IContent from DAM to product/SKUs

Code Block
IEnumerable<IContent> assetlist = _client.Search(aq); //_client is DI of IDigizuiteClient

if (assetlist.Any()) //check if any result from DAM
{
    if (_contentLoader.TryGet<IContent>(item.ContentReference, out IContent content))
    {
        if (content is IAssetContainer assetContainer)//contains CommerceMediaCollection
        {
            IAssetContainer ac = (content as EntryContentBase).CreateWritableClone() as IAssetContainer;
            var updated = false;
            //Decomment to remove CommerceMediaCollection for deletion of image, but this is not recomended for performance to delete and add for efter run, to much overhead.
            //reset commerce collection
            //if (ac.CommerceMediaCollection.Any())
                  //ac.CommerceMediaCollection = new ItemCollection<CommerceMedia>();
                  
            foreach (var asset in assetlist)
            {
                try
                {                                    
                    //check if allready connected
                    if (!ac.CommerceMediaCollection.Any(x => x.AssetLink.ID == asset.ContentLink.ID))
                    {
                        ac.CommerceMediaCollection.Insert(0, new CommerceMedia() { AssetLink = asset.ContentLink, SortOrder = 0, AssetType = "episerver.core.icontentimage", GroupName = "Digizuite" });
                        updated = true;
                    }
                    else
                    {
                        var m1 = $"Digizuite id {asset.ContentLink.ID} allready connected to {code}<br/>";
                        _logger.Debug(m1);
                        returnmessage += m1;
                        Success = true;
                        continue;
                    }
                }
                catch (Exception e)//if allready connected error
                {
                    var m2 = $"Digizuite id {asset.ContentLink.ID} failed to connect to {code} {e.Message}<br/>";
                    _logger.Debug(m2);
                    returnmessage += m2;
                    Success = false;
                    continue;
                }

                var m3 = $"Digizuite id {asset.ContentLink.ID} has been connected to {code}<br/>"; ;
                _logger.Debug(m3);
                returnmessage += m3;
                Success = true;
            }

            if (updated)
            {
                try
                {
                    //saving your change
                    //use ForceCurrentVersion and SkipValidation for performance boost/less overhead database work <-- secret
                    _contentRepository.Save(ac as IContent, EPiServer.DataAccess.SaveAction.Publish | EPiServer.DataAccess.SaveAction.SkipValidation | EPiServer.DataAccess.SaveAction.ForceCurrentVersion, EPiServer.Security.AccessLevel.NoAccess);
                }
                catch (Exception e) {
                    var m4 = $"Saving Commerce Asset failed. contentReference: {(ac as IContent).ContentLink.ID} code: {code}";
                    returnmessage += m4;
                    _logger.Error(m4, e);
                    Success = false;
                }
            }
        }
    }
}

Programmatically update the DAM with ProductIds

This code is an example how you may update a DAM Asset with ProductIds (SKU Code) from Episerver.

Code Block
using Digizuite.Api.Core.Shared.Model; //from Digizuite.Api.Core.AspNet
private readonly IDigizuiteClient _client; //from Digizuite.Episerver

private void AddSkuToDamAsset(ContentReference assetLink, string skuCode)
{
    var content = _contentLoader.Get<IDigizuiteContent>(assetLink);
    if (!String.IsNullOrEmpty(skuCode) && content != null) {
        List<MetadataValue> lst = new List<MetadataValue>();
        //use metafieldLabelid from Digizuite center
        lst.Add(new MetadataValue("51992", MetadataFieldType.EditMultiComboValue.ToString(), 
            new string[] { skuCode }, BatchUpdateType.Asset));
        var res = _client.Configuration.MetaDataService.UpdateMetadata(content.ItemId, lst).Result;

        if (!res.Success)
        {
            resultMessage += res.Error + "<br/>";
        }
    }
}

Result in DAM:

...