Sitecore内容树显示“图像”;项,在使用自定义数据提供程序插入后
本文关键字:数据 自定义 插入 程序 显示 图像 Sitecore | 更新日期: 2023-09-27 17:50:52
通过遵循Northwind DataProvider实现自定义读写提供程序。问题是,当插入一个新的项目到内容树,它显示了项目的两个副本,另一个基本上是"图像",即相同的ID,不能编辑,甚至不能点击"图像"项目。但是对实际项目的任何更改都会显示在"图像"项目上(编辑,删除)。我还检查了外部数据库(SQL Server)表,只有一条记录被创建。因此,神秘之处在于Sitecore如何在内容树下显示条目两次。
对不起,我没有足够的声誉来发布截图。
方法代码:
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插入,在后代表中创建了一行;但是,如果从外部数据库表创建,它将不会创建这样的行,并且没有"image"的数据将正常显示。
我是sitecore的新手,不知道这个问题是什么原因。
非常感谢你的帮助!
看起来你的内容树同时使用了多个提供商
如果您想确保在您的数据提供程序运行之后没有后续的数据提供程序运行,则调用传递给您的数据提供程序的CallContext
对象的Abort()
方法。
关于Sitecore社区文档中数据提供程序的更多信息。
http://sitecore-community.github.io/docs/documentation/Sitecore%20Fundamentals/Data%20Providers/Implementing%20a%20Data%20Provider/API/