如何在DNN 7中的HTML Pro模块中预处理文本?

时间:2017-01-17 16:17:38

标签: dotnetnuke dotnetnuke-7

我需要在页面加载之前对任何HTML Pro模块的内容运行RegEx。我假设自定义代码将进入此文件: /DesktopModules/HTML/HtmlModule.ascx - " OnPreRender"看起来对我来说是一个好地方。这是修改的正确位置/文件吗?

RegEX的目的是用自己的修改版本替换文本中找到的电子邮件地址,以防止垃圾邮件程序抓取它们。 (曾经有一些模块可以在DNN商店中使用它们,但它们现在已经停止使用;我之前已经使用过它们,但是它们将页面加载时间减慢了太多。)

我做过一些研究,但没有找到任何可用的例子。我所发现的并不足以让我实现我想要的东西:

任何人都可以帮助我使用代码的初始示例来执行以下操作:

  1. 在将HTML Pro模块的内容发送到浏览器之前,请获取最新版本的HTML内容
  2. 在其上运行Regex.Replace
  3. 继续使用修改后的HTML内容加载页面
  4. 现在,我看到的部分看起来像这样 - 我会在哪里插入该代码?

        protected override void OnPreRender(System.EventArgs e) 
    {
        if (true && HttpRuntime.Cache.Get("avt.MyTokens2.CorePatched") == "true") {
            base.OnPreRender(e);
            return;
        }
    
        if (Convert.ToBoolean(Settings["MyTokensReplace"]) == true) {
                (lblContent.Controls[0] as LiteralControl).Text = Tokenize((lblContent.Controls[0] as LiteralControl).Text, ModuleConfiguration, false, true);
            }
    
        base.OnPreRender(e);
    }
    

    感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

的Bogdan,

你也很好听!下面的代码对我有用,虽然我没有HTML Pro模块,因此可能需要稍微调整一下。不确定您要对电子邮件地址做什么,但下面的代码只是添加了一个“X”,其中@符号位于之前。您可以根据需要进行调整。

<%@ Import namespace="DotNetNuke.Modules.Html" %>
<%@ Import namespace="DotNetNuke.Entities.Portals" %>
<script language="c#" runat="server">

 protected override void OnPreRender(System.EventArgs e) 
{
    HtmlTextController htmlTextController = new HtmlTextController();
    WorkflowStateController workflowStateController = new WorkflowStateController();
    int workflowId = htmlTextController.GetWorkflow(ModuleId, TabId, PortalId).Value;

    HtmlTextInfo htmlContent = htmlTextController.GetTopHtmlText(ModuleId, false, workflowId);
    if (htmlContent == null)
    {
        htmlContent = new HtmlTextInfo();
        htmlContent.ItemID = -1;
        htmlContent.StateID = workflowStateController.GetFirstWorkflowStateID(workflowId);
        htmlContent.WorkflowID = workflowId;
        htmlContent.ModuleID = ModuleId;
        htmlContent.IsPublished = true;
        htmlContent.Approved = true;
        htmlContent.IsActive = true;
    }

    string pattern = "@";
    string replacement = "X";
    Regex rgx = new Regex(pattern);
    string result = rgx.Replace(htmlContent.Content,replacement);

    htmlContent.Content = result;

    int draftStateId = workflowStateController.GetFirstWorkflowStateID(workflowId);
    int nextWorkflowStateId = workflowStateController.GetNextWorkflowStateID(workflowId, htmlContent.StateID);
    int publishedStateId = workflowStateController.GetLastWorkflowStateID(workflowId);

    htmlTextController.UpdateHtmlText(htmlContent, htmlTextController.GetMaximumVersionHistory(PortalId));
}

</script>