暂时更改Sitecore项目';s布局

本文关键字:布局 项目 Sitecore | 更新日期: 2023-09-27 18:27:24

使用这段代码,我成功地更改了当前项目的渲染。然而,这在Sitecore中永久地改变了它(这些变化可以在CMS中看到),而不是像我预期的那样是暂时的。

void ReplaceLayout(Item item)
{
    if (item == null)
        return;
    using (new SecurityDisabler())
    {
        // New item
        LayoutField newLayoutField = new LayoutField(item.Fields[Sitecore.FieldIDs.LayoutField]);
        LayoutDefinition newLayoutDefinition = LayoutDefinition.Parse(newLayoutField.Value);
        DeviceDefinition newDeviceDefinition = newLayoutDefinition.GetDevice(Sitecore.Context.Device.ID.ToString());
        // Current item
        LayoutField layoutField = new LayoutField(Sitecore.Context.Item.Fields[Sitecore.FieldIDs.LayoutField]);
        LayoutDefinition layoutDefinition = LayoutDefinition.Parse(layoutField.Value);
        DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(Sitecore.Context.Device.ID.ToString());
        deviceDefinition.Layout = newDeviceDefinition.Layout;
        deviceDefinition.Renderings = newDeviceDefinition.Renderings;
        Sitecore.Context.Item.Editing.BeginEdit();
        layoutField.Value = layoutDefinition.ToXml();
        Sitecore.Context.Item.Editing.EndEdit();
    }
}

我不想对项目进行永久更改,我只想在满足某些条件的情况下替换当前显示的项目渲染。有人知道如何用这种方式改变物品的布局吗?

暂时更改Sitecore项目';s布局

您在评论中解释说,您希望根据某些表单部分/步骤在侧边栏中显示某些子yout。您可以通过添加一个PlaceHolder来实现这一点,该PlaceHolder将适合子YouTube(例如,在侧边栏中),并使用此代码动态呈现子YouTube。

首先,您需要一个项目(我称之为代码段项目),该项目在其演示设置上配置了子yout。然后,您可以使用代码在占位符(phSideBarPlaceHolder)中呈现该项。

// Load snippet item
Item snippet = Sitecore.Context.Database.GetItem("{id-or-path-of-snippet-item}");
// Get the first rendering from item's presentation definition
RenderingReference rendering = snippet.Visualization.GetRenderings(Sitecore.Context.Device, false).FirstOrDefault();
// We assume that its a Sublayout, but you can also check for xslt and create an XslFile() object
Sublayout sublayout = new Sublayout();
sublayout.DataSource = snippet.Paths.FullPath; // creates a reference to the snippet item, so you can pull data from that later on
sublayout.Path = rendering.RenderingItem.InnerItem["Path"];
sublayout.Cacheable = rendering.RenderingItem.Caching.Cacheable;
// Copy cache settings
if (rendering.RenderingItem.Caching.Cacheable)
{
    sublayout.VaryByData = rendering.RenderingItem.Caching.VaryByData;
    sublayout.VaryByDevice = rendering.RenderingItem.Caching.VaryByDevice;
    sublayout.VaryByLogin = rendering.RenderingItem.Caching.VaryByLogin;
    sublayout.VaryByParm = rendering.RenderingItem.Caching.VaryByParm;
    sublayout.VaryByQueryString = rendering.RenderingItem.Caching.VaryByQueryString;
    sublayout.VaryByUser = rendering.RenderingItem.Caching.VaryByUser;
}
// Now render the sublayout to the placeholder
phSideBarPlaceHolder.Controls.Add(sublayout);

如果你需要更多关于如何读取子yout代码中DataSource属性数据的信息,Mark Ursino已经写了一篇关于这方面的文章:http://firebreaksice.com/using-the-datasource-field-with-sitecore-sublayouts

Sitecore构建呈现控件,并在ASP.NET Webforms生命周期的早期将它们插入到页面中。你不太可能在布局本身上轻松做到这一点。但是,如果您可以在页面外评估条件(例如,通过检查项目本身),那么您可能可以在insertRenderings管道中执行此操作。

使用ILSpy或其他反编译器检出Sitecore.Pipelines.InsertRenderingsSitecore.Pipelines.InsertRenderings.Processors。与其他管道一样,这些处理器的执行顺序在Web.config中定义。您需要在AddRenderings之后添加一个新的处理器,该处理器会评估您的条件(可能会检查args.ContextItem),然后根据需要修改args.Renderings

在你之前的问题中,你只是想删除子YouTube。这在这里应该相当容易。添加不同的子yout更加困难,因为您需要构建一个RenderingReference。这可能需要实际创建其构造函数所需的XML定义。或者,如果您有另一个定义所需新布局的项,请考虑在管道的早期更改args.ContextItem

与其更改sitecore演示文稿,不如不将"表单"控件和侧边栏放在一个父控件容器中?然后,您将有一个侧边栏容器的简单id,用它可以有条件地从表单控件以编程方式填充控件。

或者,你可以将所有可能的控件添加到侧边栏中,并通过会话状态变量"激活"(或者只是使其可见)所需的控件吗?(我不知道这是否违反了某些生命周期或时间限制)

或者,您可以简单地使用条件渲染规则来显示您想要的基于任何逻辑的渲染/子层。