Как установить статус 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 Метод в шаблоне компонента принимает компонент в качестве параметра. Таким образом, вызывая его, вы можете установить одно представление компонента как опубликованное или неопубликованное.

После того как вы опубликуете все представления компонентов компонента, этот компонент неявно становится неопубликованным.

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