2017-05-04 58 views
1

这是Content.ThumbnailSummary.cshtml的标记,它是我用来将ContentItems呈现为可点击缩略图的自定义DisplayType,其内容绝对位于它们之上。Orchard是否可以在渲染之前动态更改形状中的HTML?

@using Orchard.Utility.Extensions; 
@{ 
    var contentTypeClassName = ((string)Model.ContentItem.ContentType).HtmlClassify(); 
} 
<a class="content-item @contentTypeClassName thumbnail-summary"> 
    @Display(Model.Header) 
    <div class="thumbnail-summary-inner"> 
     @Display(Model.Content) 
    </div> 
    @Display(Model.Footer) 
</a> 

的问题是,开箱即用的大部分地区和领域得到呈现为链接或包含链接的段落,并嵌套<a>标签搞乱DOM渲染在大多数浏览器相当严重。 ThumbnailSummary应该永不包含任何链接。

我可以为每个字段和部分创建替代字段,或者我可以在放置时删除所有内容,并且只根据需要为特定案例添加规则。但是这将非常繁琐,并且失去了很多放置的好处,所以我希望我能够以某种方式去掉或替换代码中的所有<a>标签,仅用于具有此DisplayType的形状。

我一直在寻找在这个方向上,但我不知道这是否是可行的:

public class Shapes : IShapeTableProvider 
{ 
    public void Discover(ShapeTableBuilder builder) 
    { 
     builder.Describe("Content") 
      .OnDisplaying(displaying => 
      { 
       if (displaying.ShapeMetadata.DisplayType == "ThumbnailSummary") 
       {    
        // Do something here??? 
       } 
      }); 
    } 
} 

回答

1

您是差不多吧,而不是供应商的加入,从Orchard.DisplayManagement.Implementation.ShapeDisplayEvents继承的类或实现IShapeDisplayEvents自己。

我这样做是为了从管理区域删除某些功能,而这些功能无法通过功能或权限禁用。

的代码看起来应该是这样

public class MyShapeDisplayEvents : Orchard.DisplayManagement.Implementation.ShapeDisplayEvents 
{ 
    public override void Displayed(Orchard.DisplayManagement.Implementation.ShapeDisplayedContext context) 
    { 
    if (context.Shape is Orchard.DisplayManagement.Shapes.Shape) 
    { 
     Orchard.DisplayManagement.Shapes.Shape lShape = (Orchard.DisplayManagement.Shapes.Shape)context.Shape; 

     if (lShape.Metadata.Type == "Layout") 
     { 
     string lChildContent = context.ChildContent.ToHtmlString(); 

     // do something with the content like removing tags 

     context.ChildContent = new System.Web.HtmlString(lChildContent); 
     } 

     ...