개별 문서 댓글 알림을 차단하는 옵션 추가

This commit is contained in:
BJRambo 2020-02-04 12:12:02 +09:00
parent 7285a332b7
commit c315a6ad10
15 changed files with 447 additions and 0 deletions

View file

@ -4,6 +4,8 @@
<actions>
<action name="dispNcenterliteNotifyList" type="view" permission="member" />
<action name="dispNcenterliteUserConfig" type="view" permission="member" />
<action name="dispNcenterliteIndividualBlockList" type="view" />
<action name="dispNcenterliteInsertIndividualBlock" type="view" />
<action name="getColorsetList" type="model" permission="root" />
<action name="getMyNotifyListTpl" type="model" permission="member" />
@ -11,6 +13,7 @@
<action name="procNcenterliteUserConfig" type="controller" permission="member" />
<action name="procNcenterliteNotifyReadAll" type="controller" permission="member" />
<action name="procNcenterliteRedirect" type="controller" permission="member" method="GET|POST" />
<action name="procNcenterliteInsertIndividualBlock" type="controller" />
<action name="dispNcenterliteAdminConfig" type="view" admin_index="true" menu_name="ncenterlite" menu_index="true" />
<action name="dispNcenterliteAdminAdvancedconfig" type="view" menu_name="ncenterlite" />

View file

@ -40,6 +40,8 @@ $lang->ncenterlite_vote_noti = '추천 알림';
$lang->ncenterlite_vote_noti_about = '내 게시글, 혹은 댓글이 추천을 받았을 때 알림을 받습니다.';
$lang->ncenterlite_scrap_noti = '스크랩 알림';
$lang->ncenterlite_scrap_noti_about = '누군가 내 게시글을 스크랩 했을 경우 알림을 받습니다.';
$lang->ncneterlite_block_individual = '개별 문서/댓글 알림 차단';
$lang->ncneterlite_block_individual_about = '개별적으로 문서/댓글을 차단할 수 있습니다.';
$lang->ncenterlite_activate = '사용';
$lang->ncenterlite_inactivate = '사용 안함';
$lang->ncenterlite_userconfig_about_warning = '주의! 당신은 관리자 권한으로 다른 사용자의 설정창에 접속하였습니다.';
@ -81,6 +83,7 @@ $lang->ncenterlite_more = '더보기';
$lang->ncenterlite_stop_login_required = '알림센터 설정을 하시려면 로그인 해주세요.';
$lang->ncenterlite_stop_no_permission_other_user = '다른 회원의 설정을 볼 권한이 없습니다.';
$lang->ncenterlite_stop_no_permission_other_user_settings = '다른 회원의 설정을 변경할 권한이 없습니다.';
$lang->ncenterlite_stop_no_permission_other_user_block_settings = '다른 회원의 차단 설정을 변경할 권한이 없습니다.';
$lang->ncenterlite_message_delete_notification_before = '%s까지 알림 정보를 삭제했습니다.';
$lang->ncenterlite_message_delete_notification_all = '모든 알림을 삭제했습니다.';
$lang->ncenterlite_notice_list = '알림 목록';
@ -123,6 +126,10 @@ $lang->ncenterlite_commnet_event_noti_some = '대댓글은 알리지 않음';
$lang->ncenterlite_message_event = '쪽지 알림 설정';
$lang->ncenterlite_message_event_about = '쪽지 알림을 사용하지 않음(XE의 기본 쪽지 알림을 사용)';
$lang->ncenterlite_mid_use = '모듈별 사용 설정';
$lang->ncenterlite_to_block = '차단함';
$lang->ncenterlite_unblock = '차단 안함';
$lang->this_message_block = '이 게시글/댓글의 알림 차단여부';
$lang->about_this_message_block = '이 게시글/댓글의 알림을 차단합니다.';
$lang->member_menu_view = '회원 메뉴 표시';
$lang->member_menu_on = '표시';
$lang->member_menu_off = '표시하지 않음';
@ -168,3 +175,4 @@ $lang->ncenterlite_custom_list = '커스텀 리스트';
$lang->msg_not_use_user_setting = '유저 세팅을 제공하지 않습니다. 관리자에게 문의하세요.';
$lang->msg_denger_rhymix_user = '<strong>경고!</strong> 라이믹스에서는 코어에 포함된 순정 알림센터를 사용해야 합니다.<br />XE용 알림센터를 삭제하고, 라이믹스 알림센터를 다시 설치해 주시기 바랍니다.';
$lang->msg_test_notifycation_success = '테스트알림더미를 정상적으로 생성하였습니다.';
$lang->msg_individual_block_not_support = '개별 차단 기능을 제공하지 않습니다. 관리자에게 문의하세요.';

View file

