2011-08-15 12 views
4

私はメールテンプレートとして図形をレンダリングしようとしています。私はバックグラウンドタスクから、現在の要求からこれを行うことができるようにしたいと思います。誰も私のためのヒントを持っていますか?私はOrchard.DisplayManagement.IDisplayHelperFactoryがキーだと思っていますが、ViewContextとIViewDataContainerを作成する必要があります。おそらくOrchard.Mvc.ViewEngines.Razor.WebViewPageから得ることができますか?オーチャードCMSは電子メールテンプレートとしてレンダリングの形状を

誰でも同様のことをしましたか?私はhttps://github.com/andrewdavey/postal/blob/master/src/Postal/EmailViewRenderer.csをいくつかのインスピレーションのために探しています、誰かが私を正しい軌道に乗せることができるかどうか疑問に思っていますか?

もう一度お返事ありがとうございます。

答えて

3

オーチャードのソースを掘り起こし、Andrew Daveyの郵便のアプリケーションからいくつかのインスピレーションを得た後、私は解決策を思いつきました。以下のコード部分を参照してください

private void RenderMessage(MessageContext context, dynamic shape) 
{ 
     var httpContext = new EmailHttpContext(new Uri("http://localhost/orchard/"));    
     var routeData = new RouteData(); 
     routeData.DataTokens.Add("IWorkContextAccessor", _workContextAccessor); 
     routeData.Values["controller"] = "Dummy"; 
     var requestContext = new RequestContext(httpContext, routeData); 
     var controllerContext = new ControllerContext(requestContext, new DummyController()); 
     var viewContext = new ViewContext(controllerContext, new ShapeView(shape), new ViewDataDictionary(shape.Model), new TempDataDictionary(), new StringWriter()); 
     var scope = _workContextAccessor.CreateWorkContextScope(viewContext.HttpContext); 
     scope.WorkContext.CurrentTheme = _siteThemeService.GetSiteTheme();    
     var page = new EmailWebViewPage(viewContext, new ViewDataDictionary<dynamic>(shape.Model)); 

     var displayHelperFactory = _services.WorkContext.Resolve<IDisplayHelperFactory>();    
     var display = displayHelperFactory.CreateHelper(page.ViewContext, page); 
     context.MailMessage.Body = display(shape).ToHtmlString(); 
     scope.Dispose(); 
    } 

    class DummyController : Controller 
    { 
    } 

    class ShapeView : IView 
    { 
     private readonly dynamic _shape; 

     public ShapeView(dynamic shape) 
     { 
      _shape = shape; 
     } 

     #region IView Members 

     public void Render(ViewContext viewContext, TextWriter writer) 
     { 
     } 

     #endregion 
    } 

EmailHttpContextは郵便事業から取得しました。これは、コントローラとビューのコンテキストを構築するために使用されました。私はOrchardのWebViewPageを拡張して、EmailWebViewPageを作成して、ビューエンジンなどにアクセスするためのオーチャードインフラストラクチャを利用できるようにしなければなりませんでした。

これは非常に優れたソリューションではありません。後になる。

フィードバックがある方、または完全なコードをご希望の場合は、私にご連絡ください。

0

これはソートされているようですが、OrchardのRazor View Engineをタップしてテンプレート化されたメールを作成したいと思っていました。だから、オーチャードでFindViewを使うことについて質問した。

は、私はあなたが私が私の最終的な解決策を示すために、追加1を含め、答えは便利かもしれないと思った:

Using FindView in Orchard

+0

おかげ@Richardが、私はそれをチェックアウトします。 – Brendan

+0

あなたのソリューションでは、それを使用して電子メールテンプレートとして使用する任意の図形をレンダリングできますか?あなたはどのようにビュー名を思いつきますか? – Brendan

+0

私はビュー名をハードコードしましたが、part.TypeDefinition.NameIから取得できるはずです。 –

関連する問題