要するに問題:
新しいコンテンツ パーツを作成しました。これを、メインのコンテンツ ゾーンの外にある別のゾーン、LeftPanel に表示したいと考えています。コンテンツ ゾーン内のローカル ゾーンにしかコンテンツ パーツを追加できないようです。ページ上の別のゾーンに contentpart を追加するにはどうすればよいですか?
より長い説明:
私たちのチームは新しいオーチャード Web サイトを作成し、そのレイアウトを作成しました。利用可能なゾーンがいくつかあり、それらのほとんどはすべてのページに表示されます。これらはテーマで利用可能なすべてのゾーンです:
Zones: Header, Navigation, Content, LeftPanel, RightPanel, Toolbar, Messages, Address, Footer, Copy
新しい contentpart を作成し、それを contenttype ページに添付しました。このコンテンツ パーツを使用すると、ページにバナーを追加できます。実装はかなり単純で、コンテンツ ゾーンに配置すると、すべてが適切に機能しているように見えます。
ドライバーに配置した関連コードは次のとおりです。
protected override DriverResult Display(BannerPart part, string displayType, dynamic shapeHelper)
{
return ContentShape("Parts_Banner",
() => shapeHelper.Parts_Banner(
FirstImageTitle: part.FirstImageTitle,
FirstImageLocation: part.FirstImageLocation,
FirstImageNavigationUrl: part.FirstImageNavigationUrl,
SecondImageTitle: part.SecondImageTitle,
SecondImageLocation: part.SecondImageLocation,
SecondImageNavigationUrl: part.SecondImageNavigationUrl,
ThirdImageTitle: part.ThirdImageTitle,
ThirdImageLocation: part.ThirdImageLocation,
ThirdImageNavigationUrl: part.ThirdImageNavigationUrl
));
}
placement.info ファイルに次のテキストを含める:
<Placement>
<Place Parts_Banner="Content:before"/>
<Place Parts_Banner_Edit="Content:7"/>
</Placement>
これにより、(コンテンツ パーツの) バナーがコンテンツの前に配置されます。
ただし、コンテンツ パーツをゾーンにレンダリングする必要がありますLeftPanel
。placement.info を次のように変更します。
<Placement>
<Place Parts_Banner="LeftPanel:1"/>
<Place Parts_Banner_Edit="Content:7"/>
</Placement>
効果がないように見えます。ページにレンダリングされなくなりました。
この問題について少し調べた後、Bertrand Le Roy のブログ投稿に出くわしました。
をIWorkContextAccessor
いじってみましたが、コンテンツ パーツをゾーンに配置することに成功しませんでしたLeftPanel
。次のコードは機能しません。
protected override DriverResult Display(BannerPart part, string displayType, dynamic shapeHelper)
{
var shape = shapeHelper.Parts_Banner(
FirstImageTitle: part.FirstImageTitle,
FirstImageLocation: part.FirstImageLocation,
FirstImageNavigationUrl: part.FirstImageNavigationUrl,
SecondImageTitle: part.SecondImageTitle,
SecondImageLocation: part.SecondImageLocation,
SecondImageNavigationUrl: part.SecondImageNavigationUrl,
ThirdImageTitle: part.ThirdImageTitle,
ThirdImageLocation: part.ThirdImageLocation,
ThirdImageNavigationUrl: part.ThirdImageNavigationUrl
);
_workContextAccessor.GetContext().Layout["LeftPanel"].Add(shape, 10);
return new DriverResult();
}
Clay が空のプロパティを持つ新しい (ゾーン?) オブジェクトを作成しているようです。どういうわけか、オーチャードはこのゾーンを見つけることができません。グローバル ゾーンとローカル ゾーンに関係があると思われますが、もちろん間違っている可能性もあります。
GetEnumerator() メソッドがないため、ゾーンの列挙も機能しません。これにより、例外が作成されます。
foreach (var zone in _workContextAccessor.GetContext().Layout.Zones)
{
_workContextAccessor.GetContext()
.Layout.Zones[zone]
.Add(shape, 1);
}
私はおそらくバートランドの投稿から何かが欠けている. 彼が Zones プロパティを持ち、それを使用するモデルを作成していることがわかりますが、それがどのように機能するのかわかりません (彼のブログ投稿で提供されているソリューションを調べた後でも)
コンテンツ テンプレートは次のようになります。
<article class="content-item @contentTypeClassName">
<header>
@Display(Model.Header)
@*@if (Model.Meta != null) {
<div class="metadata">
@Display(Model.Meta)
</div>
}*@
</header>
@Display(Model.Content)
@if(Model.Footer != null) {
<footer>
@Display(Model.Footer)
</footer>
}
</article>
またはゾーンplacement.info
を使用するように を変更すると、動作しているように見えることがわかりました。ただし、これはあまり真実ではありません。この表記法を使用すると、ゾーンの外にある実際のゾーンの前ではなく、ゾーンの前にバナーが配置されます。Content
Footer
Footer:before
<footer>
Content
Footer
Content
これを修正する方法についてのアドバイスや解決策があるので、このコンテンツ パーツをページの別のゾーンに配置できますか?