2012-03-19 47 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

相關問題