spammer manage

mod spammer popup view page

mod some code
This commit is contained in:
akasima 2013-11-26 18:38:19 +09:00
parent de30ecfb39
commit 3bedab7e95
15 changed files with 531 additions and 4 deletions

View file

@ -3272,6 +3272,10 @@
<value xml:lang="tr"><![CDATA[Güncellemek istediğinize emin misiniz?]]></value>
<value xml:lang="vi"><![CDATA[Bạn chắc chắn muốn Update?]]></value>
</item>
<item name="confirm_process">
<value xml:lang="ko"><![CDATA[처리하시겠습니까?]]></value>
<value xml:lang="en"><![CDATA[Are you sure you want to process?]]></value>
</item>
<item name="column_type">
<value xml:lang="ko"><![CDATA[형식]]></value>
<value xml:lang="en"><![CDATA[Column Type]]></value>

View file

@ -1054,6 +1054,44 @@ class commentModel extends comment
}
}
/**
* Get the total number of comments in corresponding with member_srl.
* @param int $member_srl
* @return int
*/
function getCommentCountByMemberSrl($member_srl)
{
$args = new stdClass();
$args->member_srl = $member_srl;
$output = executeQuery('comment.getCommentCountByMemberSrl', $args);
return (int) $output->data->count;
}
/**
* Get comment list of the doc in corresponding woth member_srl.
* @param int $member_srl
* @param array $columnList
* @param int $page
* @param bool $is_admin
* @param int $count
* @return object
*/
function getCommentListByMemberSrl($member_srl, $columnList = array(), $page = 0, $is_admin = FALSE, $count = 0)
{
$args = new stdClass();
$args->member_srl = $member_srl;
$args->list_count = $count;
$output = executeQuery('comment.getCommentListByMemberSrl', $args, $columnList);
$comment_list = $output->data;
if(!$comment_list) return array();
if(!is_array($comment_list)) $comment_list = array($comment_list);
return $comment_list;
}
}
/* End of file comment.model.php */
/* Location: ./modules/comment/comment.model.php */

View file

@ -0,0 +1,11 @@
<query id="getCommentCountByMemberSrl" action="select">
<tables>
<table name="comments" />
</tables>
<columns>
<column name="count(*)" alias="count" />
</columns>
<conditions>
<condition operation="equal" column="member_srl" var="member_srl" filter="number" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,19 @@
<query id="getCommentList" action="select">
<tables>
<table name="comments" />
</tables>
<columns>
<column name="comment_srl" />
<column name="parent_srl" />
<column name="regdate" />
</columns>
<conditions>
<condition operation="equal" column="member_srl" var="member_srl" filter="number" notnull="notnull" />
</conditions>
<navigation>
<index var="list_order" default="list_order" order="asc" />
<list_count var="list_count" default="20" />
<page_count var="page_count" default="10" />
<page var="page" default="1" />
</navigation>
</query>

View file

@ -1491,6 +1491,42 @@ class documentModel extends document
}
}
}
/**
* Get the total number of Document in corresponding with member_srl.
* @param int $member_srl
* @return int
*/
function getDocumentCountByMemberSrl($member_srl)
{
$args = new stdClass();
$args->member_srl = $member_srl;
$output = executeQuery('document.getDocumentCountByMemberSrl', $args);
return (int) $output->data->count;
}
/**
* Get document list of the doc in corresponding woth member_srl.
* @param int $member_srl
* @param array $columnList
* @param int $page
* @param bool $is_admin
* @param int $count
* @return object
*/
function getDocumentListByMemberSrl($member_srl, $columnList = array(), $page = 0, $is_admin = FALSE, $count = 0 )
{
$args = new stdClass();
$args->member_srl = $member_srl;
$args->list_count = $count;
$output = executeQuery('document.getDocumentListByMemberSrl', $args, $columnList);
$document_list = $output->data;
if(!$document_list) return array();
if(!is_array($document_list)) $document_list = array($document_list);
return $document_list;
}
}
/* End of file document.model.php */
/* Location: ./modules/document/document.model.php */

View file

@ -176,6 +176,7 @@ class documentView extends document
$this->setTemplatePath($this->module_path.'tpl');
$this->setTemplateFile('saved_list_popup');
}
}
/* End of file document.view.php */
/* Location: ./modules/document/document.view.php */

View file

