从主数据库获取Sitecore项目,该项目是现在发布网站时将发布的版本

时间:2012-03-06 23:57:24

标签: sitecore

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

该网站的性质是它必须定期发布(我相信每年一次),但数据将持续维护,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处于“已批准”状态且版本2处于“草稿”状态时,我只会在XML中获得版本2.

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

2 个答案:

答案 0 :(得分:4)

您可以通过以下两种方式实现:

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

答案 1 :(得分:2)

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

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;
}