簡體   English   中英

使用Core Service在Tridion 2011中創建項目

[英]Create an item in Tridion 2011 using Core Service

在Tridion 2011中,我希望使用與UpdateXml相當的Core Service以通用方式創建新的Tridion對象。 我打算在文件夾和結構組上創建新的組件,頁面和更高版本。 它使用UpdateXml工作得很好,但是我遇到了將RepositoryLocalObject (或另一個泛型類型對象)轉換為具有Core Service的ComponentData對象的問題。 我的核心服務代碼更長(並且在第二代增長)。

我嘗試訪問對象類型特定屬性時出現錯誤消息:

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

我稍微調整了你的代碼,現在它正在工作:

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

但我仍然不明白你為什么要這樣做而不使用簡單的Copy方法?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM