Получить элемент Sitecore из главной базы данных, которая является версией, которая была бы опубликована, если бы сайт был опубликован сейчас - PullRequest
2 голосов
/ 07 марта 2012

Я работаю над экспортом данных из Sitecore из основной базы данных.Он получает данные из элементов определенного типа и помещает их в пользовательский XML.Я могу сгенерировать нужный мне XML, но теперь клиент попросил вместо того, чтобы возвращать данные из самой последней версии, возвращать данные из версии, которая была бы опубликована, если бы сайт был опубликован во время экспорта.

Характер сайта заключается в том, что он должен публиковаться на регулярной, но нечастой основе (я полагаю, один раз в год), но данные будут поддерживаться постоянно, и все, что утверждено в Sitecore, необходимо добавлять в другую систему.так что, к сожалению, экспорт из веб-базы данных невозможен.Я надеюсь подключиться к любому механизму, который использует Sitecore, чтобы решить, какая версия отправляется в веб-базу данных, когда / если публикация происходит без фактической публикации.

Я рассмотрел Item.Publishing.GetValidVersion, IsValid и IsPublishableно не удалось их использовать.Я прочитал документы 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 в состоянии черновика, я получаю только версию 2. в XML.

Я неправильно понимаю, для чего предназначены эти методы, или просто неправильно их использую?

Ответы [ 2 ]

4 голосов
/ 07 марта 2012

Это можно сделать двумя способами:

  1. Вместо того, чтобы получать элементы из базы данных master, перейдите непосредственно к базе данных web, которая всегда имеет самые последние версии открытых элементов.
  2. Создайте еще одну цель публикации (возможно, с именем «export», с базой данных export) и заставьте ваш код работать в базе данных export.Если вы хотите выполнить фактический экспорт с вашим кодом, опубликуйте его в целевой публикации экспорта, а затем запустите свой код для этой базы данных.
2 голосов
/ 13 марта 2012

Я закончил тем, что написал что-то, чтобы проверить, одобрена ли текущая версия (в состоянии рабочего процесса, помеченном как окончательное), и, если нет, просмотрите более старые версии, чтобы найти самую последнюю, которая одобрена. Я не проверял это строго, но, похоже, он работает правильно. Было бы яснее, если бы я перебрал все в обратном порядке и возвратил первый, который был утвержден, но я думаю, что это делает то же самое.

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