@ -0,0 +1,11 @@
<query id="getDocumentCountByMemberSrl" action="select">
<tables>
<table name="documents" />
</tables>
<columns>
<column name="count(*)" alias="count" />
</columns>
<conditions>
<condition operation="equal" column="member_srl" var="member_srl" filter="number" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,17 @@
<query id="getDocumentList" action="select">
<tables>
<table name="documents" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="member_srl" var="member_srl" filter="number" notnull="notnull" />
</conditions>
<navigation>
<index var="list_order" default="list_order" order="asc" />
<list_count var="list_count" default="20" />
<page_count var="page_count" default="10" />
<page var="page" default="1" />
</navigation>
</query>

View file

@ -20,6 +20,7 @@
<action name="dispMemberGetTempPassword" type="view" />
<action name="dispMemberResendAuthMail" type="view" />
<action name="dispSavedDocumentList" type="view" />
<action name="dispMemberSpammer" type="view" />
<action name="dispMemberAdminList" type="view" index="true" admin_index="true" menu_name="userList" menu_index="true"/>
<!--action name="dispMemberAdminConfig" type="view" menu_name="userSetting" menu_index="true" /-->
@ -68,6 +69,7 @@
<action name="procMemberUpdateAuthMail" type="controller" />
<action name="procMemberResendAuthMail" type="controller" ruleset="resendAuthMail" />
<action name="procMemberResetAuthMail" type="controller" ruleset="resetAuthMail" />
<action name="procMemberSpammerManage" type="controller" />
<action name="procMemberAdminInsert" type="controller" ruleset="insertAdminMember" />
<action name="procMemberAdminDelete" type="controller" />

View file

@ -2619,5 +2619,21 @@
<value xml:lang="en"><![CDATA[Address information does not exist.]]></value>
<value xml:lang="zh-CN"><![CDATA[加入会员后要移动的情报不存在]]></value>
</item>
<item name="cmd_spammer">
<value xml:lang="ko"><![CDATA[스패머 관리]]></value>
<value xml:lang="en"><![CDATA[Spam User Manage]]></value>
</item>
<item name="spammer_description">
<value xml:lang="ko"><![CDATA[<p>지정된 회원을 차단하고, 회원이 남긴 글과 댓글을 삭제합니다. 회원이 작성한 게시물의 양에 따라 오래걸릴 수 있습니다.</p>]]></value>
<value xml:lang="en"><![CDATA[<p>Spam user management. This function denied user login and remove all of documents, comments</p>]]></value>
</item>
<item name="btn_spammer_delete_all">
<value xml:lang="ko"><![CDATA[모두 삭제]]></value>
<value xml:lang="en"><![CDATA[Delete all]]></value>
</item>
<item name="spammer_move_to_trash">
<value xml:lang="ko"><![CDATA[휴지통으로 이동]]></value>
<value xml:lang="en"><![CDATA[Move to trash]]></value>
</item>
</lang>

View file

@ -144,6 +144,10 @@ class member extends ModuleObject {
FileHandler::makeDir('./files/member_extra_info/profile_image');
FileHandler::makeDir('./files/member_extra_info/signature');
// 2013. 11. 22 add menu when popup document menu called
$oModuleController->insertTrigger('document.getDocumentMenu', 'member', 'controller', 'triggerGetDocumentMenu', 'after');
$oModuleController->insertTrigger('comment.getCommentMenu', 'member', 'controller', 'triggerGetCommentMenu', 'after');
return new Object();
}
@ -208,6 +212,10 @@ class member extends ModuleObject {
if(!is_readable('./files/ruleset/login.xml')) return true;
if(!is_readable('./files/ruleset/find_member_account_by_question.xml')) return true;
// 2013. 11. 22 add menu when popup document menu called
if(!$oModuleModel->getTrigger('document.getDocumentMenu', 'member', 'controller', 'triggerGetDocumentMenu', 'after')) return true;
if(!$oModuleModel->getTrigger('comment.getCommentMenu', 'member', 'controller', 'triggerGetCommentMenu', 'after')) return true;
return false;
}
@ -345,6 +353,12 @@ class member extends ModuleObject {
if(!is_readable('./files/ruleset/find_member_account_by_question.xml'))
$oMemberAdminController->_createFindAccountByQuestion($config->identifier);
// 2013. 11. 22 add menu when popup document menu called
if(!$oModuleModel->getTrigger('document.getDocumentMenu', 'member', 'controller', 'triggerGetDocumentMenu', 'after'))
$oModuleController->insertTrigger('document.getDocumentMenu', 'member', 'controller', 'triggerGetDocumentMenu', 'after');
if(!$oModuleModel->getTrigger('comment.getCommentMenu', 'member', 'controller', 'triggerGetCommentMenu', 'after'))
$oModuleController->insertTrigger('comment.getCommentMenu', 'member', 'controller', 'triggerGetCommentMenu', 'after');
return new Object(0, 'success_updated');
}

