Создайте элемент в Tridion 2011 с помощью основного сервиса - PullRequest
6 голосов
/ 07 марта 2012

В Tridion 2011 я хочу использовать базовый сервис, эквивалентный UpdateXml, для создания новых объектов Tridion в общем виде. Я намереваюсь создать новые Компоненты, Страницы и позже Папки и Структурные Группы. Он работает довольно хорошо, используя UpdateXml, но у меня возникла проблема с приведением RepositoryLocalObject (или другого объекта универсального типа) к ComponentData объекту с помощью Core Service. Мой основной код службы намного длиннее (и увеличивается на секунду).

Сообщение об ошибке при попытке получить доступ к свойству объекта определенного типа:

Ошибка 9 'Tridion.ContentManager.CoreService.Client.RepositoryLocalObjectData' не содержит определения для 'Content' и не имеет метода расширения 'Content', принимающего первый аргумент типа 'Tridion.ContentManager.CoreService.Client.RepositoryLocalObjectData'

Возможно ли было бы создать метод расширения?

Tridion TOM API:

Function CreateNewItemCopy(organizationalItemUri, itemType, title, xml, 
                           directory, filename)
    Dim newItem : set newItem = tdse.GetNewObject(itemType, organizationalItemUri)
    newItem.UpdateXml(xml)
    newItem.Title = title

    if(itemType = 64) then ' page
        newItem.FileName = filename
    elseif(itemType = 4) then ' sg
        newItem.Directory = directory
    end if

    newItem.save(true)
    CreateNewItemCopy = newItem.id
    set newItem = nothing
End Function

Базовая служба Tridion 2011

* Обновлен код, основанный на отличном ответе ниже

private ItemType GetTridionItemType(RepositoryLocalObjectData source)
{
    string itemType = source.GetType().Name;
    switch (itemType)
    {
        case "ComponentData":
            return ItemType.Component;
        case "PageData":
            return ItemType.Page;
    }
    return ItemType.UnknownByClient;
} 

private string CreateNewItemCopy(string title, RepositoryLocalObjectData source, 
                                 string filename)
{
    ItemType tridionItemType = GetTridionItemType(source);
    string orgItemUri = source.LocationInfo.OrganizationalItem.IdRef;
    var newItem = client.Copy(source.Id, orgItemUri, true, new ReadOptions());
    newItem.Title = title;
    if (tridionItemType == ItemType.Page)
    {
        PageData pageData = newItem as PageData;
        pageData.FileName = filename;
        client.Update(pageData, new ReadOptions());
    }
    else
    {
        client.Update(newItem, new ReadOptions());
    }

    return newItem.Id;
}

* Оригинальный код

private string CreateNewItemCopy(string title, RepositoryLocalObjectData source, 
                                 string filename)
{
    string newItemUri = "";
    try
    {
        ItemType tridionItemType = GetTridionItemType(source.Id);
        string orgItemUri = source.LocationInfo.OrganizationalItem.IdRef;

        if (tridionItemType == ItemType.Component)
        {
            ComponentData sourceComp = source as ComponentData;
            ComponentData newComponent = client.GetDefaultData(tridionItemType,
                                                    orgItemUri) as ComponentData;
            newComponent.Title = title;
            newComponent.Metadata = source.Metadata;

            // ** Only Component has .Content and SchemaRef
            newComponent.Content = sourceComp.Content;
            newComponent.Schema.IdRef = sourceComp.Schema.IdRef;
            client.Create(newComponent, null);
            newItemUri = newComponent.Id;
        }
        else if (tridionItemType == ItemType.Page)
        {
            PageData sourcePage = source as PageData;
            PageData newPage = client.GetDefaultData(tridionItemType, 
                                                     orgItemUri) as PageData;
            newPage.Title = title;
            newPage.Metadata = source.Metadata;

            // ** Only Page has .Filename
            newPage.FileName = filename;
           client.Create(newPage, null);
           newItemUri = newPage.Id;
        }
        else // I would really like to handle all things here - but have problems with
             // item-specific mandatory properties, such as Schema, Filename, and Dir
        {
            var newGenericTridionItem = client.GetDefaultData(tridionItemType,
                                            orgItemUri) as RepositoryLocalObjectData;
            newGenericTridionItem.Title = title;
            newGenericTridionItem.Metadata = source.Metadata;
            //if(GetTridionItemType(newGenericTridionItem.Id) == ItemType.Page)
            //    newGenericTridionItem.filename;
            client.Create(newGenericTridionItem, null);
            newItemUri = newGenericTridionItem.Id;
        }
    }
    catch (Exception ex)
    {
        throw;
    }

    return newItemUri;
}

