WedX - журнал о программировании и компьютерных науках

Создайте элемент в Tridion 2011 с помощью Core Service

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

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

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

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

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;
    }
}
07.03.2012

Ответы:


1

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

    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;
    }

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

07.03.2012
  • Сначала я пробовал это, но не понял, как перейти от строки .Name к свойству Tridion ItemType. 07.03.2012
  • Отличное предложение использовать копию и спасибо за переписанный метод GetTridionItemType. И последний вопрос — как установить свойство имени файла для копии страницы? Я не хочу оставлять для него значение «Copy_of_pagename». 07.03.2012
  • Код обновлен выше с условием if для обработки имени файла страницы. Но есть ли лучший способ? 07.03.2012
  • Проблема в том, что свойство имени файла есть только в классе PageData. Пожалуйста, смотрите мои обновления выше - может быть, есть способ преобразовать общий объект RepositoryObject в объект PageData? 07.03.2012
  • @robrtc Код, который вы разместили, у меня отлично работает. Вы можете привести RepositoryLocalObject к PageData, без проблем. 07.03.2012
  • Спасибо! Да, это работает, и я очень доволен результатом! Большое спасибо за ваше предложение использовать метод копирования 07.03.2012
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]