Sitecore List manager Contact list Issue -- Sitecore 8.2

给大家分享一段代码,来去解决Sitecore contact list 中不能更新contact list index问题,这个问题应该是会发生在自定义Index时会存在,问题如图:

这个问题发生在sitecore 8以上,可能sitecore自己也提供一些解决办法,但是还是存在contact list 收件人永远不更新到index中,下面我们重写下FieldMap,如下:

1. 在这个节点中的文件,打开它。 path:E:|dictionary|Config_Source\App_Config\Include\zzz_SitecoreHotfixes\Sitecore.Support.108410.config

原生代码:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
    <sitecore>
        <contentSearch>
            <!-- see issue with support ID: 462088 -->
            <indexConfigurations>
                <defaultLuceneIndexConfiguration>
                    <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch">
                        <patch:attribute name="type" value="Sitecore.Support.ContentSearch.FieldMap, Sitecore.Support.108410"/>
                    </fieldMap>
                </defaultLuceneIndexConfiguration>
                <customLuceneIndexConfiguration>
                    <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch">
                        <patch:attribute name="type" value="Sitecore.Support.ContentSearch.FieldMap, Sitecore.Support.108410"/>
                    </fieldMap>
                </customLuceneIndexConfiguration>
            </indexConfigurations>
        </contentSearch>
    </sitecore>
</configuration>

修改为:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
    <sitecore>
        <contentSearch>
            <!-- see issue with support ID: 462088 -->
            <indexConfigurations>
                <defaultLuceneIndexConfiguration>
                    <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch">
                        <!--<patch:attribute name="type" value="Sitecore.Support.ContentSearch.FieldMap, Sitecore.Support.108410"/>-->
                      <patch:attribute name="type" value="|NameSpace|.SitecoreExtensions.Indexing.FieldMap, Dlw.ScBase.Website"/>
                    </fieldMap>
                </defaultLuceneIndexConfiguration>
                <customLuceneIndexConfiguration>
                    <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch">
                        <!--<patch:attribute name="type" value="Sitecore.Support.ContentSearch.FieldMap, Sitecore.Support.108410"/>-->
                      <patch:attribute name="type" value="|NameSpace|.SitecoreExtensions.Indexing.FieldMap, Dlw.ScBase.Website"/>
                    </fieldMap>
                </customLuceneIndexConfiguration>
            </indexConfigurations>
        </contentSearch>
    </sitecore>
</configuration>

2. 添加自定义Field Map

FieldMap.cs

Path:|NameSpace|.SitecoreExtensions.Indexing.FieldMap

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Sitecore.ContentSearch;
using Sitecore.Data.Fields;
using Sitecore.Diagnostics;

namespace |your namespace|.SitecoreExtensions.Indexing
{
    public class FieldMap : Sitecore.ContentSearch.FieldMap, IFieldMap
    {
        private readonly FieldInfo _fieldTypeNameMapInfo =
            typeof(Sitecore.ContentSearch.FieldMap).GetField("fieldTypeNameMap",
                BindingFlags.Instance | BindingFlags.NonPublic);

        private readonly FieldInfo _fieldNameMapInfo = typeof(Sitecore.ContentSearch.FieldMap).GetField("fieldNameMap",
            BindingFlags.Instance | BindingFlags.NonPublic);

        public new AbstractSearchFieldConfiguration GetFieldConfiguration(Type returnType)
        {
            Assert.ArgumentNotNull(returnType, "returnType");

            var list =
                ((IEnumerable<KeyValuePair<string, AbstractSearchFieldConfiguration>>)
                        _fieldTypeNameMapInfo.GetValue(this)).Select(
                        arg => new {FieldType = FieldTypeManager.GetFieldType(arg.Key), arg.Value})
                    .Where(arg => arg.FieldType != null)
                    .ToList();
            Type lookupType;
            for (lookupType = returnType;
                lookupType != null && lookupType != typeof(object);
                lookupType = lookupType.BaseType)
            {
                var data = list.FirstOrDefault(arg => arg.FieldType.Type == lookupType);
                if (data != null)
                    return data.Value;
            }
            var data1 = list.FirstOrDefault(arg => arg.FieldType.Type.IsAssignableFrom(lookupType));
            return data1?.Value;
        }

        public new AbstractSearchFieldConfiguration GetFieldConfiguration(IIndexableDataField field,
            Func<AbstractSearchFieldConfiguration, bool> fieldVisitorFunc)
        {
            // make the dictionary key case insesitive, as 'field.TypeKey' is in lower case
            // so that typeMatch fields can be indexed correctly
            var fieldTypeNameMap =
                new Dictionary<string, AbstractSearchFieldConfiguration>(
                    (Dictionary<string, AbstractSearchFieldConfiguration>) _fieldTypeNameMapInfo.GetValue(this),
                    StringComparer.InvariantCultureIgnoreCase);
            var fieldNameMap = (Dictionary<string, AbstractSearchFieldConfiguration>) _fieldNameMapInfo.GetValue(this);
            Assert.ArgumentNotNull(field, "field");
            AbstractSearchFieldConfiguration fieldConfiguration1;
            if (!string.IsNullOrEmpty(field.Name) &&
                fieldNameMap.TryGetValue(field.Name.ToLower(), out fieldConfiguration1) &&
                fieldVisitorFunc(fieldConfiguration1) ||
                fieldTypeNameMap.TryGetValue(field.TypeKey, out fieldConfiguration1) &&
                fieldVisitorFunc(fieldConfiguration1) ||
                fieldTypeNameMap.TryGetValue(field.FieldType.FullName, out fieldConfiguration1) &&
                fieldVisitorFunc(fieldConfiguration1))
                // for generic list type, we might need to use the FiledType Fullname
                return fieldConfiguration1;
            var type = Type.GetType(field.TypeKey, false, true);
            if (type != null)
            {
                var fieldConfiguration2 = GetFieldConfiguration(type);
                if (fieldConfiguration2 != null && fieldVisitorFunc(fieldConfiguration2))
                    return fieldConfiguration2;
            }
            if (field.FieldType != null)
            {
                var fieldConfiguration2 = GetFieldConfiguration(field.FieldType);
                if (fieldConfiguration2 != null && fieldVisitorFunc(fieldConfiguration2))
                    return fieldConfiguration2;
            }
            return null;
        }

        AbstractSearchFieldConfiguration IFieldMap.GetFieldConfiguration(IIndexableDataField field)
        {
            return GetFieldConfiguration(field, f => true);
        }
    }
}

修改后,你会发现你的contact list 是可以添加成功并且可以自动更新到自定义Index中。Good Luck

 

posted @ 2018-03-09 10:54  KevinMemory  阅读(322)  评论(0编辑  收藏  举报