3

简而言之问题:

我创建了一个新的内容部分,并希望在另一个区域 LeftPanel 中显示它,该区域位于主内容区域之外。这不起作用,因为看起来我只能将内容部分添加到内容区域内的本地区域。如何将内容部分添加到页面上的不同区域?

更长的解释:

我们的团队创建了一个新的 Orchard 网站并为其创建了布局。有几个可用的区域,其中大部分在所有页面上都可见。这些是主题中可用的所有区域:

Zones: Header, Navigation, Content, LeftPanel, RightPanel, Toolbar, Messages, Address, Footer, Copy

我创建了一个新的内容部分并将其附加到内容类型页面。使用此内容部分,可以将横幅添加到页面。实现相当简单,当我将它们放在内容区域时,一切似乎都正常工作。

我放在Driver中的相关代码如下:

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,但没有成功将 contentpart 放置在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 正在创建一个具有空属性的新(区域?)对象。不知何故,果园找不到这个区域。我怀疑它与global zonelocal zone有关,但我当然可能是错的。

枚举区域也不起作用,因为它没有 GetEnumerator() 方法,这将创建一个异常。

foreach (var zone in _workContextAccessor.GetContext().Layout.Zones)
{
    _workContextAccessor.GetContext()
                        .Layout.Zones[zone]
                        .Add(shape, 1);
}

我可能从 Bertrand 的帖子中遗漏了一些东西。我看到他正在创建一个具有 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以使用ContentorFooter区域时,它似乎正在工作。然而,这不是很正确。当我使用该Footer:before符号时,它将横幅<footer>放在Content区域之前,而不是在实际Footer区域之前,它位于Content区域之外。

关于如何解决此问题的任何建议或解决方案,以便我可以将此内容部分放置到页面上的不同区域?

4

0 回答 0