Tridion 2009 TBB:如何确定页面是否发布到特定的发布目标?

在使用TOM.NET API的TBB中,我想获得一个已发布的页面列表 – 基本上我正在构建一个站点地图。 我试图确定是否发布了Tridion.ContentManager.CommunicationManagement.Page。

似乎没有IsPublished属性或IsPublishedTo方法。

我可以添加过滤条件吗? 例如

 pageFilter.Conditions["Published"] = "true"; 

回应评论:

我正在使用TOM.NET API,我想获得一个已发布的页面列表 – 基本上我正在构建一个站点地图。

如果页面在BluePrint层次结构中的任何位置发布到给定目标,则似乎PublicationEngine.IsPublished方法返回“true”。 这似乎不是预期的行为。

在BluePrint中有多个Publications的情况下,您可以对您所在的页面使用PublishEngine.GetPublishInfo()方法,并检查从该方法返回的Publications中是否存在要发布的出版物:

 IList rlos = structuregroup.GetItems(pageFilter); List pages = new List(rlos.Count); foreach (RepositoryLocalObject o in rlos) { Page p = (Page) o; bool isPublished = false; ICollection publishInfo = PublishEngine.GetPublishInfo(p); foreach (PublishInfo info in publishInfo) { if (info.Publication.Id.ItemId == p.Id.PublicationId) { isPublished = true; } } if(p != null && isPublished) { pages.Add(p); } } 

您必须知道此方法中存在一个错误,它始终会返回您要发布的当前发布。 这已在修补程序CM_2009.1.74835中修复。 你需要申请,否则上面的代码将无法正常工作。

您应该使用OrganizationalItemItemsFilter

 var filter = new OrganizationalItemItemsFilter(session); filter.BaseColumns = ListBaseColumns.Extended; var structureGroup = (StructureGroup)session.GetObject("tcm:2-5-4"); var result = structureGroup.GetListItems(filter); 

它会像这样返回你的列表:

    

您可以检查OrganizationalItemItemsFilter属性以获取一些更好的参数,例如RecursiveIncludePathColumn

但要小心这种方法,因为它只会告诉您它是否在任何地方发布,但对于您期望的发布目标不是必需的。

通过filter搜索后,您可以尝试使用PublishEngine.IsPublished方法:

 public static bool IsPublished( IdentifiableObject item, PublicationTarget publicationTarget ) 

返回给定项是否在指定的PublicationTarget中发布。

我并不是真的理解你的陈述,而是发表在特定的出版物上。 页面位于发布内部,可以发布到一个或多个发布目标(如果是蓝色打印,则可以对页面所在的每个发布执行此操作)。

因此,要确定某个页面是否已发布,您需要检查它是否已发布到至少一个目标。 您可以通过OrganizationalItemItemsFilter直接在列表中执行此操作。 返回的列表将显示每个项目是否已发布:

  

在这里您可以看到Page tcm:2-46-64未发布。 如果我们进一步调查该页面的唯一ID,我们会看到它位于Publication tcm:0-2-1(出版物ID是项目的TCM URI中的第一个数字)。

现在,如果属性IsPublished的值为“true”,则表示此页面(在其出版物中)已发布到至少一个目标。

要确定发布该页面的目标,可以使用PublishEngine.IsPublished方法。 您需要指定为第一个参数的IdentifiableObject将是您的Page的。 如果我们谈论共享(BluePrinted),本地化或本地项目并不重要。 页面的TCM URI中的出版物ID将告诉您在这种情况下页面发布的出版物。

请注意,您需要使用第三个重载:IsPublished(IdentifiableObject项,PublicationTarget publicationTarget,bool isPublishedInContext)并将最后一个参数设置为true。 这将仅为您指定项目的发布状态,而不是其任何(BluePrint)父项或子项。