按照Northwind DataProvider实施自定义读写提供程序。 问题是当向内容树插入新项目时,它显示项目的两个副本,另一个基本上是“图像”,即相同的ID并且不能编辑,甚至不能点击该“图像”项目。但是对真实项目的任何更改都将显示在“图像”项目上(编辑,删除)。我还检查了外部数据库(SQL Server)表,只创建了一条记录。所以,神秘之处在于Sitecore如何在内容树下两次显示该项目。
抱歉,我没有足够的声誉来发布screeshot。
方法代码:
public override ItemDefinition GetItemDefinition(ID id, CallContext context)
{
ItemDefinition newItem = null;
if (CanProcessChild(id, context))
{
object orifinalID = GetOriginalRecordID(id);
StringBuilder sqlSelect = new StringBuilder();
sqlSelect.AppendFormat("SELECT {0} FROM {1}", nameField, table);
sqlSelect.Append(GetConditions(orifinalID));
string[] result = SqlUtil.GetStringArray(sqlSelect.ToString(), connectionString);
if (result.Length > 0)
{
string itemName = result[0];
if (string.IsNullOrEmpty(itemName))
{
itemName = "unnamed item";
}
newItem = new ItemDefinition(id, itemName, MainDB.Templates[new ID(templateID)].ID, ID.Null);
((ICacheable)newItem).Cacheable = false;
}
}
return newItem;
}
public override FieldList GetItemFields(ItemDefinition item, VersionUri version, CallContext context)
{
if (CanProcessChild(item.ID, context))
{
if (context.DataManager.DataSource.ItemExists(item.ID))
{
ReflectionUtil.CallMethod(
typeof(ItemCache), CacheManager.GetItemCache(context.DataManager.Database),
"RemoveItem", true, true, new object[] { item.ID });
}
CoreItem.Builder builder = CreateItemBuilder(item, context.DataManager);
return builder.ItemData.Fields;
}
return null;
public override bool CreateItem(ID itemID, string itemName, ID tempID, ItemDefinition parent, CallContext context)
{
if (new ID(templateID) == tempID && new ID(parentItemID) == parent.ID)
{
string fields = GetFieldsName();
StringCollection valuesBuilder = new StringCollection();
foreach (string field in fieldNames)
{
if (field == nameField)
{
valuesBuilder.Add(String.Format("'{0}'", itemName));
continue;
};
if (field == idField)
{
valuesBuilder.Add(String.Format("'{0}'", ID.Encode(itemID).Substring(0, 4)));
continue;
};
valuesBuilder.Add("''");
}
string values = StringUtil.StringCollectionToString(valuesBuilder, " ,");
Insert(fields, values);
IDTable.Add(ToString(), ID.Encode(itemID).Substring(0, 4), itemID, parent.ID);
context.Abort();
return true;
}
return false;
}
CoreItem.Builder CreateItemBuilder(ItemDefinition item, DataManager dataManager)
{
CoreItem.Builder result = new CoreItem.Builder(item.ID, item.Name, item.TemplateID, dataManager);
StringBuilder sqlSelect = new StringBuilder();
sqlSelect.AppendFormat("SELECT {0} FROM {1}", fieldsNames, table);
sqlSelect.Append(GetConditions(GetOriginalRecordID(item.ID)));
using (SqlDataReader sqlResult = ExecuteReader(sqlSelect.ToString(), connectionString))
{
if (sqlResult.Read())
{
for (int i = 0; i < sqlResult.FieldCount; i++)
{
result.AddField(sqlResult.GetName(i), ToSitecoreValue(sqlResult.GetValue(i)));
}
}
}
return result;
}
基本上,CreateItem方法直接插入SQL表,Sitecore将获取新插入的项。我发现如果通过sitecore插入,则在Descendants表中创建了一行;但是如果从外部数据库表创建,它将不会创建这样的行,并且数据将在没有“图像”的情况下正确显示。
我是sitecore的新手,无法弄清楚这个问题是什么原因。
真的很感谢你的帮助!
答案 0 :(得分:1)
看起来您的内容树同时使用了多个提供程序。
如果要确保在数据提供程序运行后没有运行后续数据提供程序,请调用传递给数据提供程序的Abort()
对象上的CallContext
方法。
有关Sitecore社区文档中数据提供商的更多信息。