是否可以在Orchard中在渲染之前动态更改形状中的HTML?

时间:2017-05-04 09:45:27

标签: orchardcms orchardcms-1.10

这是Content.ThumbnailSummary.cshtml的标记,这是一个自定义DisplayType,用于将ContentItems呈现为可点击的缩略图,其内容绝对位于它们之上。

@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 个答案:

答案 0 :(得分: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);
      }

      ...