In our project we had half a dozen dynamic fields that needed to be migrated from the scSearchContrib way of defining dynamic fileds to the Sitecore 7 way.
This post from John West paved the path for conversion: http://www.sitecore.net/Learn/Blogs/Technical-Blogs/John-West-Sitecore-Blog/Posts/2013/03/Sitecore-7-Computed-Index-Fields.aspx
Note the highlighted common code between the before and after code snapshots below:
The code went from:
using Sitecore.Data.Items;
using scSearchContrib.Crawler.DynamicFields;
namespace Web.Modules.Search.DynamicFields
{
public class IsApplicableRouteEmptyDynamicField : BaseDynamicField
{
public override string ResolveValue(Item item)
{
var applicableRouteField = item.Fields["Applicable Routes"];
if (applicableRouteField != null && !string.IsNullOrWhiteSpace(applicableRouteField.Value))
{
return "0";
}
return "1";
}
}
}
To:
using System;
using Sitecore;
using Sitecore.ContentSearch;
using Sitecore.ContentSearch.ComputedFields;
using Sitecore.Data.Items;
using Sitecore.Diagnostics;
namespace Web.Modules.Search.DynamicFields
{
// Implementation taken from: http://www.sitecore.net/Learn/Blogs/Technical-Blogs/John-West-Sitecore-Blog/Posts/2013/03/Sitecore-7-Computed-Index-Fields.aspx
public class IsApplicableRouteEmptyDynamicField : IComputedIndexField
{
public string FieldName { get; set; }
public string ReturnType { get; set; }
public object ComputeFieldValue(IIndexable indexable)
{
Assert.ArgumentNotNull(indexable, "indexable");
SitecoreIndexableItem scIndexable = indexable as SitecoreIndexableItem;
if (scIndexable == null)
{
Log.Warn("unsupported IIndexable type : " + indexable.GetType(), this);
return false;
}
Item item = (Item)scIndexable;
if (item == null)
{
Log.Warn("unsupported SitecoreIndexableItem type : " + scIndexable.GetType(), this);
return false;
}
// optimization to reduce indexing time
// by skipping this logic for items in the Core database
if (String.Compare(item.Database.Name, "core", StringComparison.OrdinalIgnoreCase) == 0)
{
return false;
}
if (item.Paths.IsMediaItem)
{
return item.TemplateID != TemplateIDs.MediaFolder
&& item.ID != ItemIDs.MediaLibraryRoot;
}
if (!item.Paths.IsContentItem)
{
return false;
}
var applicableRouteField = item.Fields["Applicable Routes"];
if (applicableRouteField != null && !string.IsNullOrWhiteSpace(applicableRouteField.Value))
{
return "0";
}
return "1";
}
}
}