Tridion 2009 TBB: как определить, опубликована ли страница с определенной целью публикации? - PullRequest
4 голосов
/ 19 марта 2012

В TBB с использованием API TOM.NET я хочу получить список опубликованных страниц - в основном я создаю карту сайта.Я пытаюсь определить, опубликован ли Tridion.ContentManager.CommunicationManagement.Page.

Кажется, что нет свойства IsPublished или метода IsPublishedTo.

Есть лиусловие фильтра я могу добавить?Например,

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

В ответ на комментарии:

Я использую API TOM.NET и хочу получить список страниц, которые публикуются - в основномЯ создаю карту сайта.

Похоже, что метод PublicationEngine.IsPublished возвращает значение «истина», если страница опубликована для указанной цели где-либо в иерархии BluePrint.Это не похоже на ожидаемое поведение.

Ответы [ 4 ]

4 голосов
/ 21 марта 2012

В этом сценарии, когда у вас есть несколько публикаций в 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. Вы должны применить это, иначе код выше не будет работать правильно.

4 голосов
/ 19 марта 2012

Вы должны использовать 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

Но будьте осторожны с этим подходом, так как он сообщит вам только о том, опубликован ли он где-либо, но не обязателен ли он для целевой публикации, которую вы ожидаете.

3 голосов
/ 20 марта 2012

Я не совсем понимаю ваше утверждение, опубликовано в определенной публикации. Страница находится внутри публикации и может быть опубликована для одной или нескольких целей публикации (и это может быть сделано для каждой публикации, в которой находится страница, если она напечатана синим цветом).

Итак, чтобы узнать, опубликована ли определенная страница, вам нужно проверить, опубликована ли она хотя бы для одной цели. Это можно сделать прямо в списке с помощью 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" />

Здесь вы видите, что страница tcm: 2-46-64 не опубликована. если мы исследуем уникальный идентификатор этой страницы, то увидим, что она находится в публикации tcm: 0-2-1 (идентификатор публикации - это первое число в URI TCM элемента).

Теперь, если атрибут IsPublished будет иметь значение "true", это будет означать, что эта страница (в своей публикации) опубликована хотя бы для одной цели.

Чтобы узнать, для какой цели эта страница опубликована, вы можете использовать метод PublishEngine.IsPublished. Идентифицируемый объект, который вы должны указать в качестве первого параметра, будет принадлежать вашей странице. Не имеет значения, говорим ли мы об общем (BluePrinted), локализованном или локальном элементе. Идентификатор публикации в URI TCM вашей страницы скажет вам, из какой публикации опубликована страница в этом случае.

Обратите внимание, что вам нужно использовать 3-ю перегрузку: IsPublished (элемент IdentifiableObject, PublicationTarget publishingTarget, bool isPublishedInContext) и установить для последнего параметра значение true. Это даст вам статус публикации только для указанного элемента, а не для любого из его (BluePrint) родителей или детей.

3 голосов
/ 20 марта 2012

После поиска по фильтру вы можете попробовать использовать метод PublishEngine.IsPublished:

public static bool IsPublished(
    IdentifiableObject item,
    PublicationTarget publicationTarget
)

Возвращает, опубликован ли данный элемент по указанному PublicationTarget.

...