【问题标题】:Get a Sitecore item from the master DB that is the version that would be published if the site was published now从主数据库中获取一个 Sitecore 项目,该项目是现在发布站点时将发布的版本
【发布时间】:2012-03-24 12:41:20
【问题描述】:

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

该网站的性质是它必须定期但不频繁地发布(我相信一年一次),但数据将持续维护,并且 Sitecore 中批准的任何内容都需要添加到另一个系统中,所以这样做不幸的是,不能从网络数据库中导出。我希望在没有实际发布的情况下进行发布时/如果发布时使用 Sitecore 用来决定哪个版本进入 Web DB 的任何机制。

我查看了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。

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

【问题讨论】:

    标签: sitecore


    【解决方案1】:

    您可以通过两种方式完成此操作:

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

    【讨论】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多