3

要するに問題:

新しいコンテンツ パーツを作成しました。これを、メインのコンテンツ ゾーンの外にある別のゾーン、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を使用するように を変更すると、動作しているように見えることがわかりました。ただし、これはあまり真実ではありません。この表記法を使用すると、ゾーンの外にある実際のゾーンの前ではなく、ゾーンの前にバナーが配置されます。ContentFooterFooter:before<footer>ContentFooterContent

これを修正する方法についてのアドバイスや解決策があるので、このコンテンツ パーツをページの別のゾーンに配置できますか?

4

0 に答える 0