请选择 进入手机版 | 继续访问电脑版

硬汉工作室

搜索
热搜: 活动 交友 discuz
查看: 2086|回复: 0

[插件定制] PC端提交前判断是否有违禁词

[复制链接]

671

主题

694

帖子

5973

积分

管理员

硬汉工作室创始人

Rank: 9Rank: 9Rank: 9

积分
5973

宣传达人推广达人

QQ
发表于 2020-9-16 10:24:53 | 显示全部楼层 |阅读模式
手机端在提交前,会判断是否有后台设置的违禁词,如果有,则无法提交,但是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';
}


最后效果是这样的:
2020-09-16_100714.jpg

有关PHP系统、Discuz或网站等各种问题,可以联系QQ1069971363寻求付费支持

nciaer_key_deny.rar

3.5 KB, 下载次数: 0

售价: 1000 金钱  [记录]  [购买]

Discuz插件商店:http://addon.dismall.com/?@56030.developer
回复

使用道具 举报

QQ|Archiver|手机版|小黑屋|硬汉工作室 ( 冀ICP备13021567号-9 )

GMT+8, 2024-3-28 23:20 , Processed in 0.531921 second(s), 33 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表