2016-10-06 21 views
2

我在这里没有使用Orchard术语,但是我有一段文本要包裹在一个形状中。这是博客详细信息页面上的一些社交分享网址。我想保持清洁,所以我决定做一个新的形状。从视图中添加到区域的形状的优先级

我已经发布的下方Content-BlogPost.Detail.cshtml的全面上市,但思想是:

  1. 我做一个cshtml持有社交媒体标记
  2. 我预习的主帖详细视图中的数据
  3. 创建的形状,并将其添加到Meta区(这是一个本地区域不喜欢的元描述)使用Model.Meta.Add(socialShape, "1");

形状按预期添加,但第二个参数(优先级)不起作用。它必须是一个字符串,传递一个int打破了页面。 Meta区域中其他项目的默认优先级为5,因此它应该将其置于顶部,但始终在最后。

// Model.Meta.Add works but the priority seems to be ignored? 
@using Orchard.ContentManagement; 
@using Orchard.Utility.Extensions 
@using Orchard.Blogs.Models 
@functions{ 
    void AddSocialMediaShareLinks() { 
     var socialShareUrl = new Uri(new Uri(WorkContext.CurrentSite.BaseUrl), Url.ItemDisplayUrl((IContent)Model.ContentItem)).ToString(); 
     var socialShareTitle = Model.ContentItem.Title; 
     var socialShape = New.BlogPost_SocialMediaShareLinks(ShareUrl: socialShareUrl, ShareTitle: socialShareTitle); 
     Model.Meta.Add(socialShape, "1"); 
    } 
} 
@{ 
    if (Model.Title != null) { 
     Layout.Title = Model.Title; 
    } 

    BlogPart parentBlog = Model.Blog; 
    IContent contentItem = Model.ContentItem; 
    var contentTypeClassName = ((string)Model.ContentItem.ContentType).HtmlClassify(); 

    AddSocialMediaShareLinks(); 

    Model.Classes.Add("content-item"); 
    Model.Classes.Add(contentTypeClassName); 

    var tag = Tag(Model, "article"); 
} 
@tag.StartElement 
<header> 
    @Display(Model.Header) 
</header> 
<div class="row row-blog-content"> 
    <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2"> 
     @if (Model.Meta != null) { 
      <div class="metadata"> 
       @Display(Model.Meta) 
      </div> 
     } 
     @Display(Model.Content) 
    </div> 
</div> 
<div class="row row-blog-return-parent"> 
    <div class="col-sm-12"> 
     <p class="text-center"><a href="@Url.ItemDisplayUrl(parentBlog)" class="btn btn-default">@T("Go back to the news")</a></p> 
    </div> 
</div> 
@if (Model.Footer != null) { 
    <footer> 
     @Display(Model.Footer) 
    </footer> 
} 
@tag.EndElement 

在阅读了一些文章后,我发现旧帖子是Bertrand post约customizing the first item template

我想,也许我在那里将它添加到该区域是在这个过程中来不及了,所以我改变了代码下面的代码片段,但Model.Meta.Add从来没有被击中在这样的场景:

@functions{ 
    void AddSocialMediaShareLinks() { 
     var socialShareUrl = new Uri(new Uri(WorkContext.CurrentSite.BaseUrl), Url.ItemDisplayUrl((IContent)Model.ContentItem)).ToString(); 
     var socialShareTitle = Model.ContentItem.Title; 
     var socialShape = New.BlogPost_SocialMediaShareLinks(ShareUrl: socialShareUrl, ShareTitle: socialShareTitle); 

     ShapeMetadata metadata = Model.Metadata; 
     metadata.OnDisplaying(ctx => { 
      Model.Meta.Add(socialShape, "1"); 
     }); 
    } 
} 

人告诉我我做错了什么?

回答

2

要启用排序,应Tab属性添加到形状Metadata,如下:

socialShape.Metadata.Tab = ""; 
Model.Meta.Add(socialShape, "1"); 

这将禁用形状中ContentZone分组。

我认为这是乌节的一个错误,但是这个解决方法应该可以解决您的问题。

+0

谢谢,你是正确的,这是一个错误。在你的帮助下,我已经追踪到足以至少打开一个问题,但无法弄清楚它出错的地方:https://github.com/OrchardCMS/Orchard/issues/7258 – rtpHarry

+0

这个错误将会是在下一版Orchard中解决。感谢您的帮助诊断。 https://github.com/OrchardCMS/Orchard/pull/7321 – rtpHarry

1

大多数形状只是呈现他们的孩子在他们被添加的顺序。在ZoneContentZone形状不同的是调用Order孩子们呈现前:

[Shape] 
    public void Zone(dynamic Display, dynamic Shape, TextWriter Output) { 
     string id = Shape.Id; 
     IEnumerable<string> classes = Shape.Classes; 
     IDictionary<string, string> attributes = Shape.Attributes; 
     var zoneWrapper = GetTagBuilder("div", id, classes, attributes); 
     Output.Write(zoneWrapper.ToString(TagRenderMode.StartTag)); 
     foreach (var item in Order(Shape)) 
      Output.Write(Display(item)); 
     Output.Write(zoneWrapper.ToString(TagRenderMode.EndTag)); 
    } 

您可以通过还呼吁从您的模板或形状的方法代码Order得到自己的形状相同的效果。

+0

'ContentZone'也调用'Order'方法来订购儿童形状。 – mdameer

+0

感谢您的提示,您的帮助指示我进入正确的方法来诊断,这实际上是一个错误:https://github.com/OrchardCMS/Orchard/issues/7258 – rtpHarry