【问题标题】:Copying sitecore rendering to new template programmatically using renderingDefinition.ItemId?使用 renderDefinition.ItemId 以编程方式将站点核心渲染复制到新模板?
【发布时间】:2012-12-03 18:41:25
【问题描述】:

我有一个自定义站点核心按钮,它可以更改当前项目的模板,非常简单。

但是,作为其中的一部分,如果旧布局的渲染属于ItemId 的某个子布局类型,我也会尝试将其迁移到新布局。但是返回的ItemId 始终为空,我从RenderingDefinition 返回的唯一值是UniqueId

我做错了什么?

我以this blog post 为指导。

守则

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

【问题讨论】:

    标签: rendering sitecore sitecore6 sublayout


    【解决方案1】:

    最后我找到了Sitecore support,它告诉我应该使用:

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

    代替:

    item[FieldIDs.LayoutField]
    

    正确获取项目layoutField。这导致渲染值被正确解析,正如他们所说,其余的都是历史。

    【讨论】:

    • +1 Sitecore 支持岩石!感谢您分享他们的反馈。
    • 虽然这个答案最终让我到达了那里(并使我摆脱了数小时的麻烦,弄清楚为什么没有返回数据源),但它有点不完整。 GetFieldValue 实际上是 Sitecore.Data.Fields.LayoutField 类的静态方法。我花了一些时间才弄清楚这一点,所以希望这可以为下一个人节省一点困惑:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多