У нас есть очень ограниченный текстовый редактор для нашего клиента. Мы разрешаем использовать только несколько стандартных тегов. Мы хотим, чтобы все стили диктовались CSS, который мы создали для сайта. Им не позволено отклоняться.

Мы удалили большинство опций из панели инструментов и оставили только определенные теги в раскрывающемся списке, но недавно мы добавили CSS в редактор, чтобы текст в редакторе был оформлен так же, как на странице, чтобы авторам было легче его визуализировать. Теперь при определенных обстоятельствах он будет вставлять теги span со встроенными стилями, например:

<h2><span style="font-family: Georgia, 'Times New Roman', serif; color: #232b37;">text</span></h2>

Кажется, что он затягивает наш CSS. Есть ли способ настроить его так, чтобы он просто не делал этого? Спасибо.

3
Scott 12 Фев 2015 в 20:07
Я предполагаю, что у вас все еще есть некоторые параметры, такие как стиль шрифта и цвет текста на панели инструментов. Я не думаю, что с этим можно что-то поделать, поскольку эти стили по своей природе являются встроенными. Я предлагаю вам удалить эти параметры, а также все остальное, например выравнивание текста. Если это не так, нужна дополнительная информация о том, что означает «при определенных обстоятельствах».
 – 
jammykam
13 Фев 2015 в 01:03

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();
                }
            }
        }
    }
}
4
Harsh Baid 23 Июл 2021 в 00:19
Спасибо, Роб. На самом деле, я должен был упомянуть, что мы уже делаем это. Я просто хотел посмотреть, есть ли способ отключить это, чтобы нам не приходилось полагаться на наш код при сохранении для очистки.
 – 
Scott
14 Фев 2015 в 02:03

Конечно, заманчиво создавать всевозможные конвейеры 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

Убедитесь, что вы создали несколько юнит-тестов, чтобы обернуть конвейер и протестировать его до конца.

С наилучшими пожеланиями,

Алекс ван Вольферен

1
Alex van Wolferen 31 Май 2016 в 11:38