У нас есть очень ограниченный текстовый редактор для нашего клиента. Мы разрешаем использовать только несколько стандартных тегов. Мы хотим, чтобы все стили диктовались CSS, который мы создали для сайта. Им не позволено отклоняться.
Мы удалили большинство опций из панели инструментов и оставили только определенные теги в раскрывающемся списке, но недавно мы добавили CSS в редактор, чтобы текст в редакторе был оформлен так же, как на странице, чтобы авторам было легче его визуализировать. Теперь при определенных обстоятельствах он будет вставлять теги span со встроенными стилями, например:
<h2><span style="font-family: Georgia, 'Times New Roman', serif; color: #232b37;">text</span></h2>
Кажется, что он затягивает наш CSS. Есть ли способ настроить его так, чтобы он просто не делал этого? Спасибо.
2 ответа
Нет, вы не можете изменить это поведение с помощью конфигурации. Что вы можете сделать, так это добавить обработчик события item:saving, который удаляет любые нежелательные теги, такие как эти теги span, всякий раз, когда редактор контента сохраняет элемент. Это не самое лучшее решение, но, по крайней мере, оно работает. Я часто использую его для очистки ненужных (пустых) тегов абзаца, которые обычно добавляет редактор форматированного текста.
<event name="item:saving">
<handler type="ExampleProject.Events.RemoveUnwantedTags, ExampleProject" method="OnItemSaving" />
</event>
Удалить пустые P-теги легко, но для вашего решения вы можете использовать регулярное выражение для замены любых тегов атрибутом встроенного стиля (который в любом случае должен быть уникальным).
Вот макет кода, который можно использовать для замены всех значений полей текстового редактора в элементе для этого обработчика событий:
public class RemoveUnwantedTags
{
public void OnItemSaving(object sender, EventArgs args)
{
var item = Event.ExtractParameter(args, 0) as Item;
if (item == null)
{
return;
}
foreach (Field field in item.Fields)
{
if (!field.TypeKey.Equals("rich text", StringComparison.InvariantCultureIgnoreCase))
{
continue;
}
var content = field.Value;
if (!string.IsNullOrEmpty(content))
{
content = content.Trim();
// replace whatever you want over here
using (new SecurityDisabler())
{
item.Editing.BeginEdit();
field.Value = content;
item.Editing.EndEdit();
}
}
}
}
}
Конечно, заманчиво создавать всевозможные конвейеры item:save, потому что они просто работают. Но не забывайте о более конкретных пайплайнах, которые могут подключиться к моменту после того, как вы нажмете кнопку «Принять», и к моменту, когда Sitecore поместит форматированный текст в поле.
<!-- Transforms markup from rich text fields before the Rich Text Editor loads it. -->
<loadRichTextContent/>
<!-- Transforms markup from the Rich Text Editor before saving it as a rich text field value. -->
<saveRichTextContent/>
Оба являются конвейерами, которые отлично подходят для этой цели. Пример реализации этого можно найти по адресу https://techmusingz.wordpress.com/2014/06/14/wrapping-rich-text-value-in-paragraph-tag-in-sitecore/
Скопировать/вставить с указанного выше веб-сайта:
public void Process(SaveRichTextContentArgs args)
{
if (!(args.Content.Trim().StartsWith("<p>") && args.Content.Trim().EndsWith("</p>")))
args.Content = "<p>" + args.Content + "</p>";
}
Лично мне не нравятся настоящие операции со строками на выходе, поэтому я бы рекомендовал обрабатывать форматированный текст с помощью HtmlAgilityPack (с которым поставляется Sitecore) или использовать XDocument.
Мой пример с HtmlAgilityPack, который удаляет элементы скрипта и стиля:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
// Strip output from all kinds of stuff
doc.DocumentNode.Descendants()
.Where(n => n.Name == "script" || n.Name == "style")
.ToList()
.ForEach(n => n.Remove());
Еще лучшим решением было бы проанализировать и очистить его с помощью хорошего и надежного HtmlSanitizer. https://github.com/mganss/HtmlSanitizer
Убедитесь, что вы создали несколько юнит-тестов, чтобы обернуть конвейер и протестировать его до конца.
С наилучшими пожеланиями,
Алекс ван Вольферен
Похожие вопросы
Новые вопросы
sitecore
Используйте этот тег для вопросов, касающихся разработки в рамках базы продуктов Sitecore.