Форма представления cms сада как шаблон электронной почты - PullRequest
4 голосов
/ 15 августа 2011

Я пытаюсь отобразить фигуры в виде шаблонов электронной почты. Я хотел бы иметь возможность сделать это из фоновой задачи, а также из текущего запроса. У кого-нибудь есть советы для меня? Я думаю, что ключ Orchard.DisplayManagement.IDisplayHelperFactory является ключевым, но тогда мне нужно создать ViewContext и IViewDataContainer, которые я мог бы получить из Orchard.Mvc.ViewEngines.Razor.WebViewPage, возможно?

Кто-нибудь делал что-нибудь подобное? Я смотрю на https://github.com/andrewdavey/postal/blob/master/src/Postal/EmailViewRenderer.cs для вдохновения, просто интересно, кто-нибудь может поставить меня на правильный путь?

Еще раз спасибо заранее!

Ответы [ 2 ]

3 голосов
/ 15 августа 2011

После небольшого перебора источника Орчард и некоторого вдохновения, почерпнутого из почтового приложения Эндрю Дэйви, мне удалось найти решение.См фрагмент кода ниже

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 был взят из почтового проекта.Это использовалось для конструирования контроллера и просмотра контекстов.Затем мне просто нужно было расширить WebViewPage для Orchard, чтобы создать EmailWebViewPage, позволяющий мне подключаться к инфраструктуре Orchard для доступа к механизмам просмотра и т. Д.о чем я.

Если у кого-то есть отзывы или вы хотите получить полный код, напишите мне.

0 голосов
/ 16 августа 2011

Звучит так, будто вы это отсортировали, но я также хотел подключиться к Razor View Engine в Orchard для создания шаблонных писем.Итак, я задал вопрос об использовании FindView в Orchard.

Я подумал, что вы могли бы найти ответы полезными, включая тот, который я добавил, чтобы показать свое окончательное решение:

Использование FindView вOrchard

...