nciaer 发表于 2020-9-16 10:24:53

PC端提交前判断是否有违禁词

手机端在提交前,会判断是否有后台设置的违禁词,如果有,则无法提交,但是pc端只能在提交后判断,也就是会跳转到新页面判断,这样很容易丢失辛苦写的内容。下面这个插件就是解决这个问题的。但是纯插件我不知道如何实现,只能是修改js文件+插件来实现
1首先是修改forum_post.js文件,这个文件里有validate方法,表单提交前会执行这个方法,如果这个方法返回false,则无法提交。于是我在这个方法适当位置(至少是message变量之后)加入如下代码:
var flag = true;
var x = Ajax2('HTML'); // 返回HTML格式
x.post('plugin.php?id=nciaer_key_deny', 'msg='+message+'&formhash='+$('formhash').value, function(s, aj) {
      if(s != 'ok') { // s是插件返回的字符串,如果不是ok,那就意味着有违禁词,直接返回
                showDialog(s);
                flag = false;
      }
});
return false;
if(!flag) {
      return false;
}

上面代码是把编辑器数据ajax同步到后端插件nciaer_key_deny验证,但是我看了dz只有Ajax类,只有异步提交的,我想同步提交怎么办?只能重写个Ajax了,命名为Ajax2,这个类定义在common.js里,源码如下:
// 自己添加得
function Ajax2(recvType, waitId) {
      var aj = new Object();
      aj.loading = '请稍候...';
      aj.recvType = recvType ? recvType : 'XML';
      aj.waitId = waitId ? $(waitId) : null;
      aj.resultHandle = null;
      aj.sendString = '';
      aj.targetUrl = '';
      aj.setLoading = function(loading) {
                if(typeof loading !== 'undefined' && loading !== null) aj.loading = loading;
      };
      aj.setRecvType = function(recvtype) {
                aj.recvType = recvtype;
      };
      aj.setWaitId = function(waitid) {
                aj.waitId = typeof waitid == 'object' ? waitid : $(waitid);
      };
      aj.createXMLHttpRequest = function() {
                var request = false;
                if(window.XMLHttpRequest) {
                        request = new XMLHttpRequest();
                        if(request.overrideMimeType) {
                              request.overrideMimeType('text/xml');
                        }
                } else if(window.ActiveXObject) {
                        var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
                        for(var i=0; i<versions.length; i++) {
                              try {
                                        request = new ActiveXObject(versions)                                        if(request) {
                                                return request;
                                        }
                              } catch(e) {}
                        }
                }
                return request;
      };
      aj.XMLHttpRequest = aj.createXMLHttpRequest();
      aj.showLoading = function() {
            
                if(aj.waitId && (aj.XMLHttpRequest.readyState != 4 || aj.XMLHttpRequest.status != 200)) {
                        aj.waitId.style.display = '';
                        aj.waitId.innerHTML = '<span><img src="' + IMGDIR + '/loading.gif" class="vm"> ' + aj.loading + '</span>';
                }
               
      };
      aj.processHandle = function() {
                if(aj.XMLHttpRequest.readyState == 4 && aj.XMLHttpRequest.status == 200) {
                        if(aj.waitId) {
                              aj.waitId.style.display = 'none';
                        }
                        if(aj.recvType == 'HTML') {
                              aj.resultHandle(aj.XMLHttpRequest.responseText, aj);
                        } else if(aj.recvType == 'XML') {
                              if(!aj.XMLHttpRequest.responseXML || !aj.XMLHttpRequest.responseXML.lastChild || aj.XMLHttpRequest.responseXML.lastChild.localName == 'parsererror') {
                                        aj.resultHandle('' , aj);
                              } else {
                                        aj.resultHandle(aj.XMLHttpRequest.responseXML.lastChild.firstChild.nodeValue, aj);
                              }
                        } else if(aj.recvType == 'JSON') {
                              var s = null;
                              try {
                                        s = (new Function("return ("+aj.XMLHttpRequest.responseText+")"))();
                              } catch (e) {
                                        s = null;
                              }
                              aj.resultHandle(s, aj);
                        }
                }
      };
      aj.get = function(targetUrl, resultHandle) {
                targetUrl = hostconvert(targetUrl);
                setTimeout(function(){aj.showLoading()}, 250);
                aj.targetUrl = targetUrl;
                aj.XMLHttpRequest.onreadystatechange = aj.processHandle;
                aj.resultHandle = resultHandle;
                var attackevasive = isUndefined(attackevasive) ? 0 : attackevasive;
                if(window.XMLHttpRequest) {
                        aj.XMLHttpRequest.open('GET', aj.targetUrl);
                        aj.XMLHttpRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
                        aj.XMLHttpRequest.send(null);
                } else {
                        aj.XMLHttpRequest.open("GET", targetUrl, true);
                        aj.XMLHttpRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
                        aj.XMLHttpRequest.send();
                }
      };
      aj.post = function(targetUrl, sendString, resultHandle) {
                targetUrl = hostconvert(targetUrl);
                //setTimeout(function(){aj.showLoading()}, 250);
                aj.targetUrl = targetUrl;
                aj.sendString = sendString;
                aj.XMLHttpRequest.onreadystatechange = aj.processHandle;
                aj.resultHandle = resultHandle;
                aj.XMLHttpRequest.open('POST', targetUrl, false); // false是以同步方式提交
                aj.XMLHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                aj.XMLHttpRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
                aj.XMLHttpRequest.send(aj.sendString);
      };
      aj.getJSON = function(targetUrl, resultHandle) {
                aj.setRecvType('JSON');
                aj.get(targetUrl+'&ajaxdata=json', resultHandle);
      };
      aj.getHTML = function(targetUrl, resultHandle) {
                aj.setRecvType('HTML');
                aj.get(targetUrl+'&ajaxdata=html', resultHandle);
      };
      return aj;
}


基本是系统Ajax类的翻版,只不过设置成了同步提交。

插件的源码很简单,利用系统的函数来判断:
<?php
if(!defined('IN_DISCUZ')) {
    exit('Access Denied');
}
loadcache($_G['cache']);
$pconfig = $_G['cache']['plugin']['nciaer_key_deny'];
if(!$pconfig['on']) {
    die('ok');
}
if(CHARSET == 'gbk') { // 如果是gbk编码的站,数据需要转成UTF-8
    $message = iconv('utf-8','gbk//ignore', $_GET['msg']);
} else {
    $message = $_GET['msg'];
}
$censor = discuz_censor::instance();
$censor->check($message, null);
if($censor->modbanned() && empty($_G['group']['ignorecensor'])) {
    $wordbanned = implode(', ', $censor->words_found);
    echo str_replace('{badword}', $wordbanned, $pconfig['tip']); // 有违禁词直接输出,$wordbanned就是违禁词
} else {
    echo 'ok';
}


最后效果是这样的:


页: [1]
查看完整版本: PC端提交前判断是否有违禁词