【问题标题】:Tridion 2009 TBB: How do I determine if a Page is published to particular publication target?Tridion 2009 TBB:如何确定页面是否发布到特定发布目标?
【发布时间】:2012-04-04 01:34:05
【问题描述】:

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

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

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

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

回应cmets:

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

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

【问题讨论】:

  • 您能否指定您使用的是基于 COM 的 TOM 还是 TOM.NET API?我假设您使用的是 TOM.NET,因为 IsPublishedTo 仍在 TOM API 中

标签: c# tridion


【解决方案1】:

在这种情况下,您在 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 中修复。您需要应用它,否则上面的代码将无法正常工作。

【讨论】:

  • 谢谢瑞恩。多么烦人的错误!
【解决方案2】:

我不是很理解你的陈述,是发布到特定出版物上的。页面驻留在出版物中,并且可以发布到一个或多个出版物目标(如果页面是蓝印的,可以对页面所在的每个出版物进行此操作)。

所以要确定某个页面是否已发布,您需要检查它是否已发布到至少一个目标。您可以通过 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。这只会为您提供指定项目的发布状态,而不是其任何(蓝图)父项或子项的发布状态。

【讨论】:

  • 谢谢,我已将问题更新为更清楚一点。如果页面发布到其 BluePrint 层次结构中的任何位置,则 PublishEngine.IsPublished 方法似乎返回“true”。这对我来说没有任何意义,但这就是我所看到的。
  • 当您使用 IsPublished(IdentifiableObject item) 或 IsPublished(IdentifiableObject item, PublicationTarget publicationTarget) 方法时,这是正确的。当您使用第三个重载:IsPublished(IdentifiableObject item, PublicationTarget publicationTarget, bool isPublishedInContext) 并将最后一个参数设置为 true 时,您将仅获得指定项目的发布状态,而不是其任何父项或子项的发布状态。跨度>
  • 嗨 Bart,我认为第三个重载仅在 2011 TOM.NET API 中,我正在使用 2009 SP1 API。不过还是谢谢!
  • 从表面上看,我认为您是对的,但这是一种耻辱。另一方面,你有一个很好的令人信服的理由升级到 2011 ;)
【解决方案3】:

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

public static bool IsPublished(
    IdentifiableObject item,
    PublicationTarget publicationTarget
)

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

【讨论】:

  • 嗨,斯拉夫人。我的一位同事向我展示了一些类似的代码,但是我的测试中的这种方法似乎无法告诉我页面是否在特定出版物上发布。仅在任何出版物中是否发布到暂存(例如)。
  • 哦,你是对的。我将 Publication 与 PublicationTarget 混淆了。
【解决方案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

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

【讨论】:

  • 谢谢,这真的很有用。尽管我需要知道它是否在当前出版物中发布,但我应该更具体。我会更新我的问题。
  • 您是否还需要知道它发布到哪个目标?如果您在项目类型中包含目标,我有一种感觉,“已发布的目标”可能在使用项目的获取列表中,但不是 100% 确定。
猜你喜欢
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 2012-02-09
相关资源
最近更新 更多