从主数据库中获取Sitecore项,该项是如果站点现在发布将发布的版本

从主数据库中获取Sitecore项,该项是如果站点现在发布将发布的版本,sitecore,Sitecore,我正在从主数据库从Sitecore导出数据。它从特定类型的项中获取数据,并将其放入自定义XML中。我能够生成所需的XML,但现在客户机要求它从最新版本返回数据,而不是从执行导出时发布站点的版本返回数据 该网站的性质是,它必须定期发布,但不经常发布(我相信每年一次),但数据将持续维护,Sitecore中批准的任何内容都需要添加到另一个系统中,因此,不幸的是,从web数据库导出不是一个选项。我希望与Sitecore使用的任何机制挂钩,以决定在发布时/如果发布没有实际发布,则哪个版本将进入Web DB

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

该网站的性质是,它必须定期发布,但不经常发布(我相信每年一次),但数据将持续维护,Sitecore中批准的任何内容都需要添加到另一个系统中,因此,不幸的是,从web数据库导出不是一个选项。我希望与Sitecore使用的任何机制挂钩,以决定在发布时/如果发布没有实际发布,则哪个版本将进入Web DB

我已经查看了
Item.Publishing.GetValidVersion
是有效的
,和
是可发布的
,但是没有成功地使用它们。我已经阅读了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处于已批准状态,版本2处于草稿状态时,我只得到XML中的版本2


我是否误解了这些方法的用途,或者只是误用了它们?

您可以通过两种方式实现这一点:

  • 不要从
    master
    数据库获取项目,直接转到
    web
    数据库,该数据库始终具有最新的公共项目版本
  • 创建另一个发布目标(可能称为“导出”,带有
    export
    数据库),并使代码在
    export
    数据库上运行。如果要使用代码执行实际导出,请发布到导出发布目标,然后针对该数据库运行代码

  • 最后,我写了一些东西来检查当前版本是否已批准(处于标记为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;
    }
    

    我同意马克。。。如果要导出已发布的内容,请从已发布的数据库中导出。不幸的是,我无法仅导出发布到web数据库的项目。网站的性质是必须定期发布,但不经常发布(一年一次或两次),但数据将持续维护,Sitecore中批准的任何内容都需要添加到另一个系统中。将编辑问题以澄清。我将研究另一个发布目标想法,非常感谢。您认为使用这个导出数据库想法比迭代最新版本到最早版本并检查每个版本是否处于最终状态更快地开发,还是出于另一个原因更好?如果我找不到一个同样的Sitecore方法,我就会去那里。很有趣。。。。“经常”和“不经常”在这里是对立的。如果您的站点每年只从
    master
    web
    发布一次或两次,我会推荐其他发布目标选项。但是,根据您使用的Sitecore版本,它可能会清除HTML缓存,因此您可能需要覆盖缓存清除机制,以便在发布到导出时忽略清除。更新:我会在本地尝试
    export
    选项,看看它的效果如何。它应该是快速和简单的,但你可能会发现其他事情。首先,我认为它值得一个快速原型。我的意思是“固定时间重复;周期性”意义上的规则,而“在空间或时间上以很宽的间隔放置或发生”意义上的不频繁,而不是像有“规则”周期的调幅射频:)