2017-05-04 19 views
1

Content.ThumbnailSummary.cshtmlのマークアップです。ContentItemsをクリック可能なサムネイルとしてレンダリングするために使用するカスタムDisplayTypeのマークアップです。そのコンテンツは、コンテンツ上に絶対配置されています。オーチャードではレンダリングの直前に形状の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> 

問題は、箱から出して、ほとんどの部品とフィールドがリンクまたはリンクを含む段落としてレンダリングされ、かなりひどく、ほとんどのブラウザでレンダリングDOMを<a>タグの混乱を入れ子にしてしまうことがあります。 ThumbnailSummaryはになりません。にはリンクがありません。

私はすべてのフィールドとパーツの代替案を作成することができます。または、デフォルトではすべてをプレースメントで削除し、必要に応じて特定のケースのルールのみを追加できます。しかし、それはかなり退屈で配置のメリットが犠牲になるので、このDisplayTypeのシェイプのコード内のすべての<a>タグを何とか取り除くか置き換えることができればと思っていました。

することは、私はこの方向で見てきたが、それは実行可能だ場合、私はわからない:

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); 
     } 

     ... 
のようになります。
関連する問題