안녕하세요,
답변/댓글을 특정 신뢰 수준이나 사용자 커스텀 필드에 따라 제한할 수 있는 방법이 있는지 궁금합니다. 저희 사용자는 다양한 멤버십 등급을 가진 상태에서 WordPress에서 이관되었습니다. 특정 멤버십 등급에 도달한 사용자에게만 답변을 볼 수 있는 권한을 부여하고, 모든 사용자에게 답변 열람 권한을 부여하지 않으려고 합니다.
안녕하세요,
답변/댓글을 특정 신뢰 수준이나 사용자 커스텀 필드에 따라 제한할 수 있는 방법이 있는지 궁금합니다. 저희 사용자는 다양한 멤버십 등급을 가진 상태에서 WordPress에서 이관되었습니다. 특정 멤버십 등급에 도달한 사용자에게만 답변을 볼 수 있는 권한을 부여하고, 모든 사용자에게 답변 열람 권한을 부여하지 않으려고 합니다.
답변을 ‘보기’ 위한 건가요, '답장’하기 위한 건가요? 꽤 다른 문제입니다.
@HAWK, 아 죄송합니다, 답글을 남기려고 했어요. 주제와 답글은 볼 수 있지만, 특정 레벨 이상이어야만 답글을 남길 수 있어야 합니다.
답변을 단순히 답글 작성 권한을 제한하는 것뿐만 아니라 실제로 숨기고 싶다면 어떻게 해야 하나요? ‘보기’ 열이 회색으로 표시되어 있습니다.
죄송합니다만, 그렇게 할 수 없습니다.
사용자 정의 플러그인으로 가능할까요? 현재 사용자를 읽고 JavaScript로 답변 섹션 전체를 숨기는 건 그리 어렵지 않을 것 같은데요?
죄송합니다, 제 말이 잘못되었네요. 기본 상태에서는 불가능합니다. 하지만 커스텀 플러그인을 사용하면 거의 모든 것이 가능합니다!
커스텀 플러그인을 통해 이 작업을 수행하려고 하고 있습니다. postsToRender 변수를 오버라이드하여 편집하는 방식으로 거의 성공한 것 같습니다.
TopicRoute.reopen({
setupController(controller, model) {
this._super(controller, model);
topicController = controller;
console.log(topicController);
let userPrivileged = userCanViewAnswers(topicController.currentUser);
const postStream = topicController.get("model.postStream");
window.postStream = postStream;
window.topicController = topicController;
topicController.postsToRender = userPrivileged ? topicController.postsToRender : topicController.postsToRender.posts.filter(p=>p.post_number == 1);
}
});
function userCanViewAnswers(user){
let user_groups = user.groups.map(g => g.name);
return user_groups.includes('privileged');
}
페이지를 강제 새로고침하거나 홈 페이지로 돌아간 후 다시 진입할 때, 잠시 “not found” 오류가 표시된 뒤 올바르게 다시 로드되는 것 같습니다.
저는 MacOS Docker 개발 이미지를 사용 중인데, 다소 느립니다.
죄송합니다. 아직 discourse 코드베이스에 익숙하지 않습니다.
토픽 로드 시 게시물을 가로채는 더 나은 방법이 있을까요?
컨트롤러를 다시 열어야 했다는 것을 알았습니다.
TopicController.reopen({
@discourseComputed(
"model.postStream.posts",
"model.postStream.postsWithPlaceholders"
)
postsToRender(posts,postsWithPlaceholders ){
let userPrivileged = userCanViewAnswers(this.currentUser);
return userPrivileged
? (this.capabilities.isAndroid ? posts : postsWithPlaceholders)
: (this.capabilities.isAndroid ? posts.slice(0, 1) : postsWithPlaceholders.slice(0, 1));
}
})