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 обходных пути:
Создать два
RowFilters
и установить другойPublicationTarget
состояние в каждом из них. Затем вы должны выполнить запрос дважды (один раз для каждого фильтра). Это означает, что вам нужно обработать 2 XML-результирующих узла.Не используйте
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, чтобы достичь желаемых результатов?