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

时间:2012-03-19 14:49:55

标签: c# tridion

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

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

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

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

回应评论:

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

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

4 个答案:

答案 0 :(得分: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的属性,了解一些更好的参数,例如RecursiveIncludePathColumn

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

答案 1 :(得分:4)

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

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中修复。你需要申请,否则上面的代码将无法正常工作。

答案 2 :(得分:3)

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

public static bool IsPublished(
    IdentifiableObject item,
    PublicationTarget publicationTarget
)

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

答案 3 :(得分: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" />

在这里您可以看到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)父项或子项。