View file

@ -1962,8 +1962,10 @@ class memberController extends member
/**
* Modify member information
*
* @param bool $is_admin , modified 2013-11-22
*/
function updateMember($args)
function updateMember($args, $is_admin = FALSE)
{
// Call a trigger (before)
$output = ModuleHandler::triggerCall('member.updateMember', 'before', $args);
@ -1986,8 +1988,9 @@ class memberController extends member
else
{
unset($args->is_admin);
unset($args->denied);
if($logged_info->member_srl != $args->member_srl)
if($is_admin == false)
unset($args->denied);
if($logged_info->member_srl != $args->member_srl && $is_admin == false)
{
return $this->stop('msg_invalid_request');
}
@ -2354,6 +2357,206 @@ class memberController extends member
$this->setTemplatePath($this->module_path.'tpl');
$this->setTemplateFile('msg_success_modify_email_address');
}
/**
* trigger for document.getDocumentMenu. Append to popup menu a button for procMemberSpammerManage()
*
* @param array &$menu_list
*
* @return object
**/
function triggerGetDocumentMenu(&$menu_list)
{
if(!Context::get('is_logged')) return new Object();
$logged_info = Context::get('logged_info');
$document_srl = Context::get('target_srl');
$oDocumentModel = &getModel('document');
$columnList = array('document_srl', 'module_srl', 'member_srl', 'ipaddress');
$oDocument = $oDocumentModel->getDocument($document_srl, false, false, $columnList);
$member_srl = $oDocument->get('member_srl');
$module_srl = $oDocument->get('module_srl');
if(!$member_srl) return new Object();
if($oDocumentModel->grant->manager != 1 || $member_srl==$logged_info->member_srl) return new Object();
$oDocumentController = &getController('document');
$url = getUrl('','module','member','act','dispMemberSpammer','member_srl',$member_srl,'module_srl',$module_srl);
$oDocumentController->addDocumentPopupMenu($url,'cmd_spammer','','popup');
return new Object();
}
/**
* trigger for comment.getCommentMenu. Append to popup menu a button for procMemberSpammerManage()
*
* @param array &$menu_list
*
* @return object
**/
function triggerGetCommentMenu(&$menu_list)
{
if(!Context::get('is_logged')) return new Object();
$logged_info = Context::get('logged_info');
$comment_srl = Context::get('target_srl');
$oCommentModel = &getModel('comment');
$columnList = array('comment_srl', 'module_srl', 'member_srl', 'ipaddress');
$oComment = $oCommentModel->getComment($comment_srl, FALSE, $columnList);
$module_srl = $oComment->get('module_srl');
$member_srl = $oComment->get('member_srl');
if(!$member_srl) return new Object();
if($oCommentModel->grant->manager != 1 || $member_srl==$logged_info->member_srl) return new Object();
$oCommentController = &getController('comment');
$url = getUrl('','module','member','act','dispMemberSpammer','member_srl',$member_srl,'module_srl',$module_srl);
$oCommentController->addCommentPopupMenu($url,'cmd_spammer','','popup');
return new Object();
}
/**
* Spammer manage. Denied user login. And delete or trash all documents. Response Ajax string
*
* @return object
**/
function procMemberSpammerManage()
{
if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted');
$logged_info = Context::get('logged_info');
$member_srl = Context::get('member_srl');
$module_srl = Context::get('module_srl');
$cnt_loop = Context::get('cnt_loop');
$proc_type = Context::get('proc_type');
$isMoveToTrash = true;
if($proc_type == "delete")
$isMoveToTrash = false;
// check grant
$oModuleModel = &getModel('module');
$columnList = array('module_srl', 'module');
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl, $columnList);
$grant = $oModuleModel->getGrant($module_info, $logged_info);
if(!$grant->manager) return new Object(-1,'msg_not_permitted');
$proc_msg = "";
$oDocumentModel = &getModel('document');
$oCommentModel = &getModel('comment');
// delete or trash destination
// proc member
if($cnt_loop == 1)
$this->_spammerMember($member_srl);
// proc document and comment
elseif($cnt_loop>1)
$this->_spammerDocuments($member_srl, $isMoveToTrash);
// get destination count
$cnt_document = $oDocumentModel->getDocumentCountByMemberSrl($member_srl);
$cnt_comment = $oCommentModel->getCommentCountByMemberSrl($member_srl);
$total_count = Context::get('total_count');
$remain_count = $cnt_document + $cnt_comment;
if($cnt_loop == 1) $total_count = $remain_count;
// get progress percent
if($total_count > 0)
$progress = intval( ( ( $total_count - $remain_count ) / $total_count ) * 100 );
else
$progress = 100;
$this->add('total_count', $total_count);
$this->add('remain_count', $remain_count);
$this->add('progress', $progress);
$this->add('member_srl', $member_srl);
$this->add('module_srl', $module_srl);
$this->add('cnt_loop', ++$cnt_loop);
$this->add('proc_type', $proc_type);
return new Object(0);
}
/**
* Denied user login and write description
*
* @param int $member_srl
*
* @return object
**/
private function _spammerMember($member_srl) {
$logged_info = Context::get('logged_info');
$spam_description = trim( Context::get('spam_description') );
$oMemberModel = &getModel('member');
$columnList = array('member_srl', 'description');
// get member current infomation
$member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl, 0, $columnList);
$oDocumentModel = &getModel('document');
$oCommentModel = &getModel('comment');
$cnt_comment = $oCommentModel->getCommentCountByMemberSrl($member_srl);
$cnt_document = $oDocumentModel->getDocumentCountByMemberSrl($member_srl);
$total_count = $cnt_comment + $cnt_document;
$args = new stdClass();
$args->member_srl= $member_info->member_srl;
$args->denied = "Y";
$args->description = trim( $member_info->description );
if( $args->description != "" ) $args->description .= "\n"; // add new line
$args->description .= Context::getLang('cmd_spammer') . "[" . date("Y-m-d H:i:s") . " from:" . $logged_info->user_id . " info:" . $spam_description . " docuemnts count:" . $total_count . "]";
return $this->updateMember($args, true);
}
/**
* Delete or trash all documents
*
* @param int $member_srl
* @param bool $isMoveToTrash
*
* @return object
**/
private function _spammerDocuments($member_srl, $isMoveToTrash) {
$oDocumentController = &getController('document');
$oDocumentModel = &getModel('document');
$oCommentController = &getController('comment');
$oCommentModel = &getModel('comment');
// delete count by one request
$getContentsCount = 10;
// 1. proc comment, 2. proc document
$cnt_comment = $oCommentModel->getCommentCountByMemberSrl($member_srl);
$cnt_document = $oDocumentModel->getDocumentCountByMemberSrl($member_srl);
if($cnt_comment > 0)
{
$columnList = array();
$commentList = $oCommentModel->getCommentListByMemberSrl($member_srl, $columnList, 0, false, $getContentsCount);
if($commentList) {
foreach($commentList as $v) {
$oCommentController->deleteComment($v->comment_srl, true, $isMoveToTrash);
}
}
} elseif($cnt_document > 0) {
$columnList = array();
$documentList = $oDocumentModel->getDocumentListByMemberSrl($member_srl, $columnList, 0, false, $getContentsCount);
if($documentList) {
foreach($documentList as $v) {
if($isMoveToTrash) $oDocumentController->moveDocumentToTrash($v);
else $oDocumentController->deleteDocument($v->document_srl);
}
}
}
return array();
}
}
/* End of file member.controller.php */
/* Location: ./modules/member/member.controller.php */

