如何在Tridion组件上将IsPublishedTo设置为状态?

如何在Tridion组件上将IsPublishedTo设置为状态?,tridion,Tridion,从另一个环境恢复Tridion CMS数据库后,我们无法从代理中取消发布组件。如果我们向代理发布,那么我们可以取消发布。我们希望将IsPublishedTo状态设置为新环境中可用的发布目标 TomAPI有一个SetPublishedTo方法可用于页面和组件模板,但不用于组件 如何设置组件的PublishedStatus?是否可以使用UpdateXML或我们需要执行数据库黑魔法?我在命令行工具中使用以下基于C#的代码,用于在SDL Tridion 2009环境切换后切换我所有项目的发布状态(您使用

从另一个环境恢复Tridion CMS数据库后,我们无法从代理中取消发布组件。如果我们向代理发布,那么我们可以取消发布。我们希望将IsPublishedTo状态设置为新环境中可用的发布目标

TomAPI有一个SetPublishedTo方法可用于页面和组件模板,但不用于组件

如何设置组件的PublishedStatus?是否可以使用UpdateXML或我们需要执行数据库黑魔法?

我在命令行工具中使用以下基于C#的代码,用于在SDL Tridion 2009环境切换后切换我所有项目的发布状态(您使用的是什么版本?)

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用Tridion.ContentManager.Interop.TDS;
使用Tridion.ContentManager.Interop.TDSDefines;
使用System.Xml;
命名空间SetAllItemsAsUnpublished
{
/// 
///可以启用/禁用用户的命令行脚本
/// 
班级计划
{
静态void Main(字符串[]参数)
{
TDSE TDSE=新的TDSE();
用户当前用户=tdse.User;
ListRowFilter ListRowFilter=tdse.CreateListRowFilter();
字符串xpath=“/tcm:ListPublishItems/*/*[local-name()='Page'或local-name()='Component']”;
SetCondition(“递归”,true);
SetCondition(“仅限发布页面”,true);
SetCondition(“仅限发布的DCPS”,true);
//SetCondition(“ItemType”,ItemType.ItemTypePage);
XmlNamespaceManager nsmgr=newxmlnamespacemanager(newnametable());
nsmgr.AddNamespace(“tcm”http://www.tridion.com/ContentManager/5.0");
//检查运行脚本的用户是否是管理员
if(currentUser.privileges==TDSPrivileges.TdsPrivilegeSystemAdministrator)
{
Publications Publications=tdse.GetPublications();
Console.WriteLine(“有“+出版物.计数+”待处理”);
int i=0;
foreach(tdse.GetPublications()中的发布)
{
++一,;
Console.WriteLine(“-Processing”+publication.Title+”(“+publications.Count+”)中的“+i+”);
foreach(tdse.GetPublicationTargets()中的PublicationTarget目标){
Console.Write(“检查目标:+target.Title”);
XmlDocument publishedItemsXml=新的XmlDocument();
尝试
{
publishedItemsXml.LoadXml(publication.GetListPublishItems(target.ID、false、false、ListColumnFilter.XMLListID、listRowFilter));
foreach(publishedItemsXml.SelectNodes中的XmlElement publishedItemNode(xpath,nsmgr))
{
字符串uri=publishedItemNode.Attributes[“ID”].Value;
控制台。写(“.”);
如果(publishedItemNode.LocalName==“页面”)
{
Page Page=(Page)tdse.GetObject(uri,EnumOpenMode.OpenModeView,publication,XMLReadFilter.XMLReadAll);
page.SetPublishedTo(目标、错误、当前用户);
如果(page.Info.IsCheckedOut)
{
page.签入(true);
}
}
其他的
{
foreach(publishedItemNode.SelectNodes中的XmlElement ctRenderNode(“tcm:RenderWith”,nsmgr))
{
字符串uriCT=ctRenderNode.Attributes[“ID”].Value;
ComponentTemplate ct=(ComponentTemplate)tdse.GetObject(uriCT,EnumOpenMode.OpenModeView,publication,XMLReadFilter.XMLReadAll);
SetPublishedTo(uri,target,false,currentUser);
如果(ct.Info.IsCheckedOut)
{
ct.签入(正确);
}
}                                
}
}
Console.WriteLine();
}
捕获(例外e)
{
控制台写入线(e.Message);
}
}
}
}
其他的
{
//当有非管理员用户运行脚本时发出警告
WriteLine(“您必须是SDL Tridion CMS管理员才能运行此应用程序”);
}
Console.WriteLine();
Console.WriteLine(“完成!按回车键关闭”);
Console.ReadLine();
}
}
}

因此,基本上,将CT设置为“未发布”应该可以满足您的需要,因为组件不是技术上发布的,它是基于该CT的组件演示文稿。

组件本身从未从Tridion发布,它们仅作为组件演示文稿(组件+组件模板)的一部分发布

组件模板上的
SetPublishedTo
方法将组件作为参数。因此,通过调用它,可以将一个组件表示设置为已发布或未发布

取消发布组件的所有组件演示文稿后,该组件将隐式成为未发布组件。

谢谢
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();
        }
    }
}