private ItemType GetTridionItemType(string uri)
{
    const int itemTypeComp = 16;
    const int itemTypePage = 64;
    const int itemTypeSG = 4;
    const int itemTypeFolder = 2;
    int itemTypeInt = GetTridionItemTypeId(uri);
    switch (itemTypeInt)
    {
        case itemTypeComp:
            return ItemType.Component;
            break;
        case itemTypePage:
            return ItemType.Page;
            break;
        case itemTypeSG:
            return ItemType.StructureGroup;
            break;
        case itemTypeFolder:
            return ItemType.Folder;
            break;
    }
    return ItemType.UnknownByClient;
}

private int GetTridionItemTypeId(string uri)
{
    const int itemTypeComp = 16;
    string[] uriParts = uri.Split('-');

    if (uriParts.Length == 2) // comp, tcm:9-1234
    {
        return itemTypeComp;
    }
    else  // other, tcm:9-456-64 for a page...
    {
        int itemTypeId = Int32.Parse(uriParts[2]);
        return itemTypeId;
    }
}

1 Ответ

6 голосов
/ 07 марта 2012

Я немного скорректировал ваш код и теперь он работает:

    private string CreateNewItemCopy(string title, RepositoryLocalObjectData source, string filename)
    {
        string newItemUri = "";
        try
        {
            ItemType tridionItemType = GetTridionItemType(source);
            string orgItemUri = source.LocationInfo.OrganizationalItem.IdRef;

            if (tridionItemType == ItemType.Component)
            {
                ComponentData sourceComp = source as ComponentData;
                ComponentData newComponent = client.GetDefaultData(tridionItemType, orgItemUri) as ComponentData;
                newComponent.Title = title;
                newComponent.Metadata = source.Metadata;

                // ** Only Component has .Content and SchemaRef
                newComponent.Content = sourceComp.Content;
                newComponent.Schema.IdRef = sourceComp.Schema.IdRef;
                newItemUri = client.Create(newComponent, new ReadOptions()).Id;
            }
            else if (tridionItemType == ItemType.Page)
            {
                PageData sourcePage = source as PageData;
                PageData newPage = client.GetDefaultData(tridionItemType, orgItemUri) as PageData;
                newPage.Title = title;
                newPage.Metadata = source.Metadata;

                // ** Only Page has .Filename
                newPage.FileName = filename;
                newItemUri = client.Create(newPage, new ReadOptions()).Id;
            }
            else //I would really like to handle all things here - but have problems with item-specific mandatory properties, such as Schema, Filename, and Dir
            {
                var newGenericTridionItem = client.GetDefaultData(tridionItemType, orgItemUri) as RepositoryLocalObjectData;
                newGenericTridionItem.Title = title;
                newGenericTridionItem.Metadata = source.Metadata;
                //if(GetTridionItemType(newGenericTridionItem.Id) == ItemType.Page)
                //    newGenericTridionItem.filename;
                newItemUri = client.Create(newGenericTridionItem, new ReadOptions()).Id;
            }
        }
        catch (Exception ex)
        {
            throw;
        }

        return newItemUri;
    }

    private ItemType GetTridionItemType(RepositoryLocalObjectData source)
    {
        string itemType = source.GetType().Name;
        switch (itemType)
        {
            case "ComponentData":
                return ItemType.Component;
            case "PageData":
                return ItemType.Page;
        }
        return ItemType.UnknownByClient;
    }

Но я все еще не понимаю, почему вы хотите сделать это таким образом, а не использовать простой метод копирования?

...