このコードを使用して、現在のアイテムのレンダリングを変更することができました。しかし、これはSitecoreで永久に変更されました(変更はCMSで見ることができました)。私は項目にpermenant変更を加えたくない一時的にSitecoreアイテムのレイアウトを変更する
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コントロールでダミーのサブアイテムを必要とせずに、プレースホルダを含むアイテムからすべてのレンダリングを取得する方法があります。本質的に大丈夫と言うと、このパート/ステップの親レイアウトを使用したくないので、代わりにその子レイアウトを使用したいと思います。または、私たちは@ techphoria414が上で話していることの領域に入っていますか? – Jon
Sublayoutアイテム(Database.GetItem)をロードして、そのアイテムに基づいてRenderingItemオブジェクトを作成するといいでしょう。 var renderingItem = new Sitecore.Data.Items.RenderingItem(sublayoutItem); 私はこれをテストしていません。 希望に役立ちます。 –
レンダリングパラメータを取得するために 'sublayout.Parameters = rendering.Settings.Parameters; 'を追加しました。それ以外は、これは私が最後に行った解決策でした。 – Jon