2

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

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

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

4

3 回答 3

5

我建议您安装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) } };
于 2015-12-02T07:38:37.057 回答
3

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

于 2015-12-02T14:46:53.557 回答
3

As @SitecoreClimber suggested, the best approach to do this is to install Sitecore PowerShell Extensions and fix this with PowerShell. If you don't have admin access or you are not allowed to install PowerShell extensions to your machine, you can use the following .NET code to achieve what you want. Just replace the values of ID variables with the IDs of your templates and sublayouts:

// 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);
                    }
                }
            }
        }
    }
}
于 2015-12-02T08:06:51.497 回答