@ -35,6 +35,7 @@ class ncenterliteAdminController extends ncenterlite
'highlight_effect',
'comment_all',
'comment_all_notify_module_srls',
'individual_block',
);
foreach($config_vars as $val)

View file

@ -65,6 +65,99 @@ class ncenterliteController extends ncenterlite
$this->setRedirectUrl(getNotEncodedUrl('act', 'dispNcenterliteUserConfig', 'member_srl', $member_srl));
}
}
function procNcenterliteInsertIndividualBlock()
{
$oNcenterliteModel = getModel('ncenterlite');
$config = $oNcenterliteModel->getConfig();
if($config->individual_block !== 'Y')
{
throw new Rhymix\Framework\Exception('msg_individual_block_not_support');
}
$member_srl = Context::get('member_srl');
if(!$member_srl)
{
$member_srl = $this->user->member_srl;
}
if($this->user->member_srl != $member_srl && $this->user->is_admin != 'Y')
{
throw new Rhymix\Framework\Exception('ncenterlite_stop_no_permission_other_user_block_settings');
}
$obj = Context::getRequestVars();
if($obj->individual_srl)
{
$userBlockData = $oNcenterliteModel->getUserIndividualBlockConfigByIndividualSrl($obj->individual_srl)->data;
}
else if($obj->target_srl)
{
$userBlockData = $oNcenterliteModel->getUserIndividualBlockConfigByTargetSrl($obj->target_srl, $member_srl)->data;
}
if($obj->individual_type == 'document')
{
$text = cut_str(getModel('document')->getDocument($obj->target_srl)->get('title'), 30);
}
else
{
$comment = getModel('comment')->getComment($obj->target_srl);
$text = cut_str($comment->get('content'), 30);
}
$args = new stdClass();
$args->member_srl = $member_srl;
$args->target_srl = $obj->target_srl;
if($obj->individual_type == 'document')
{
$args->document_srl = $obj->target_srl;
}
else
{
$args->document_srl = $comment->get('document_srl');
}
$args->individual_type = $obj->individual_type;
$args->text = $text;
if($obj->value == 'Y')
{
// 데이터가 있으면 차단, 데이터가 없으면 차단하지 않기 때문에 따로 업데이트를 하지 않는다.
if(!$userBlockData)
{
$args->individual_srl = getNextSequence();
$output = executeQuery('ncenterlite.insertIndividualBlock', $args);
if(!$output->toBool())
{
return $output;
}
}
else
{
$args->individual_srl = $userBlockData->individual_srl;
}
}
else
{
$args->individual_srl = $obj->individual_srl;
$output = executeQuery('ncenterlite.deleteIndividualBlock', $args);
if(!$output->toBool())
{
return $output;
}
}
$this->setMessage('success_updated');
if (Context::get('success_return_url'))
{
$this->setRedirectUrl(Context::get('success_return_url'));
}
else
{
$this->setRedirectUrl(getNotEncodedUrl('act', 'dispNcenterliteIndividualBlockList', 'member_srl', $member_srl));
}
}
function triggerAfterDeleteMember($obj)
{

View file

@ -669,4 +669,28 @@ class ncenterliteModel extends ncenterlite
return $output->data;
}
function getUserIndividualBlockConfigByIndividualSrl($individual_srl = 0)
{
$args = new stdClass();
$args->individual_srl = $individual_srl;
$output = executeQuery('ncenterlite.getUserIndividualBlockConfigByIndividualSrl', $args);
return $output;
}
function getUserIndividualBlockConfigByTargetSrl($target_srl = 0, $member_srl = null)
{
if(!$member_srl)
{
$member_srl = $this->user->member_srl;
}
$args = new stdClass();
$args->target_srl = $target_srl;
$args->member_srl = $member_srl;
$output = executeQuery('ncenterlite.getUserIndividualBlockConfigByTargetSrl', $args);
return $output;
}
}

View file

