모듈 조건문에 대해 질문하고싶습니다.
CMS/프레임워크 | XE 1.x |
---|---|
개발 언어 | PHP 7.1 |
현재 댓글에 레벨 제한을 두려고 코멘트 모듈을 수정중입니다.
특정 게시판에서만 적용시키려고 srl 을 통해 구분을 지었는데..
관리자 / 글작성자도 레벨 제한이 안되면 댓글을 못달더라구요.
관리자 부분은 어떻게든 해결했는데.. 글 작성자는 어떻게 해야할지 감이 안잡히더라구요.
$module_info = Context::get("module_info");
$module_srl = $module_info->module_srl;
if (in_array($module_srl, array(모듈 srl, 모듈srl2, 모듈srl3)))
{
//로그인 정보 불러오기
$logged_info = Context::get('logged_info');
// 포인트 모듈? 불러오기
$oPointModel = &getModel('point');
// 로그인한 회원의 포인트 정보 불러오기
$point = $oPointModel->getPoint($logged_info->member_srl);
// 모듈? 불러오기
$oModuleModel = &getModel('module');
// 포인트 모듈 설정? 불러오기
$config = $oModuleModel->getModuleConfig('point');
// 회원 레벨 불러오기 (포인트에 따른 레벨 정보를 불러오는거같음)
$level = $oPointModel->getLevel($point, $config->level_step);
// 어드민은 레벨제한 없이 작성가능
$notadmin = $logged_info->is_admin!='Y';
// 본인 글에서는 레벨 제한 없이 작성가능
$oDocumentModel = &getModel('document');
$oDocument = $oDocumentModel->getDocument(member_srl);
$member_srl = $logged_info->member_srl;
if ($level<10 && $notadmin && $oDocument != $member_srl) return new Object(-1, '3레벨 미만 유저는 댓글을 작성하실 수 없습니다.');
}
$module_srl = $module_info->module_srl;
if (in_array($module_srl, array(모듈 srl, 모듈srl2, 모듈srl3)))
{
//로그인 정보 불러오기
$logged_info = Context::get('logged_info');
// 포인트 모듈? 불러오기
$oPointModel = &getModel('point');
// 로그인한 회원의 포인트 정보 불러오기
$point = $oPointModel->getPoint($logged_info->member_srl);
// 모듈? 불러오기
$oModuleModel = &getModel('module');
// 포인트 모듈 설정? 불러오기
$config = $oModuleModel->getModuleConfig('point');
// 회원 레벨 불러오기 (포인트에 따른 레벨 정보를 불러오는거같음)
$level = $oPointModel->getLevel($point, $config->level_step);
// 어드민은 레벨제한 없이 작성가능
$notadmin = $logged_info->is_admin!='Y';
// 본인 글에서는 레벨 제한 없이 작성가능
$oDocumentModel = &getModel('document');
$oDocument = $oDocumentModel->getDocument(member_srl);
$member_srl = $logged_info->member_srl;
if ($level<10 && $notadmin && $oDocument != $member_srl) return new Object(-1, '3레벨 미만 유저는 댓글을 작성하실 수 없습니다.');
}
구글에 검색을 열심히 돌려봤지만
대부분 스킨단에서 적용 하는 방법이 적혀있지 모듈 수정을 하는건 별로 없더라구요..
- 요약
본인이 작성한 글에는 댓글 레벨 제한이 걸리면 안됨
그래서
로그인한 회원 정보 != 글 작성자 회원 정보
(로그인한 회원 정보랑 글 작성자 회원 정보가 다르면 댓글 레벨 제한 걸리게 설정)
를 통해서 댓글이 작성되게 하려고 함
하지만 작동이 안됨..
글 작성자 회원 srl 만 알면 쉽게 해결될거같은데 말이죠..ㅠ
댓글 8
해당 코드가 어디에 위치해 있는지 알려주시면 거기에 들어가는 트리거 대충 유추해서 답변드리기는 쉬워질지 모르겠지만, 트리거 실행위치에 따라 다 달라요. (서드파티 모듈 답변이 그래서 어려워요)
document_srl 을 가져오는 방법을 알 수 있다면 document 을 통해서 게시글의 정보를 가져와서 ($oDocument = getModel('document')->getDocument($document_srl) <- 이런식) 해당 게시글의 member_srl 을 가져오면
if($logged_info->member_srl == $oDocument->get('member_sr'))
{
return;
}
이런식으로 처리할 순 있어요
getDocument 라는 펑션은
function getDocument($document_srl=0, $is_admin = false, $load_extra_vars=true, $columnList = array())
{
if(!$document_srl) return new documentItem();
if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl])
{
$oDocument = new documentItem($document_srl, $load_extra_vars, $columnList);
if(!$oDocument->isExists())
{
return $oDocument;
}
$GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument;
if($load_extra_vars) $this->setToAllDocumentExtraVars();
}
if($is_admin) $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->setGrant();
return $GLOBALS['XE_DOCUMENT_LIST'][$document_srl];
}
이런 코드 구조를 가졌는데 ( https://github.com/xpressengine/xe-core/blob/develop/modules/document/document.model.php#L140 )
이코드에서 제일 첫번째로 와야할 숫자가 document_srl 에 해당되는 코드여야 합니다.
341 번째 줄
function insertComment($obj, $manual_inserted = FALSE, $update_document = TRUE)
펑션에서 실행되는 겁니닷!
보통 $obj->member_srl == $oDocument->get('member_srl') 이런식으로 검사해보시면 될거같아요. $oDocument를 이미 선언한 다음 코드에서요.
$obj->member_srl (해당 펑션에서 이 코드는 댓글 작성자를 의미합니다.)
$oDocument->get('member_srl') (해당 펑션에서$oDocument가 정상적으로 만들어졋다면 이는 글 작성자를 의미합니다.)
근데 이렇게 불필요하게 코어를 수정하는 방식은 좋지 않아요.
이 부분을 추가하고
($level<10 && $notadmin && $obj->member_srl != $oDocument->get('member_srl'))
이런식으로 저건을 줬는데 제한이 안걸리고 다 작성이 가능해버려지네여..
멤버 srl을 제대로 못불러오는걸까요.. ㅠ
뭔가 도큐멘트 srl이 0으로 출력하네요..
로 확인하니.. 뭐지.. 코멘트쪽에선 애초에 게시글 정보를 못읽나요 ㄷㄷ?