Beispiel #1
0
        public override async Task <IDisplayResult> UpdateAsync(OrchardCore.ContentFields.Fields.HtmlField field, IUpdateModel updater, UpdateFieldEditorContext context)
        {
            // If it's an attached media field editor the files are automatically handled by _attachedMediaFieldFileService
            if (string.Equals(context.PartFieldDefinition.Editor(), "FroalaEditor", StringComparison.OrdinalIgnoreCase))
            {
                var viewModel = new EditHtmlFieldViewModel();

                var settings = context.PartFieldDefinition.GetSettings <HtmlFieldSettings>();

                // Deserializing an empty string doesn't return an array
                var items = string.IsNullOrWhiteSpace(viewModel.Paths)
                    ? new List <EditMediaFieldItemInfo>()
                    : JsonConvert.DeserializeObject <EditMediaFieldItemInfo[]>(viewModel.Paths).ToList();
                if (items.Any())
                {
                    try
                    {
                        await _attachedMediaToContentItemService.HandleFilesOnContentPartUpdateAsync(items,
                                                                                                     context.ContentPart.ContentItem);

                        //replace body temp file paths with new folder paths
                        //because froala encodes url paths to avoid xss must decode first before finding and replacing paths
                        var decodedHtml = HttpUtility.UrlDecode(viewModel.Html);
                        foreach (var mediaFieldItemInfo in items)
                        {
                            if (!String.IsNullOrEmpty(mediaFieldItemInfo.NewPath))
                            {
                                // vm.Body=  vm.Body.Replace(mediaFieldItemInfo.Path, mediaFieldItemInfo.NewPath);
                                decodedHtml = decodedHtml?.Replace(mediaFieldItemInfo.Path,
                                                                   mediaFieldItemInfo.NewPath);
                            }
                        }

                        //set back html to viewmodel
                        viewModel.Html = decodedHtml;
                    }
                    catch (Exception)
                    {
                        updater.ModelState.AddModelError(Prefix,
                                                         S["{0}: There was an error handling the files.",
                                                           context.TypePartDefinition.DisplayName()]);
                    }

                    field.Html = settings.SanitizeHtml
                        ? _htmlSanitizerService.Sanitize(viewModel.Html)
                        : viewModel.Html;
                }
            }

            return(await EditAsync(field, context));
        }
Beispiel #2
0
        public override async Task <IDisplayResult> UpdateAsync(HtmlField field, IUpdateModel updater, UpdateFieldEditorContext context)
        {
            var viewModel = new EditHtmlFieldViewModel();

            if (await updater.TryUpdateModelAsync(viewModel, Prefix, f => f.Html))
            {
                if (!string.IsNullOrEmpty(viewModel.Html) && !_liquidTemplatemanager.Validate(viewModel.Html, out var errors))
                {
                    var fieldName = context.PartFieldDefinition.DisplayName();
                    context.Updater.ModelState.AddModelError(nameof(field.Html), T["{0} doesn't contain a valid Liquid expression. Details: {1}", fieldName, string.Join(" ", errors)]);
                }
                else
                {
                    field.Html = viewModel.Html;
                }
            }

            return(Edit(field, context));
        }
Beispiel #3
0
        private static async Task <object> RenderHtml(ResolveFieldContext <HtmlField> ctx)
        {
            var serviceProvider          = ctx.ResolveServiceProvider();
            var shortcodeService         = serviceProvider.GetRequiredService <IShortcodeService>();
            var contentDefinitionManager = serviceProvider.GetRequiredService <IContentDefinitionManager>();

            var jObject = ctx.Source.Content as JObject;
            // The JObject.Path is consistent here even when contained in a bag part.
            var jsonPath                  = jObject.Path;
            var paths                     = jsonPath.Split('.');
            var partName                  = paths[0];
            var fieldName                 = paths[1];
            var contentTypeDefinition     = contentDefinitionManager.GetTypeDefinition(ctx.Source.ContentItem.ContentType);
            var contentPartDefinition     = contentTypeDefinition.Parts.FirstOrDefault(x => string.Equals(x.Name, partName));
            var contentPartFieldDefintion = contentPartDefinition.PartDefinition.Fields.FirstOrDefault(x => string.Equals(x.Name, fieldName));
            var settings                  = contentPartFieldDefintion.GetSettings <HtmlFieldSettings>();

            var html = ctx.Source.Html;

            if (!settings.SanitizeHtml)
            {
                var model = new EditHtmlFieldViewModel()
                {
                    Html  = ctx.Source.Html,
                    Field = ctx.Source,
                    Part  = ctx.Source.ContentItem.Get <ContentPart>(partName),
                    PartFieldDefinition = contentPartFieldDefintion
                };
                var liquidTemplateManager = serviceProvider.GetRequiredService <ILiquidTemplateManager>();
                var htmlEncoder           = serviceProvider.GetService <HtmlEncoder>();

                html = await liquidTemplateManager.RenderStringAsync(html, htmlEncoder, model,
                                                                     new Dictionary <string, FluidValue>() { ["ContentItem"] = new ObjectValue(ctx.Source.ContentItem) });
            }

            return(await shortcodeService.ProcessAsync(html,
                                                       new Context
            {
                ["ContentItem"] = ctx.Source.ContentItem,
                ["PartFieldDefinition"] = contentPartFieldDefintion
            }));
        }