将形状添加到全局区域,而不是Orchard中的本地区域

时间:2012-06-04 10:07:16

标签: c# orchardcms

问题简而言之:

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

更长的解释:

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

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

我创建了一个新的contentpart并将其附加到contenttype页面。使用此contentpart,可以向页面添加横幅。 实现非常简单,当我将它们放在Content区域时,一切似乎都正常工作。

我在驱动程序中放置的相关代码如下:

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区域中呈现contentpart。将placement.info更改为以下内容:

<Placement>
    <Place Parts_Banner="LeftPanel:1"/>
    <Place Parts_Banner_Edit="Content:7"/>
</Placement>

似乎没有任何效果,它不再在页面上呈现。

在研究了这个问题后,我偶然发现Bertrand Le Roy's blogpost which does something similar with an Amazon buy-now part

我玩过IWorkContextAccessor但是没有取得任何成功 LeftPanel区域中的contentpart。 以下代码不起作用:

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正在创建一个具有空属性的新(区域?)对象。不知怎的,Orchard找不到这个区域。我怀疑它与全局区域本地区域有关,但我当然可能是错的。

通过区域枚举也不起作用,因为它没有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以使用ContentFooter区域时,它似乎正在运行。然而,这并非如此。当我使用Footer:before表示法时,它会将横幅放在<footer>区域的Content之前,因此不会位于{{1}之外的真实Footer区域之前区域。

关于我应该如何解决此问题的任何建议或解决方案,以便我可以将此内容部分放在页面上的其他区域?

0 个答案:

没有答案