自定义Sitecore RichTextEditor以添加默认包装器

时间:2014-06-13 06:13:41

标签: sitecore sitecore7 rich-text-editor

前端(html和css)的设置方式使得Sitecore内容字段中的描述文本需要包含<p>标记。

因此,默认情况下,RTE将文本包装在<p>标记= TRUE中。但是你需要点击 Enter 或复制/粘贴多个段落。

如果只是一行,我们如何强制Sitecore添加P标签?

2 个答案:

答案 0 :(得分:7)

幸运的是,从dll开始,我发现了一个特殊功能:

protected virtual void SetupScripts()
{
    foreach (XmlNode node in Factory.GetConfigNodes("clientscripts/htmleditor/script"))
    this.Result.Scripts.AppendFormat("<script src=\"{0}\" language=\"{1}\"></script>\n", (object) XmlUtil.GetAttribute("src", node), (object) XmlUtil.GetAttribute("language", node));
}

好,嗯?毕竟,SITECORE的开发人员很聪明。 所以我在web.config中做了这个,

<!— CLIENT SCRIPTS
These script files are included in the client, e.g. '<script src="/myscript.js" language="JavaScript"/>'
—>
<clientscripts>
    <everypage />
    <htmleditor>
        <script src=”/assets/js/CustomRTE.js” language=”javascript”/>
    </htmleditor>
</clientscripts>

从EditorWindow.aspx覆盖scSendRequest函数。

window.scSendRequest = function(evt, command) {
    var editor = scRichText.getEditor();
    if (editor.get_mode() == 2) { //If in HTML edit mode
        editor.set_mode(1); //Set mode to Design
    }
    var htmls = editor.get_html(true);
    var regex = /<p[^>]*>.*?<\/p>/i;
    var match = regex.exec(htmls);
    if(match == null && htmls != null) {
        htmls = "<p>" + htmls + "</p>";
    }

    //$("EditorValue").value = editor.get_html(true);
    $("EditorValue").value = htmls;

    scForm.browser.clearEvent(evt);

    scForm.postRequest("", "", "", command);

    return false;
}

AND YAY ..双彩虹和独角兽。

答案 1 :(得分:1)

您也可以为此要求创建自己的自定义解决方案。 您可以在

中创建一个新的管道事件
  • <saveRichTextContent>管道 - 这可以让您在sitecore中的富文本编辑器上点击保存时附加

    标记

  • <renderField>管道 - 如果原始rtf文本中没有

    标记,则可以在渲染页面时将文本包装成<p></p>标记。

    < / LI>

如果你选择方法1:<saveRichTextContent>

您可以在web.config中添加管道:

<processor type="Sitecore72.Classes.WrapRichTextInParagraphOnSave, Sitecore72" />

您可以使用以下相应的代码:

namespace Sitecore72.Classes
{
    public class WrapRichTextInParagraphOnSave
    {
        public void Process(SaveRichTextContentArgs args)
        {
            if (!(args.Content.Trim().StartsWith("<p>") && args.Content.Trim().EndsWith("</p>")))
                args.Content = "<p>" + args.Content + "</p>";
        }
    }
}

请注意,只有当您使用富文本字段的显示编辑器时才会触发此管道:

Show Editor

如果你选择方法2:<renderField>

要附加到此管道,您将使用此配置:

<processor type="Sitecore72.Classes.WrapRichTextInParagraphOnRender, Sitecore72" />

您可以使用以下相应的代码:

namespace Sitecore72.Classes
{
    public class WrapRichTextInParagraphOnRender
    {
        public void Process(RenderFieldArgs args)
        {
            if (args.FieldTypeKey == "rich text" && !(args.Result.FirstPart.Trim().StartsWith("<p>") && args.Result.FirstPart.Trim().EndsWith("</p>")))
                args.Result.FirstPart = "<p>" + args.Result.FirstPart + "</p>";
        }
    }
}

对于这两者,请确保添加对Sitecore.Kernel.dll和HtmlAgilityPack.dll的引用。这两个都可以与sitecore包解决方案一起使用。