2012-03-06 38 views
2

我正在从主数据库的Sitecore导出数据。它从特定类型的项目获取数据并将其放入自定义XML中。我能够生成我需要的XML,但现在客户请求不是从最新版本返回数据,而是从在执行导出时发布站点时发布的版本返回数据。从主数据库获取Sitecore项目,即现在发布网站时将发布的版本

该网站的性质是,它必须定期发布但不频繁(每年一次,我相信),但数据将被持续保存,Sitecore中任何已批准的内容都需要添加到另一个系统中,所以不幸的是,从Web数据库导出不是一种选择。我希望能够挂钩Sitecore用来决定哪些版本进入Web数据库的时间/发布情况而不实际发布。

我已经看过Item.Publishing.GetValidVersionIsValidIsPublishable但一直在把他们使用不成功。我已阅读这些方法的Sitecore文档,但描述只是说“获取有效版本”。我不确定“有效”是什么意思。

这里是我的最新尝试:

foreach (Sitecore.Data.ID courseId in courseIds) 
{ 
    Sitecore.Data.Items.Item course = master.GetItem(courseId); 
    string initialVersion = course.Version.ToString(); 
    if (course != null & course.Parent.Name != "Narrative-Courses") 
    { 
    course = course.Publishing.GetValidVersion(DateTime.Now, true, true); 
    string finalVersion = course.Version.ToString(); 
    if (initialVersion != finalVersion) 
    { 
     log(course.Name + ": " + initialVersion + ", " + finalVersion); 
    } 
    if (course != null) 
    { 
    //add xml for this item 
... 

我的记录是空白,我的XML包括每个项目的最高数量的版本,无论工作流程的状态。当某个项目的版本1处于Approved状态且版本2处于Draft状态时,我只能在XML中获得版本2。

我误解了这些方法的用途或者滥用它们吗?

回答

2

我最终写了一些内容来检查当前版本是否被批准(在标记为final的工作流程状态中),如果没有,则通过旧版本查找最新版本。我没有严格测试,但它似乎工作正常。如果我以相反的顺序迭代并返回第一个被批准的,但我认为这是同样的事情,那就更清楚了。

public Item GetBestVersion(Item item) 
{ 
Item returnItem = null; 
string wfIdString = item.Fields[Sitecore.FieldIDs.WorkflowState].Value; 
if (Sitecore.Data.ID.IsID(wfIdString)) 
{ 
    if (wfIdString != "") 
    { 
     using (new Sitecore.SecurityModel.SecurityDisabler()) 
     { 
      Sitecore.Data.Database master = Sitecore.Data.Database.GetDatabase("master"); 
      Sitecore.Data.ID workflowStateId = Sitecore.Data.ID.Parse(wfIdString); 
      Sitecore.Data.Items.Item wftarget = master.GetItem(workflowStateId); 
      if (wftarget != null) 
      { 
       Sitecore.Data.ID finalId = Sitecore.Data.ID.Parse("{FB8ABC73-7ACF-45A0-898C-D3CCB889C3EE}"); 
       if (wftarget.Fields[finalId].Value == "1") 
       { 
        return item; 
       } 
      } 
     } 
    } 
} 

foreach (Sitecore.Data.Items.Item oldVersion in item.Versions.GetOlderVersions()) 
{ 
    string oldWfIdString = oldVersion.Fields[Sitecore.FieldIDs.WorkflowState].Value; 
    if (Sitecore.Data.ID.IsID(oldWfIdString)) 
    { 
     if (oldWfIdString != "") 
     { 
      using (new Sitecore.SecurityModel.SecurityDisabler()) 
      { 
       Sitecore.Data.Database master = Sitecore.Data.Database.GetDatabase("master"); 
       Sitecore.Data.ID workflowStateId = Sitecore.Data.ID.Parse(oldWfIdString); 
       Sitecore.Data.Items.Item wftarget = master.GetItem(workflowStateId); 
       if (wftarget != null) 
       { 
        Sitecore.Data.ID finalId = Sitecore.Data.ID.Parse("{FB8ABC73-7ACF-45A0-898C-D3CCB889C3EE}"); 
        if (wftarget.Fields[finalId].Value == "1") 
        { 
         returnItem = oldVersion; 
        } 

       } 
      } 
     } 
    } 
} 
return returnItem; 
} 
4

你可以做到这一点有两种方式:

  1. 非但没有从master数据库项目的,直接去web数据库总是具有最新的公共项目的版本。
  2. 创建另一个发布目标(也许称为“导出”,带有一个export数据库),并使您的代码在export数据库上运行。当您想要使用您的代码进行实际导出时,请发布到导出发布目标,然后针对该数据库运行代码。
+0

我同意马克......如果您要导出已发布的内容,请从已发布的数据库中执行此操作。 – techphoria414 2012-03-07 04:14:37

+0

不幸的是,我不能只发布到Web数据库的项目。网站的性质是它必须定期但不频繁地发布(每年一次或两次),但数据将持续保存,Sitecore中的任何内容都需要添加到其他系统中。将编辑该问题来澄清。我会研究其他发布目标的想法,非常感谢。 – fwkb 2012-03-07 14:14:19

+0

您是否认为使用此导出数据库的想法会更快地开发,或者由于其他原因而更好地进行开发,而不是最早迭代到最新版本并检查每个版本是否处于最终状态?如果我找不到可以实现相同效果的Sitecore方法,那就是我要去的地方。 – fwkb 2012-03-07 14:21:51