調用discuz編輯器發佈帖子顯示html代碼的解決辦法

  在discuz二次開發中調用discuz的編輯器是一件在所不免的事情,然而discuz的開發文檔少得可憐;所以在二次開發的時候查看源碼和各類莫名其妙的問題着實使人摸不着頭腦。前面講解了一下調用discuz編輯器的實例調用discuz編輯器不再是問題了。然而這只是一個粗糙的例子,而discuz帖子存儲在數據庫的倒是自定義的bbcode而不是正常的html代碼。這也就致使直接調用discuz的編輯器發帖顯示出來的帖子成了html源碼。javascript

  網上找了好久也沒找到相應的問題,最後經過數據庫的字段對比才知道問題的所在。php

  一、問題所在html

  調用編輯器編輯的源碼前端

頂頂頂頂頂<b><i>的頂頂頂頂頂</i></b>頂頂頂頂的的<a href="http://127.0.0.1:8080/data/attachment/album/201507/22/112816z1znnm01wmozpvgb.png" target="_blank"><img src="http://127.0.0.1:8080/data/attachment/album/201507/22/112816z1znnm01wmozpvgb.png" border="0" alt=""></a>

  而默認發帖的源碼爲java

頂頂頂頂頂[b][i][u]的頂頂頂頂頂[/u][/i][/b]頂頂頂頂的的[url=data/attachment/album/201507/22/112816z1znnm01wmozpvgb.png][img]data/attachment/album/201507/22/112816z1znnm01wmozpvgb.png[/img][/url]

  因而網上找了一通,最後才知道這是discuz的特點。對html代碼進行了特殊的處理,其採用了bbcode的方式進行二次編碼,顯示帖子的時候再將bbcode編碼轉換成正常的html代碼。discuz這麼作的目的也顯而易見,最終是爲了提升整個應用的安全性。web

  二、提交前對html進行bbcode編碼數據庫

  static/js/bbcode.js中的html2bbcode能夠講正常的html編碼轉換成discuz自定義的bbcode編碼安全

  最後在./static\image\editor\editor_function.js中的edit_save()找到了獲取編輯器內容,並設置編碼jsp

var p = window.frames['uchome-ifrHtmlEditor'];
var obj = p.window.frames['HtmlEditor'];
var status = p.document.getElementById('uchome-editstatus').value;
$('uchome-ttHtmlEditor').value = p.document.getElementById('sourceEditor').value;

  三、完整的調用方式編輯器

<script type="text/javascript" src="{$_G['setting']['jspath']}forum_post.js?{VERHASH}"></script>
<script src="static/js/bbcode.js?{VERHASH}" type="text/javascript"></script>
<script type="text/JavaScript">
    var fid = {$_G['fid']};//插件所在版塊ID
</script>

<!--{subtemplate home/editor_image_menu}-->
<textarea class="userData" name="content" id="uchome-ttHtmlEditor" style="height: 100%; width: 100%; display: none; border: 0px"></textarea>
<iframe src='home.php?mod=editor&charset={CHARSET}&allowhtml=1&isportal=0' name='uchome-ifrHtmlEditor' id='uchome-ifrHtmlEditor'  scrolling='no' style='width:85%;height:400px;border:1px solid #C5C5C5;position:relative;' border=0 frameborder=0 ></iframe>
</br>

<input type="hidden" name="formhash" id="formhash" value="{FORMHASH}" />
<input type="hidden" name="posttime" id="posttime" value="{$posttime}" />
<input type="hidden" name="wysiwyg" id="e_mode" value="1" />
<input type="hidden" name="special" value="127" />
<input type="hidden" name="specialextra" value="plugin_test" />
<input type="hidden" id="message" name="message" value="" />
<input id='submit_editsubmit' class='btn' type='button' value='提交'  name='editsubmit' onClick='validate(this);'>
</form>

<script type="text/javascript" src="static/image/editor/editor_base.js?{VERHASH}"></script>
<script type="text/javascript" src="static/image/editor/editor_function.js?{VERHASH}"></script>


<script type="text/javascript">
var textobj = $('uchome-ttHtmlEditor');
var wysiwyg = (BROWSER.ie || BROWSER.firefox || (BROWSER.opera >= 9)) && parseInt('1') == 1 ? 1 : 0;
var allowswitcheditor = parseInt('1');
var allowhtml = parseInt('0');
var allowsmilies = parseInt('1');
var allowbbcode = parseInt('1');
var allowimgcode = parseInt('1');
var simplodemode = parseInt('0');
var fontoptions = new Array("宋體", "新宋體", "黑體", "微軟雅黑", "Arial", "Verdana", "Mingliu", "Helvetica", "Trebuchet MS", "Tahoma", "Impact", "Times New Roman", "仿宋,仿宋_GB2312", "楷體,楷體_GB2312");
var smcols = 8;
var custombbcodes = new Array();
</script>

<script type="text/JavaScript">

function validate(obj) {
    var mcpp = window.frames['uchome-ifrHtmlEditor'];
    var mcpobj = mcpp.window.frames['HtmlEditor'];
    
    edit_save(); 
    jQuery("#message").val(html2bbcode(mcpobj.document.body.innerHTML));
    window.onbeforeunload = null;
    obj.form.submit();  
    return false;  
}
</script>  

  其中jQuery("#message").val(html2bbcode(mcpobj.document.body.innerHTML));是將html轉成bbcode。

  四、這裏只是web前端進行了bbcode的編碼。然而若是有須要也能夠在php處理函數中進行bbcode的轉換

$str = "<b><i>的的頂頂頂頂頂的頂頂頂頂頂頂頂頂頂的的</i></b>";
//html轉成bbcode
require_once libfile('function/editor');
echo html2bbcode($str);

echo "</br>";

$str2 = '[b][i]的的頂頂頂頂頂的頂頂頂頂頂頂頂頂頂的的[/i][/b]';
//將bbcode轉成html
require_once libfile('function/discuzcode'); 
echo discuzcode($str2, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0);

   五、編輯帖子時出現「您的提交帶有不合法參數,謝謝合做」的解決辦法

  若是自定義調用discuz編輯器,存儲到數據庫的時候是bbcode格式。然而,若是編輯的時候也是自定義調用discuz編輯器的話,bbcode格式也就沒法正常顯示了。若是在php裏面直接轉換成正常的html格式,這時又會觸發discuz的安全機制,沒法正常提交。若是配到這樣的問題要怎麼解決呢?咱們能夠採用onload事件進行處理,也就是頁面加載完成之後用bbcode2html將bbcode編碼的內容轉換成正常的html再賦值給編輯器。

window.onload = function(){
    var mcpp = window.frames['uchome-ifrHtmlEditor'];
    var mcpobj = mcpp.window.frames['HtmlEditor'];
    mcpobj.document.body.innerHTML = bbcode2html("{$thread['message']}");//加載完成時將bbcode內容轉換成正常的html代碼並賦值
}
相關文章
相關標籤/搜索