【问题标题】:Sitecore content tree shows "image" item after inserting using custom dataproviderSitecore 内容树在使用自定义数据提供程序插入后显示“图像”项
【发布时间】:2015-05-26 21:40:55
【问题描述】:

按照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 插入,在 Descendants 表中创建了一行;但是如果从外部数据库表创建,它不会创建这样的行,并且数据将正确显示而没有“图像”。

我是 sitecore 的新手,无法弄清楚这个问题的原因。

非常感谢您的帮助!

【问题讨论】:

    标签: c# .net sitecore dataprovider northwind


    【解决方案1】:

    您的内容树似乎同时使用了多个提供程序。

    如果您想确保在您的数据提供者运行后不会运行任何后续数据提供者,请调用传递给您的数据提供者的CallContext 对象上的Abort() 方法。

    有关 Sitecore 社区文档中数据提供者的更多信息。

    http://sitecore-community.github.io/docs/documentation/Sitecore%20Fundamentals/Data%20Providers/Implementing%20a%20Data%20Provider/API/

    【讨论】:

    • 非常感谢您的回复。我确实检查了每种方法,最后都有 context.abort() ;我什至每次都尝试清除缓存。这些都不起作用。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多