Umbraco.Core.Services.ContentService.Saving をオーバーライドするメソッドがあります。画像にいくつかのクラスを追加し、画像を div でラップするだけです。
しかし、リッチテキスト エディターにいくつかのマクロを追加できるようになり、保存後にマクロが消えてしまいました。
多くの掘り下げた後、保存方法をオーバーライドすると、マクロがどのように削除されるかがわかりました。
他の誰かがこれに対処しなければならない場合、何が起こっているのかについての洞察が欲しい.
これをオーバーライドする方法は次のとおりです。
Umbraco.Core.Services.ContentService.Saving += OverrideSave.ContentService_Saving;
そして、これが私の方法です(真ん中の退屈な部分を差し引いたもの)。
public class OverrideSave
{
public static void ContentService_Saving(Umbraco.Core.Services.IContentService sender, Umbraco.Core.Events.SaveEventArgs<Umbraco.Core.Models.IContent> e)
{
foreach (var c in e.SavedEntities)
{
var list = c.PropertyTypes.Where(x => x.PropertyEditorAlias == "Umbraco.TinyMCEv3").ToList();
if (list.Count > 0)
{
List<Property> propList = new List<Property>();
foreach (var i in list)
{
propList.Add(c.Properties.Where(x => x.Alias == i.Alias).FirstOrDefault());
}
if (propList.Count > 0)
{
foreach (var t in propList)
{
//string html = t.Value.ToString();
//string outputHtml = html;
//HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
//doc.LoadHtml((string)t.Value);
var parser = new HtmlParser();
var doc = parser.Parse((string)t.Value);
//if (doc.DocumentNode.SelectNodes("//img/@src") != null)
if (doc.DocumentElement.GetElementsByTagName("img") != null)
{
for (int i = 0; i < doc.DocumentElement.QuerySelectorAll("img").Count(); i++)
{
//add S3 URL to images
string s3Url = ConfigurationManager.AppSettings["cdnDomain"];
if (!doc.DocumentElement.QuerySelectorAll("img")[i].Attributes["src"].Value.Contains(s3Url))
{
doc.DocumentElement.QuerySelectorAll("img")[i].SetAttribute("src", s3Url + doc.DocumentElement.QuerySelectorAll("img")[i].Attributes["src"].Value);
}
var wrapperNode = doc.CreateElement("div");
//add description paragraph
if (!string.IsNullOrEmpty(doc.DocumentElement.QuerySelectorAll("img")[i].Attributes["alt"].Value))
{
wrapperNode.InnerHtml = doc.DocumentElement.QuerySelectorAll("img")[i].OuterHtml + "<p>" + doc.DocumentElement.QuerySelectorAll("img")[i].Attributes["alt"].Value + "</p>";
}
else
{
wrapperNode.InnerHtml = doc.DocumentElement.QuerySelectorAll("img")[i].OuterHtml;
}
//add image width to wrapper div
if (!string.IsNullOrEmpty(doc.DocumentElement.QuerySelectorAll("img")[i].Attributes["style"].Value))
{
string style = doc.DocumentElement.QuerySelectorAll("img")[i].Attributes["style"].Value;
string pattern = @"(width:\s*.*?;)";
string width = Regex.Match(style, pattern, RegexOptions.IgnoreCase).Groups[1].Value;
if (!string.IsNullOrEmpty(width))
{
wrapperNode.SetAttribute("style", width);
}
}
//add appropriate classes to div wrapper
if (doc.DocumentElement.QuerySelectorAll("img")[i].Attributes["style"].Value.Contains("float: left;"))
{
wrapperNode.SetAttribute("class", "image-with-caption align-left");
}
else if (doc.DocumentElement.QuerySelectorAll("img")[i].Attributes["style"].Value.Contains("float: right;"))
{
wrapperNode.SetAttribute("class", "image-with-caption align-right");
}
else
{
wrapperNode.SetAttribute("class", "image-with-caption");
}
//add new node to html - check to make sure divs are not doubled
if (doc.DocumentElement.QuerySelectorAll("img")[i].ParentElement.TagName == "div"
&& !string.IsNullOrEmpty(doc.DocumentElement.QuerySelectorAll("img")[i].ParentElement.GetAttribute("class")) // Check to make sure a class attribute exists so the next part doesn't fail
&& doc.DocumentElement.QuerySelectorAll("img")[i].ParentElement.Attributes["class"].Value.Contains("image-with-caption")) // Check to see if the parent node is infact the one we want.
{
doc.DocumentElement.QuerySelectorAll("img")[i].ParentElement.ParentElement.ReplaceChild(wrapperNode, doc.DocumentElement.QuerySelectorAll("img")[i].ParentElement);
}
else
{
doc.DocumentElement.QuerySelectorAll("img")[i].ParentElement.ReplaceChild(wrapperNode, doc.DocumentElement.QuerySelectorAll("img")[i]);
}
}
}
t.Value = (object)doc.DocumentElement.OuterHtml;
}
}
}
}
}
}