6

現在のアイテムのテンプレートを変更するカスタム サイトコア ボタンがあります。

ただし、これの一環として、古いレイアウトのレンダリングを、特定のサブレイアウト タイプの場合は新しいレイアウトに移行しようとしていますItemId。ただし、ItemId返される は常に null です。 から返される唯一の値はRenderingDefinitionですUniqueId

私は何を間違っていますか?

このブログ投稿をガイドとして使用しました。

コード

public class ConvertToNewTemplateCommand : Command
{
protected void Run(ClientPipelineArgs args)
{
    if (!SheerResponse.CheckModified())
        return;

    Item item = Context.ContentDatabase.Items[args.Parameters["id"]];
    if (args.IsPostBack)
    {
        if (args.Result == "yes")
        {
            //Get current layout details
            var originalLayoutXml = item[FieldIDs.LayoutField];

            //Get new template
            TemplateItem hubTemplate = Context.ContentDatabase.GetTemplate("some guid...");
            //Change template  
            item.ChangeTemplate(hubTemplate);
            //Reset laytout
            ResetLayout(item);
            //Get reset layout
            var newLayoutXml = item[FieldIDs.LayoutField];

            //Add all the module containers to the new layout in the central column
            MoveModuleContainers(item, originalLayoutXml, newLayoutXml);
        }
    }
}

private void MoveModuleContainers(Item item, string oldXml, string newXml)
{
    var oldLayout = LayoutDefinition.Parse(oldXml);
    var newLayout = LayoutDefinition.Parse(newXml);

    bool updated = false;

    var oldRenderings = (oldLayout.Devices[0] as DeviceDefinition).Renderings;
    var newRenderings = (newLayout.Devices[0] as DeviceDefinition).Renderings;

    foreach (RenderingDefinition rendering in oldRenderings)
    {
        // Here is where the rendering.ItemID is always null
        if (rendering != null && !String.IsNullOrEmpty(rendering.ItemID) && new Guid(rendering.ItemID) == new Guid("matching guid..."))
        {
            rendering.Placeholder = "middlecolumn";
            newRenderings.Add(rendering);
            updated = true;
        }
    }

    if (updated)
    {
                   // Save item...
            }
}
}
4

1 に答える 1

7

最終的にSitecoreのサポートを利用して、次のものを使用する必要があることを通知しました。

Sitecore.Data.Fields.LayoutField.GetFieldValue(item.Fields[Sitecore.FieldIDs.LayoutField])

それ以外の:

item[FieldIDs.LayoutField]

アイテムlayoutFieldを正しく取得します。これにより、レンダリング値が正しく解析され、残りは履歴であると言われます。

于 2012-12-06T15:30:39.950 に答える