繁体   English   中英

临时更改Sitecore项的布局

[英]Temporarily change a Sitecore item's layout

使用此代码,我设法更改了当前项目的渲染。 但是,这在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();
    }
}

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

您在评论中解释说,您希望根据某些表单部件/步骤在边栏中显示某些子布局。 您可以通过添加一个适合子布局的PlaceHolder来做到这一点(例如,在边栏中),并使用此代码向其动态渲染子布局。

首先,您需要一个在演示文稿设置中配置了子布局的项目(我称其为代码段项目)。 然后,您可以使用代码在占位符(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);

如果您需要有关如何读取子布局代码中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

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

除了更改Sitecore演示文稿,您还不能将“表单”控件和侧边栏放在一个父控件容器中吗? 然后,您将获得一个侧边栏容器的简单ID,使用该ID可以通过程序从窗体控件有条件地填充控件。

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

或者,您可以简单地使用条件渲染规则,根据您可以想到的任何逻辑来显示所需的渲染/子布局。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM