스크랩 관련 변수 질문드립니다.
CMS/프레임워크 | Rhymix 2.0 |
---|---|
개발 언어 | PHP 7.4 |
문제 페이지 주소 | 비공개 (작성 후 5일 경과) |
안녕하세요! 다들 안전하게 잘 지내고 계신가요 ㅎㅎ
오랜만에 질문글을 남겨봅니다.
현재 사용하고있는 slow 게시판 스킨에서
스크랩 버튼을 클릭해서 스크랩을 했을때 별도의 체크된 마크없이 전/후가 동일한 상태로 나오고있습니다.
스킨단에서 cond에 $is_logged 뿐만아니라 스크랩을 했을때라는 조건을 넣어주면 될거같은데 어떤변수로 넣어봐야할지 질문드립니다.
{@ // 스크랩 }
<button class="app-icon-button app-icon-button-gray" cond="$is_logged" onclick="doCallModuleAction('member','procMemberScrapDocument',{$document_srl})" title="스크랩">
<ion-icon name="bookmark-outline"></ion-icon>
</button>
읽어주셔서 감사합니다.
karius
Lv. 4
댓글 37
직접 해본 건 아니어서 확신까지는 없지만ㅜ
아래와 같이 해서
$is_scrapped = 0;
if ( $is_logged ):
$args = new stdClass();
$args->member_srl = $logged_info->member_srl;
$args->document_srl = $document_srl;
$is_scrapped = executeQuery('member.getScrapDocument', $args)->data->count;
endif;
}
$is_scrapped 또는 $is_scrapped > 0 으로 판별해볼 수 있을 것 같습니다.
<button class="app-icon-button app-icon-button-gray" cond="$is_logged&&is_scrapped>0" onclick="doCallModuleAction('member','procMemberScrapDocument',{$document_srl})" title="스크랩">
<ion-icon name="bookmark-outline"></ion-icon>
</button>
{@ // 스크랩 됐을때}
<button class="app-icon-button app-icon-button-gray" cond="$is_logged&&is_scrapped" onclick="doCallModuleAction('member','procMemberScrapDocument',{$document_srl})" title="스크랩">
<ion-icon name="bookmark-outline"></ion-icon>
</button>
이런식으로 적어도 될까요??
추가로.. 스크랩취소버튼의경우 onclick도 수정해야될거같은데..어떻게해야할까요 ㅠㅠ
상단에
{@
$is_scrapped = 0;
if ( $is_logged ):
$args = new stdClass();
$args->member_srl = $logged_info->member_srl;
$args->document_srl = $document_srl;
$is_scrapped = executeQuery('member.getScrapDocument', $args)->data->count;
endif;
}
위 코드 넣으시고
스크랩 부분을
<!--@if($is_scrapped>0)-->
스크랩 됐을때
<!--@else-->
스크랩 안됐을떄
<!--@end-->
이런식으로 넣으시면 될거 같네요
테스트 해보니 잘 되네요
혹시.. 스크랩이 됐을때 동작하는 onclick="doCallModuleAction('member','procMemberScrapDocument',{$document_srl}) 에서 스크랩을 취소할때는 어떤 항목을 변경해야하는지도 질문드려도 될까요??
<script>
function doDeleteScrap(document_srl) {
var params = new Array();
params['document_srl'] = document_srl;
exec_xml('member', 'procMemberDeleteScrap', params, function() { location.reload(); });
}
</script>
넣으시고
onclick="doDeleteScrap({$val->document_srl});return false;"
요골로 바꿔보시겠어요?
$scrap_action에 중괄호가 있어야 할 것 같네요.
onclick="doCallModuleAction('member',{$scrap_action},{$document_srl})"
회원 페이지에 스크랩 삭제 부분 그대로 가져와서 문제가 있었나 보네요ㅜ
저한테 한말이 아니셨군요ㅋㅋ
{@
$is_scrapped = 0;
$args = new stdClass();
$args->member_srl = $logged_info->member_srl;
$args->document_srl = $document_srl;
$is_scrapped = executeQuery('member.getScrapDocument', $args)->data->count;
$scrap_action = ($is_scrapped > 0) ? 'procMemberDeleteScrap' : 'procMemberScrapDocument';
}
<button class="app-icon-button app-icon-button-gray" onclick="doCallModuleAction('member',$scrap_action,{$document_srl})" title="스크랩">
<ion-icon name="bookmark-outline"></ion-icon>
<!--@endif-->
액션을 바꾸는 게 목적이었나보군요.
그럼 왠지 이런 걸로도 될 것 같은데, 만약 안 된다면 유니짱님 답변처럼 하시면 될 것 같아요.
쿼리할 때 $args를 따로 선언할 필요 없이 그냥 배열을 전달해도 됩니다.
삼항식을 사용하면 결과가 없는 경우 기본값 0으로 처리하는 것까지 한 방에 가능!
$is_scrapped = executeQuery('member.getScrapDocument', [
'member_srl' => $this->user->member_srl,
'document_srl' => $document_srl,
])->data->count ? 1 : 0;
endif;
라이믹스에서 활용할 수 있는 모든 문법을 총동원해 보았습니다.^^
템플릿 html에서 $this->user로 $logged_info가 호환되는 겁니까?
배열로 넘기는 방법이 있었다니... 그냥 사실상 한 줄로 끝나버리네요ㄷㄷㄷ
https://github.com/rhymix/rhymix/blob/master/common/framework/helpers/sessionhelper.php
https://github.com/rhymix/rhymix/pull/1332
일단 부딪치면서 헤매봐야겠습니다ㅡㅜ
깔끔하게 사용할 수 있으니 마구마구 활용하십쇼~
원하는 기능은 구현되셨나요?
기록 차원에서 최종 정리하면 이렇게 될 것 같습니다.
{@
$scrap_action = executeQuery('member.getScrapDocument', [
'member_srl' => $this->user->member_srl,
'document_srl' => $document_srl,
])->data->count ? 'procMemberDeleteScrap' : 'procMemberScrapDocument';
}
<button class="app-icon-button app-icon-button-gray" onclick="doCallModuleAction('member',{$scrap_action},{$document_srl})" title="스크랩">
<ion-icon name="bookmark-outline"></ion-icon>
<!--@endif-->
항상 감사드립니다 바로 시도해보겠습니다!
뭘해도 맨날 이렇게 실수가ㅡㅡ;;;
스크랩하기가 안 되나요? 스크랩 취소가 안 되나요? 아니면 둘 다 안 되나요?
이쪽말씀하시는게 맞으실까요??
코드는 주신부분에서 button만추가했습니다
onclick="doCallModuleAction('member','{$scrap_action}',{$document_srl})"
으로 해보시죠.
등록된 상태에서 스크랩 취소(?) 버튼을 누르게 되면 잘못된 요청입니다가 나오게되네요 ㅠㅠ
https://github.com/rhymix/rhymix/blob/922025ae8ed5de58dd75d1cac20494eb25153f23/modules/member/member.controller.php#L250
윗 부분에 보이는 ./modules/member/member.controller.php 파일의 250행을 아래와 같이 바꿔줘야 할 것 같습니다.
$document_srl = (int) (Context::get('document_srl') ?: Context::get('target_srl'));
코어 살짝 수정해보시고요..
잘 되는 게 확인되면 이건 깃허브에 이슈로 남겨야겠네요.
2022년 현재 어떤 자료에서도 doCallModuleAction에 의존할 필요는 없습니다.
앗 코어에서의 target_srl 지원은 사전 차단 당한 겁니까ㅜㅜㅜ
질문글에 답변 달다가 일이 또 커지네요ㅎㅎ
네 ㅎㅎ 한 번 봐주면 앞으로 코어에서 제공하는 모든 액션의 모든 변수명이 target_srl로 통일되어 버릴 것 같아서요. 훨씬 강력한 대안을 버려두고 doCallModuleAction을 고집하시면 앞으로는 콘솔에 deprecated 워닝이라도 찍히도록 해야겠네요.
저 말고도 서드파티 개발자분들 모두 생각해볼 만한 부분이겠네요.
"doCallModuleAction보다는 exec_json으로 직접 document_srl이나 comment_srl을 쓰라"
중요체크!
사용하시는 스킨에서 기존의 문서 스크랩 기능이 새로고침 없이 작동했나요?
암튼 새로고침이 이뤄진다는 전제에서 여태까지의 논점을 종합하면ㅜ 이렇게 될 것 같습니다.
본문 중 스크랩 부분에
{@
$scrap_action = executeQuery('member.getScrapDocument', [
'member_srl' => $this->user->member_srl,
'document_srl' => $document_srl,
])->data->count ? 'procMemberDeleteScrap' : 'procMemberScrapDocument';
}
<button class="app-icon-button app-icon-button-gray" onclick="doScrapAction('{$scrap_action}', {$document_srl}); return false;" title="스크랩">
<ion-icon name="bookmark-outline"></ion-icon>
</button>
<!--@endif-->
그리고 본문 말미에
<script>
function doScrapAction(scrap_action, document_srl) {
var params = {
document_srl: document_srl
};
exec_json('member.' + scrap_action, params, function(ret_obj) {
if ( ret_obj.message !== 'success' ) {
alert(ret_obj.message);
}
location.reload();
});
}
</script>
<!--@endif-->
기존에는 스크랩할때는 새로고침하면서 적용됐었습니다!
말씀해주신 코어수정후에는 스크랩 취소도 잘되는 상황입니다.
다만, 스크랩취소시 메시지가 나오지않는데 이건 본문말미에 적어주신 스크립트쪽에 alert 메시지로 넣으면 되는걸까요??
스크랩 취소는 반환되는 변수가 없나보네요.
그동안 스크랩 취소 기능이 코어에서 큰 관심을 못 받아서 그런가봐요.
scrap_action에 담긴 값을 기준으로 구분하면 될 것 같아요.
if (scrap_action==='procMemberDeleteScrap') {
alert('스크랩을 취소했습니다');
} else {
if ( ret_obj.message !== 'success' ) {
alert(ret_obj.message);
}
}
바쁘신 와중에도 시간들여서 이것저것 확인해주시고 정말감사드립니다 ㅠㅠ