@ -71,4 +71,113 @@ class ncenterliteView extends ncenterlite
Context::set('user_config', $output->data);
$this->setTemplateFile('userconfig');
}
function dispNcenterliteIndividualBlockList()
{
/** @var ncenterliteModel $oNcenterliteModel */
$oNcenterliteModel = getModel('ncenterlite');
$config = $oNcenterliteModel->getConfig();
if($config->individual_block !== 'Y')
{
throw new Rhymix\Framework\Exception('msg_individual_block_not_support');
}
if(!Rhymix\Framework\Session::getMemberSrl())
{
throw new Rhymix\Framework\Exception('ncenterlite_stop_login_required');
}
$member_srl = Context::get('member_srl');
if(!$member_srl)
{
$member_srl = $this->user->member_srl;
}
$args = new stdClass();
$args->page = Context::get('page');
$args->list_count = '20';
$args->page_count = '10';
$args->member_srl = $member_srl;
$output = executeQuery('ncenterlite.getIndividualBlockList', $args);
Context::set('total_count', $output->page_navigation->total_count);
Context::set('total_page', $output->page_navigation->total_page);
Context::set('page', $output->page);
Context::set('individual_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
$this->setTemplateFile('individualList');
}
function dispNcenterliteInsertIndividualBlock()
{
/** @var ncenterliteModel $oNcenterliteModel */
$oNcenterliteModel = getModel('ncenterlite');
$target_srl = Context::get('target_srl');
$individual_srl = Context::get('individual_srl');
$individual_type = Context::get('individual_type');
$member_srl = Context::get('member_srl');
if($individual_srl)
{
$output = $oNcenterliteModel->getUserIndividualBlockConfigByIndividualSrl($individual_srl);
}
else
{
$output = $oNcenterliteModel->getUserIndividualBlockConfigByTargetSrl($target_srl, $member_srl);
}
if((!$target_srl || !$individual_type) && !$output->data)
{
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
if($individual_type == 'document')
{
$text = getModel('document')->getDocument($target_srl)->get('title');
$type = '문서';
if(!$text)
{
$text = getModel('comment')->getComment($target_srl)->get('content');
if(!$text)
{
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
else
{
Context::set('individual_type', 'comment');
$type = '댓글';
}
}
}
else
{
$text = getModel('comment')->getComment($target_srl)->get('content');
$type = '댓글';
if(!$text)
{
$text = getModel('document')->getDocument($target_srl)->get('title');
if(!$text)
{
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
else
{
Context::set('individual_type', 'document');
$type = '문서';
}
}
}
Context::set('individualData', $output->data);
Context::set('text', $text);
Context::set('type', $type);
$this->setTemplateFile('individualBlock');
}
}

View file

@ -0,0 +1,8 @@
<query id="deleteIndividualBlock" action="delete">
<tables>
<table name="ncenterlite_block_individual" />
</tables>
<conditions>
<condition operation="equal" column="individual_srl" var="individual_srl" notnull="notnull" filter="number" />
</conditions>
</query>

View file

@ -0,0 +1,19 @@
<query id="getIndividualBlockList" action="select">
<tables>
<table name="ncenterlite_block_individual" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="member_srl" var="member_srl" filter="number" notnull="notnull" />
</conditions>
<navigation>
<index default="individual_srl" var="list_order" order="desc" />
<list_count var="list_count" default="5" />
<page_count var="page_count" default="2" />
<page var="page" default="1" />
</navigation>
</query>

View file

@ -0,0 +1,13 @@
<query id="getUserIndividualBlockConfigByIndividualSrl" action="select">
<tables>
<table name="ncenterlite_block_individual" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="individual_srl" var="individual_srl" filter="number" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,14 @@
<query id="getUserIndividualBlockConfigByTargetSrl" action="select">
<tables>
<table name="ncenterlite_block_individual" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="target_srl" var="target_srl" filter="number" notnull="notnull" />
<condition operation="equal" column="member_srl" var="member_srl" filter="number" notnull="notnull" pipe="and" />
</conditions>
</query>

View file

@ -0,0 +1,12 @@
<query id="insertIndividualBlock" action="insert">
<tables>
<table name="ncenterlite_block_individual" />
</tables>
<columns>
<column name="individual_srl" var="individual_srl" filter="number" notnull="notnull" />
<column name="member_srl" var="member_srl" filter="number" notnull="notnull" />
<column name="target_srl" var="target_srl" filter="number" notnull="notnull" />
<column name="individual_type" var="individual_type" notnull="notnull" />
<column name="text" var="text" notnull="notnull" />
</columns>
</query>

View file

@ -0,0 +1,7 @@
<table name="ncenterlite_block_individual">
<column name="individual_srl" type="number" size="11" notnull="notnull" primary_key="primary_key" />
<column name="member_srl" type="number" size="11" notnull="notnull" index="idx_member_srl" />
<column name="text" type="text" notnull="notnull" />
<column name="target_srl" type="number" size="11" notnull="notnull" />
<column name="individual_type" type="varchar" size="10" notnull="notnull" />
</table>

View file

@ -0,0 +1,65 @@
<load target="../../../member/skins/default/css/member.css" />
<include target="../../../member/skins/default/common_header.html" />
<div class="xm">
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/ncenterlite/skins/default/individualblock/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form ruleset="insertConfig" action="./" method="post" class="form-horizontal" id="fo_ncenterlite">
<input type="hidden" name="module" value="ncenterlite" />
<input type="hidden" name="act" value="procNcenterliteInsertIndividualBlock" />
<input type="hidden" name="xe_validator_id" value="modules/ncenterlite/skins/default/individualblock/1" />
<!--@if($individualData)-->
<input type="hidden" name="target_srl" value="{$individualData->target_srl}" />
<input type="hidden" name="individual_srl" value="{$individualData->individual_srl}" />
<input type="hidden" name="individual_type" value="{$individualData->individual_type}" />
<!--@else-->
<input type="hidden" name="target_srl" value="{$target_srl}" />
<input type="hidden" name="individual_srl" value="{$individual_srl}" />
<input type="hidden" name="individual_type" value="{$individual_type}" />
<!--@end-->
<section class="section">
<div class="control-group">
<label class="control-label">글 종류</label>
<div class="controls">
<p>
{$type}
</p>
</div>
</div>
<div class="control-group">
<label class="control-label">내용</label>
<div class="controls">
<p>
<!--@if($individualData)-->
{$individualData->text}
<!--@else-->
{$text}
<!--@end-->
</p>
</div>
</div>
<div class="control-group">
<label class="control-label">{$lang->this_message_block}</label>
<div class="controls">
<label class="inline">
<input type="radio" name="value" value="Y" checked="checked"|cond="$individualData->value != 'N'" /> {$lang->ncenterlite_to_block}
</label>
<label class="inline">
<input type="radio" name="value" value="N" checked="checked"|cond="$individualData->value == 'N'" /> {$lang->ncenterlite_unblock}
</label>
<p>{$lang->about_this_message_block}</p>
</div>
</div>
</section>
<div class="clearfix btnArea">
<div class="pull-right">
<button class="btn btn-primary" type="submit">{$lang->cmd_registration}</button>
</div>
</div>
</form>
</div>
<include target="../../../member/skins/default/common_footer.html" />

View file

@ -0,0 +1,59 @@
<include target="../../../member/skins/default/common_header.html" />
<table class="table table-striped table-hover" style="margin-top:20px;">
<thead class="bg_f_f9">
<tr>
<th scope="col">타입</th>
<th scope="col">콘텐츠</th>
<th scope="col">차단설정</th>
</tr>
</thead>
<tbody>
<!--@foreach($individual_list as $no => $val)-->
<tr>
<td>
<!--@if($val->individual_type == 'document')-->
<span>문서</span>
<!--@else-->
<span>댓글</span>
<!--@end-->
</td>
<td>
<!--@if($val->individual_type == 'document')-->
<a href="{getUrl('', 'document_srl', $val->target_url)}">{$val->text}</a>
<!--@else-->
<a href="{getUrl('', 'document_srl', $val->document_srl)}#{$val->target_srl}">{$val->text}</a>
<!--@end-->
</td>
<td>
<form action="./" method="post">
<fieldset>
<input type="hidden" name="module" value="ncenterlite" />
<input type="hidden" name="act" value="procNcenterliteInsertIndividualBlock" />
<input type="hidden" name="target_srl" value="{$val->target_srl}" />
<input type="hidden" name="individual_type" value="{$val->individual_type}" />
<input type="hidden" name="individual_srl" value="{$val->individual_srl}" />
<select name="value" style="width:75px;">
<option value="Y">{$lang->ncenterlite_to_block}</option>
<option value="N">{$lang->ncenterlite_unblock}</option>
</select>
<button type="submit" class="x_btn">{$lang->cmd_setup}</button>
</fieldset>
</form>
</td>
</tr>
<!--@endforeach-->
</tbody>
</table>
<div class="pagination pagination-centered">
<ul>
<li><a href="{getUrl('page','')}" class="direction">&laquo; {$lang->first_page}</a></li>
<!--@if($page_navigation)-->
<!--@while($page_no = $page_navigation->getNextPage())-->
<li class="active"|cond="$page == $page_no"><a href="{getUrl('page',$page_no)}">{$page_no}</a></li>
<!--@end-->
<!--@end-->
<li><a href="{getUrl('page',$page_navigation->last_page)}" class="direction">{$lang->last_page} &raquo;</a></li>
</ul>
</div>
<include target="../../../member/skins/default/common_footer.html" />

View file

@ -94,6 +94,18 @@
<p class="x_help-block">{$lang->about_highlight_effect}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label">개별 문서/댓글 알림 차단</label>
<div class="x_controls">
<label class="x_inline">
<input type="radio" name="individual_block" value="Y" checked="checked"|cond="$config->individual_block === 'Y'" /> {$lang->use}
</label>
<label class="x_inline">
<input type="radio" name="individual_block" value="N" checked="checked"|cond="$config->individual_block !== 'Y'" /> {$lang->notuse}
</label>
<p class="x_help-block">{$lang->about_highlight_effect}</p>
</div>
</div>
</section>
<div class="x_clearfix btnArea">
<div class="x_pull-right">