本人在 discuz 二次開發時,調用編輯器發帖后顯示的是html源代碼,找了好久才解決這個問題,本人現在把解決問題的方法分享給大家。
discuz的開發文檔很少,在二次開發的時候用discuz的編輯器,顯示的是html代碼,查看源碼和各種莫名其妙的問題著實令人摸不著頭腦。而discuz帖子存儲在數據庫的卻是自定義的bbcode而不是正常的html代碼。這也就導致直接調用discuz的編輯器發帖顯示出來的帖子成了html源碼。
網上找了很久也沒找到相應的問題,最后通過數據庫的字段對比才知道問題的所在。
1、問題所在
調用編輯器編輯的源碼
- 頂頂頂頂頂<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>
而默認發帖的源碼為:
- 頂頂頂頂頂[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這么做的目的也顯而易見,最終是為了提高整個應用的安全性。
2、提交前對html進行bbcode編碼
static/js/bbcode.js中的html2bbcode可以講正常的html編碼轉換成discuz自定義的bbcode編碼
最后在./static/image/editor/editor_function.js中的edit_save()找到了獲取編輯器內容,并設置編碼.
- 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; //Vevb.com
3、完整的調用方式
- <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。
4、這里只是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 x2.5編輯器代碼的設置方法
discuz編輯器可以方便的讓用戶使用Discuz代碼,從而把帖子的用戶體驗做的更好,一個站長必須掌握編輯的基本方法,相對Discuz論壇來說,就是要熟悉Discuz編輯器代碼。
為了讓新手更容易上手發帖,在后臺--界面--編輯設置--全局設置:
1、默認的編輯器模式:純文本模式;
2、是否允許切換編輯器模式:是;
3、編輯欄樣式:高級。
使用純文本模式,主要為防止一些新手發帖復制粘貼的問題,過濾掉一些不規范的編輯,讓內容看起來更規范。默認使用高級模式也是為了讓更多可以使用的功能突顯出來,讓用戶去體驗和使用。
編輯器里面的一些功能是通過用戶組權限和版塊權限來控制,比如音樂、視頻、flash的功能,@朋友的功能,隱藏信息的功能,下載遠程圖片的功能,QQ在線的功能等。
比如:
1、開啟音樂、視頻、flash的功能,需要在用戶組--論壇相關--帖子相關--允許使用 [audio] [media] [flash] 等多媒體代碼:選擇是;同時版塊設置--帖子選項--允許使用 [audio] [media] [flash] 等多媒體代碼:選擇是;
2、@朋友的功能,隱藏信息的功能,下載遠程圖片的功能都在用戶組權限里面設置,具體可以查看Discuz x2.5 用戶組設置策略方法
3、QQ在線的功能:在后臺--界面--編輯設置--Discuz代碼:QQ勾選可用顯示即可,也可以通過詳情來編輯不同用戶組的使用權限。
新聞熱點
疑難解答