4

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

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

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

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

回应评论:

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

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

4

4 回答 4

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

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

于 2012-03-19T15:35:26.263 回答
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 中修复。您需要应用它,否则上面的代码将无法正常工作。

于 2012-03-21T10:27:44.367 回答
3

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

public static bool IsPublished(
    IdentifiableObject item,
    PublicationTarget publicationTarget
)

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

于 2012-03-20T06:36:01.627 回答
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 item, PublicationTarget publicationTarget, bool isPublishedInContext) 并将最后一个参数设置为 true。这将只为您提供指定项目的发布状态,而不是其任何(蓝图)父项或子项的发布状态。

于 2012-03-20T12:12:55.420 回答