2017-01-17 4 views
0

Мне нужно запустить RegEx по содержимому любого модуля HTML Pro до загрузки страницы. Я предполагаю, что пользовательский код попадет в этот файл: /DesktopModules/HTML/HtmlModule.ascx - «OnPreRender» выглядит для меня хорошим местом. Это правильное место/файл для изменения?Как я могу предварительно обработать текст внутри модуля HTML Pro в DNN 7?

Целью Regex является замена адресов электронной почты, найденных в тексте, с измененной версией самих себя, чтобы не допустить спам-ботов. (Раньше в DNN Store были некоторые модули, но они теперь прекращены, я использовал их раньше, но слишком сильно замедлял время загрузки страницы.)

Я провел некоторое исследование но не нашли подходящих примеров. То, что я нашел не достаточно для меня, чтобы осуществить то, что я хочу:

Может кто-нибудь помочь мне с стартером пример код, чтобы сделать следующее:

  1. Перед содержание Pro модуля HTML отправляется в браузер, возьмите последнюю версию контента HTML
  2. Запуск Regex.Replace на нем
  3. Продолжить загрузку страницы с помощью модифицированного содержимого HTML

Прямо сейчас раздел, на который я смотрю, выглядит так: где бы я вставлял этот код?

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); 
} 

Спасибо за любую помощь!

ответ

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> 
+0

Джастин, мы все еще используем MyTokens, но я не могу себе представить, как вы будете использовать эту функциональность. Я хочу сохранить метод ввода одинаковым/по умолчанию и только модифицировать данные, прежде чем выводить их на веб-страницу. Что может сделать MyTokens, что нельзя сделать с помощью прямого C# (который также поддерживает RegEx)? Просьба уточнить. Постскриптум Приятно слышать от тебя, чувак! – Bogdan

+0

См. Приведенный выше ответ с примером кода. – jacton

+0

@ Богдан сделал для вас отрегулированный ответ? – jacton