View file

@ -611,6 +611,41 @@ class memberView extends member
Context::addHtmlHeader($js_code);
}
/**
* Spammer manage popup
*
* @return void
**/
function dispMemberSpammer()
{
if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted');
$member_srl = Context::get('member_srl');
$module_srl = Context::get('module_srl');
// check grant
$oModuleModel = &getModel('module');
$columnList = array('module_srl', 'module');
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl, $columnList);
$grant = $oModuleModel->getGrant($module_info, Context::get('logged_info'));
if(!$grant->manager) return new Object(-1,'msg_not_permitted');
$oMemberModel = &getModel('member');
Context::loadLang('modules/document/lang/');
Context::set('spammer_info', $oMemberModel->getMemberInfoByMemberSrl($member_srl));
Context::set('module_srl', $module_srl);
// Select Pop-up layout
$this->setLayoutPath('./common/tpl');
$this->setLayoutFile('popup_layout');
$this->setTemplatePath($this->module_path.'tpl');
$this->setTemplateFile('spammer');
}
}
/* End of file member.view.php */
/* Location: ./modules/member/member.view.php */

View file

@ -160,3 +160,4 @@ function doDeleteSavedDocument(document_srl, confirm_message) {
function insertSelectedModule(id, module_srl, mid, browser_title) {
location.href = current_url.setQuery('selected_module_srl',module_srl);
}

View file

@ -0,0 +1,119 @@
<!--%import("filter/manage_checked_document.xml")-->
<style type="text/css">
.dot-line {border-bottom:1px dotted #ddd; padding:8px 0;}
.progress-box {visibility:hidden;padding:10px;}
.progress-complete {visibility:hidden;background-color:#EAEAEA;color:#F15F5F;font-weight:bold;text-align:center;padding:3px;}
.progress-cancel {visibility:hidden;background-color:#EAEAEA;color:#F15F5F;font-weight:bold;text-align:center;padding:3px;}
.btn-proc { padding:40px 0; text-align:right;}
.btn-proc label {float:right; margin-left:20px;}
#spam_description {width:98%}
</style>
<div class="x_modal-header">
<h1>{$lang->cmd_spammer}</h1>
</div>
<form action="./" method="post" id="fo_management" onsubmit="return doSpammerManage();">
<input type="hidden" name="module" value="member" />
<input type="hidden" name="act" value="procMemberSpammerManage" />
<input type="hidden" name="proc_type" value="" />
<input type="hidden" name="member_srl" value="{$spammer_info->member_srl}" />
<input type="hidden" name="module_srl" value="{$module_srl}" />
<input type="hidden" name="cnt_loop" value="1" />
<div class="x_modal-body x_form-horizontal" style="max-height:none">
<div class="dot-line">{$lang->spammer_description}</div>
<div class="dot-line">{$lang->nick_name} : <span class="nick_name">{$spammer_info->nick_name}</span></div>
<div class="dot-line">
<p>{$lang->about_member_description}</p>
<textarea name="spam_description" id="spam_description" cols="400" rows="3"></textarea>
</div>
<div class="btn-proc" >
<label for="to_trash"><input type="checkbox" name="to_trash" value="Y" checked="checked" id="to_trash" />{$lang->spammer_move_to_trash}</label>
<button class="x_btn x_btn-danger" type="submit"/>{$lang->btn_spammer_delete_all}</button>
</div>
<div class="progress-box">
<div class="progress-complete">{$lang->cmd_complete}</div>
<div><span id="document_count"></span> <span id="document_percent"></span></div>
<div class="x_progress x_progress-striped x_active">
<div class="x_bar" id="progressBar" style="width: 0%"></div>
</div>
<div class-"cancel"><button class="x_btn" type="button" onclick="cancelSpammerManage();">{$lang->cmd_cancel}</button></div>
</div>
<div class="progress-cancel dot-line">{$lang->success_declare_canceled}</div>
</div>
</form>
<script type="text/javascript">
var bSpammerManageProc = true;
var form_info = "";
function doSpammerManage( args ) {
if( args == undefined ) {
if(!confirm('{$lang->confirm_process}')) return false;
var args = {};
var vals = jQuery('#fo_management').serializeArray();
for( var i in vals ) {
args[vals[i].name] = vals[i].value;
}
// reset form
args.proc_type = "trash";
if( jQuery('#to_trash').attr( 'checked' ) != "checked" )
args.proc_type = "hidden";
args.cnt_loop =1;
form_info = args;
jQuery('.progress-box').css('visibility','visible');
jQuery('.progress-cancel').css('visibility','hidden');
jQuery('[type=submit]').hide();
bSpammerManageProc = true;
}
jQuery.exec_json( form_info.module + '.' + form_info.act, args, progressSpammerManage );
return false; // don't page move
}
function progressSpammerManage( data ) {
setTimeout( function() {
if( data.total_count != undefined && parseInt( data.total_count ) > 0 ) {
var doc_count = parseInt( data.total_count ) - parseInt( data.remain_count );
jQuery('#document_count').html( doc_count + "/" + data.total_count );
jQuery('#document_percent').html(data.progress + "%");
}
jQuery('#progressBar').width(data.progress + "%");
if(data.remain_count <= 0) {
jQuery('.progress-complete').css('visibility','visible');
jQuery('[type=submit]').show();
return;
}
var args = data;
if( bSpammerManageProc == false ) {
jQuery('.progress-box').css('visibility','hidden');
jQuery('.progress-cancel').css('visibility','visible');
// reset progress values
jQuery('#document_count').html("");
jQuery('#document_percent').html("");
jQuery('#progressBar').width("0%");
jQuery('[type=submit]').show();
return;
}
doSpammerManage( args );
}, 500 );
}
function cancelSpammerManage() {
bSpammerManageProc = false;
}
</script>