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