Tridion 2009 - Использование Interops - есть ли возможность добавить несколько setConditions для одного и того же имени

Я застрял с небольшой проблемой.

Я хочу добавить несколько setConditions для одного и того же имени, что и для PublicationTarget. Это использует Interps DLL.

ListRowFilter rowFilter = mTDSE.CreateListRowFilter();
rowFilter.SetCondition("StartDate", sDate);
rowFilter.SetCondition("EndDate", eDate);
rowFilter.SetCondition("PublicationTarget", pubStgTarget);

За это PublicationTargetЯ хочу фильтровать с помощью постановки и живой цели, и я попробовал все способы, но безрезультатно

rowFilter.SetCondition("PublicationTarget", pubStgTarget);

Пожалуйста, предложите,
1. Прохождение xis возможно, каков наилучший способ достичь?

Я попробовал это, но не повезло;

rowFilter.SetCondition("PublicationTarget", "tcm:0-1-65537"); // Gives only staging
rowFilter.SetCondition("PublicationTarget", "tcm:0-2-65537"); // Gives only Live
rowFilter.SetCondition("PublicationTarget", "tcm:0-1-65537|tcm:0-1-65537"); // No result
rowFilter.SetCondition("PublicationTarget", oPubList); // No result - `oPubList` is a 

List<string>

2 ответа

Решение

Нет, к сожалению, это невозможно. Если вы хотите поставить условие на PublicationTargetдолжно быть только одному PublicationTarget,

Однако есть 2 обходных пути:

  1. Создать два RowFilters и установить другой PublicationTarget состояние в каждом из них. Затем вы должны выполнить запрос дважды (один раз для каждого фильтра). Это означает, что вам нужно обработать 2 XML-результирующих узла.

  2. Не используйте PublicationTarget состояние при выполнении GetListPublishTransactions(), Затем вы получите элемент XML, содержащий записи для всех PublicationTargets, В своем коде вы будете фильтровать только те, которые вас интересуют (например, Staging или Live).

Я бы, вероятно, использовал #2 (если я не знаю, что очередь публикации может потенциально вернуть очень большое количество записей, и в этом случае я бы использовал #1).

Пример кода для #2:

tdse = new TDS.TDSEClass();
tdse.Impersonate(user.Title);
tdse.Initialize();

mgtInfo = tdse.GetManagementInfo();
filter = tdse.CreateListRowFilter();

filter.SetCondition("InfoType", 2); // InProgress
filter.SetCondition("Publication", "tcm:0-23-1");

XmlDocument dom = new XmlDocument();
dom.LoadXml(mgtInfo.GetListPublishTransactions(filter));

XmlNamespaceManager namespaceManager = new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace("tcm", "http://www.tridion.com/ContentManager/5.0");

String xPath = String.Format(
    "tcm:ListPublishTransactions/tcm:Item[@PublicationTarget='{0}'] | " +
    "tcm:ListPublishTransactions/tcm:Item[@PublicationTarget='{1}']",
    stagingTcmUri, liveTcmUri);
XmlNodeList nodeList = dom.SelectNodes(xPath, namespaceManager);

foreach (XmlNode node in dom.DocumentElement.ChildNodes) {
    //do your thing
}

Примечание: дважды проверьте выражение XPath, на самом деле я не проверял этот бит.

Public Function GetListPublishTransactions( Optional ByVal rowFilter As TDS.ListRowFilter ) As String

Метод GetListPublishTransactions принимает следующие условия как часть фильтра:

  • InfoType (строка) (ScheduledForPublish 0, WaitingForPublish 1, InProgress 2, ScheduledForDeployment 3, WaitingForDeployment 4, Failed 5, Success 6) (Пропустить для всех)
  • StartDate (dateTime) Возвращать элементы только после этой даты
  • EndDate (dateTime) Возвращать элементы только до этой даты
  • Пользователь (строка) возвращает только элементы для пользователя
  • Публикация (строка) Вернуть только элементы для этой публикации
  • PublicationTarget (string) Только вернуть элемент для этой цели публикации

Невозможно иметь условия, которые используются более одного раза.

Возможно, вам придется сделать более одного вызова API TOM, чтобы достичь желаемых результатов?

Другие вопросы по тегам