【问题标题】:Sitecore 8: Change of datasource template for a sublayoutSitecore 8:更改子布局的数据源模板
【发布时间】:2015-12-02 06:47:51
【问题描述】:

我对子布局的数据源模板的更改有疑问。现在,有两个子布局:Sub1 和 Sub2 以 Template1 作为其数据源模板。直到我发现我需要为 Sub1 使用不同的数据源模板时,我已经创建了许多子布局 Sub1 和 Sub2 的项目。

Template2 现在将替换 Template1 作为子布局 Sub1 的数据源模板。 现在,我必须更改所有使用 sublayout 作为 Sub1 创建的项目的模板。

问题是我必须通过内容编辑器手动更改每个项目的模板-->配置-->更改模板技术,这非常麻烦。有没有其他方法可以一次更改所有这些项目的模板?

【问题讨论】:

    标签: templates sitecore sitecore8 sublayout


    【解决方案1】:

    我建议您安装 Sitecore PowerShell Extensions 并使用 Sitecore PowerShell 控制台更改模板。

    $master = [Sitecore.Configuration.Factory]::GetDatabase("master");
    $entryTemplate = $master.Templates["your path to template Sub2"];
    cd master:\Content\Home\Sub1FolderItems\;
    //path to sub1 folder items
    Get-ChildItem -recurse | ForEach-Object { if ($_.TemplateName -eq "Sub1") {  $_.ChangeTemplate($entryTemplate) } };
    

    【讨论】:

      【解决方案2】:

      还有另一种方法 - 如果您安装了 Sitecore Rocks,您可以多选所有项目,右键单击并选择 更改模板 - 没有代码,并且非常快,除非您的内容项目在许多不同的地方。

      【讨论】:

        【解决方案3】:

        正如@SitecoreClimber 建议的那样,最好的方法是安装Sitecore PowerShell Extensions 并使用PowerShell 修复此问题。如果您没有管理员访问权限或不允许在您的计算机上安装 PowerShell 扩展,则可以使用以下 .NET 代码来实现您想要的。只需将 ID 变量的值替换为您的模板和子布局的 ID:

        // replace with the first template's ID
        ID template1ID = new ID("{A0F73C76-DD4D-4037-90D4-48B616397F5D}");
        
        // replace with the second template's ID
        ID template2ID = new ID("{43A1EBB0-CABB-4682-9F5B-7765D7FB0E29}");
        
        // replace with your sublayout's ID
        ID sublayout2ID = new ID("{1C6094FA-4539-48E4-A24A-104787641A88}");
        Database masterDatabase = Factory.GetDatabase("master");
        
        TemplateItem template2Item = masterDatabase.GetTemplate(template2ID);
        
        // Set to your RootItem
        Item rootItem = masterDatabase.GetItem("{756B23C8-1C0F-41AC-9273-B18FDA047925}");
        
        using (new SecurityDisabler())
        {
            foreach (Item child in rootItem.Axes.GetDescendants())
            {
                RenderingReference[] renderings = child.Visualization.GetRenderings(Sitecore.Context.Device, true);
        
                IEnumerable<RenderingReference> sublayout2Renderings =
                    renderings.Where(x => x.RenderingID == sublayout2ID);
        
                foreach (RenderingReference rendering in sublayout2Renderings)
                {
                    if (!string.IsNullOrEmpty(rendering.Settings.DataSource))
                    {
                        Item datasourceItem = masterDatabase.GetItem(rendering.Settings.DataSource);
        
                        if (datasourceItem != null)
                        {
                            if (datasourceItem.TemplateID == template1ID)
                            {
                                datasourceItem.ChangeTemplate(template2Item);
                            }
                        }
                    }
                }
            }
        }
        

        【讨论】:

        • 是的。我不想安装 Power shell,所以我要试试这个。但是有一个问题:Template2 是 Template1 的副本,但有一个额外的字段。所以我想当我替换模板时数据不会受到影响。我说的对吗?
        • @Prathameshdhanawade 重复还是继承?
        • Template1 和 Template 继承自 BaseTemplate。我不希望 Template1 有那个额外的字段。因此,我从 Template1 中复制了 Template2 并添加了所需的额外字段。
        • 另外,您提供的代码在需要更改模板时只需要运行一次对吗?
        • @Prathameshdhanawade 应该可以,但先在一个小子集上进行试驾。它也将运行,并且仅在尚未更改模板的情况下才会更改模板。如果你想确定。只需在执行之前先创建数据库备份即可。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多