Как установить статус IsPublishedTo для компонента Tridion?
После восстановления базы данных Tridion CMS из другой среды мы не можем отменить публикацию компонентов в брокере. Если мы публикуем для Брокера, мы можем отменить публикацию. Мы хотим установить статус IsPublishedTo для целей публикации, доступных в новой среде.
В API TOM есть метод SetPublishedTo, доступный для страниц и шаблонов компонентов, но не для компонентов.
Как я могу установить ОпубликовалСтатус для Компонентов? Возможно ли использовать UpdateXML или нам нужно выполнить черную магию базы данных?
2 ответа
Я использую следующий код на C# в инструменте командной строки для переключения PublishStates всех моих элементов после переключения среды SDL Tridion 2009 (Какую версию вы используете?):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tridion.ContentManager.Interop.TDS;
using Tridion.ContentManager.Interop.TDSDefines;
using System.Xml;
namespace SetAllItemsAsUnpublished
{
/// <summary>
/// A command line script that can enable/disable users
/// </summary>
class Program
{
static void Main(string[] args)
{
TDSE tdse = new TDSE();
User currentUser = tdse.User;
ListRowFilter listRowFilter = tdse.CreateListRowFilter();
String xpath = "/tcm:ListPublishItems/*/*[local-name()='Page' or local-name()='Component']";
listRowFilter.SetCondition("Recursive", true);
listRowFilter.SetCondition("OnlyPublishedPages", true);
listRowFilter.SetCondition("OnlyPublishedCPs", true);
//listRowFilter.SetCondition("ItemType", ItemType.ItemTypePage);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
nsmgr.AddNamespace("tcm", "http://www.tridion.com/ContentManager/5.0");
//Check that the user running the script is an Administrator
if (currentUser.privileges == TDSPrivileges.TdsPrivilegeSystemAdministrator)
{
Publications publications = tdse.GetPublications();
Console.WriteLine("There are " + publications.Count + " to be processed");
int i = 0;
foreach (Publication publication in tdse.GetPublications())
{
++i;
Console.WriteLine(" - Processing " + publication.Title + "(" + i + " of " + publications.Count + ")");
foreach( PublicationTarget target in tdse.GetPublicationTargets()){
Console.Write(" checking target: " + target.Title);
XmlDocument publishedItemsXml = new XmlDocument();
try
{
publishedItemsXml.LoadXml(publication.GetListPublishItems(target.ID, false, false, ListColumnFilter.XMLListID, listRowFilter));
foreach (XmlElement publishedItemNode in publishedItemsXml.SelectNodes(xpath, nsmgr))
{
String uri = publishedItemNode.Attributes["ID"].Value;
Console.Write(".");
if (publishedItemNode.LocalName == "Page")
{
Page page = (Page)tdse.GetObject(uri, EnumOpenMode.OpenModeView, publication, XMLReadFilter.XMLReadAll);
page.SetPublishedTo(target, false, currentUser);
if (page.Info.IsCheckedOut)
{
page.CheckIn(true);
}
}
else
{
foreach (XmlElement ctRenderNode in publishedItemNode.SelectNodes("tcm:RenderWith", nsmgr))
{
String uriCT = ctRenderNode.Attributes["ID"].Value;
ComponentTemplate ct = (ComponentTemplate)tdse.GetObject(uriCT, EnumOpenMode.OpenModeView, publication, XMLReadFilter.XMLReadAll);
ct.SetPublishedTo(uri, target, false, currentUser);
if (ct.Info.IsCheckedOut)
{
ct.CheckIn(true);
}
}
}
}
Console.WriteLine();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
else
{
//Warn when there is a non-admin user running the script
Console.WriteLine("You must be an SDL Tridion CMS Administrator to run this application");
}
Console.WriteLine();
Console.WriteLine("Done! Hit ENTER key to close");
Console.ReadLine();
}
}
}
Таким образом, в основном установка CT на UnPublished должна делать то, что вам нужно, так как компонент технически не публикуется, это представление компонента, основанное на этом CT.
Сами компоненты никогда не публикуются в Tridion, они публикуются только как часть представления компонента (Компонент + Шаблон компонента).
SetPublishedTo
Метод в шаблоне компонента принимает компонент в качестве параметра. Таким образом, вызывая его, вы можете установить одно представление компонента как опубликованное или неопубликованное.
После того как вы опубликуете все представления компонентов компонента, этот компонент неявно становится неопубликованным.