2012-03-19 91 views
4

在使用TOM.NET API的TBB中,我想获取已发布页面的列表 - 基本上我正在构建一个站点地图。我试图确定是否发布了Tridion.ContentManager.CommunicationManagement.Page。Tridion 2009 TBB:如何确定页面是否发布到特定发布目标?

似乎没有IsPublished财产或IsPublishedTo方法。

有没有可以添加的过滤条件?例如。

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

在回应评论:

我使用TOM.NET API,我想这是出版的页面列表 - 基本上我建立一个网站地图。

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

+0

您可以指定是否使用基于COM的TOM或TOM.NET API?我假设你正在使用TOM.NET,因为IsPublishedTo仍然在TOM API – 2012-03-19 14:54:53

回答

4

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

IList<RepositoryLocalObject> rlos = structuregroup.GetItems(pageFilter); 
List<Page> pages = new List<Page>(rlos.Count);  
foreach (RepositoryLocalObject o in rlos) 
{ 
    Page p = (Page) o; 
    bool isPublished = false; 
    ICollection<PublishInfo> 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中修复。你需要申请,否则上面的代码将无法正常工作。

+0

谢谢瑞安。多恼人的bug! – 2012-03-21 10:44:07

4

你应该使用OrganizationalItemItemsFilter

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

它会回报你列出这样的:

<tcm:ListItems Managed="68" ID="tcm:2-5-4" xmlns:tcm="http://www.tridion.com/ContentManager/5.0"> 
     <tcm:Item ID="tcm:2-46-64" Title="p" Type="64" Modified="2012-03-19T16:21:10" IsNew="false" Icon="T64L0P0" IsPublished="false" Lock="0" IsShared="false" IsLocalized="false" Trustee="tcm:0-0-0" /> 
</tcm:ListItems> 

您可以检查OrganizationalItemItemsFilter性能对于一些更漂亮的参数,如Recursive,或IncludePathColumn

但是要小心这种方法,因为它只会告诉你它是否在任何地方发布,但没有必要发布你期望的目标。

+0

谢谢,这真的很有用。尽管我需要知道它是否在当前出版物上发表,但我应该更具体。我会更新我的问题。 – 2012-03-19 15:48:55

+0

您是否还需要知道将其发布到哪个目标?如果您在项目类型中添加了“目标”,但我不知道“已发布目标”可能在使用项目的获取列表中,但并非100%确定。 – 2012-03-19 20:12:19

3

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

public static bool IsPublished(
    IdentifiableObject item, 
    PublicationTarget publicationTarget 
) 

返回给定项目是否在指定PublicationTarget公布。

+0

嗨slavamk。我的一位同事向我展示了一些类似的代码,但是在我的测试中,这种方法似乎无法告诉我该页面是否在特定出版物上发布。只有它是否被发布到(例如)在任何出版物中进行分期。 – 2012-03-20 07:30:10

+0

哦,你说得对。我与PublicationTarget混合出版。 – 2012-03-20 09:54:59

3

我不是真正理解你的陈述,而是发表到特定的出版物。一个页面驻留在一个发布中,并且可以发布到一个或多个发布目标(并且这可以针对页面驻留的每个发布完成,以防蓝色打印)。

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

<tcm:Item ID="tcm:2-46-64" Title="p" Type="64" Modified="2012-03-19T16:21:10" IsNew="false" Icon="T64L0P0" IsPublished="false" Lock="0" IsShared="false" IsLocalized="false" Trustee="tcm:0-0-0" /> 

这里可以看到,页面中医认为:2-46-64尚未发布。如果我们进一步调查该页面的唯一ID,我们会看到它驻留在Publication tcm:0-2-1(发布ID是项目的TCM URI中的第一个数字)。

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

要找出该页面发布到哪个目标,可以使用PublishEngine.IsPublished方法。您需要指定为第一个参数的IdentifiableObject将是您的Page的参数。如果我们正在讨论共享(BluePrinted),本地化或本地项目,则无关紧要。您的Page的TCM URI中的发布ID会告诉您在这种情况下从哪些发布中发布页面。

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

+0

谢谢,我已经更新了一个更清晰的问题。如果将页面发布到BluePrint层次结构中的任何位置,PublishEngine.IsPublished方法似乎会返回“true”。这对我来说没有任何意义,但这就是我所看到的。 – 2012-03-20 13:13:02

+0

当您使用IsPublished(IdentifiableObject项目)或IsPublished(IdentifiableObject项目,PublicationTarget publicationTarget)方法时,这是正确的。当使用第三个重载:IsPublished(IdentifiableObject item,PublicationTarget publicationTarget,bool isPublishedInContext)并将最后一个参数设置为true时,您将只获取指定项目的发布状态,而不会获取其父项或子项的任何状态。 – 2012-03-20 14:23:00

+0

嗨巴特,我认为,第三次重载只在2011 TOM.NET API中,我使用的是2009 SP1 API。不过谢谢! – 2012-03-20 17:35:25

相关问题