手机端在提交前,会判断是否有后台设置的违禁词,如果有,则无法提交,但是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';
}
最后效果是这样的:
有关PHP系统、Discuz或网站等各种问题,可以联系QQ1069971363寻求付费支持
|