Extra Form
PHP PHP 7.1
CMS XpressEngine

현재 댓글에 레벨 제한을 두려고 코멘트 모듈을 수정중입니다.

 

특정 게시판에서만 적용시키려고 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레벨 미만 유저는 댓글을 작성하실 수 없습니다.');
        } 

 

구글에 검색을 열심히 돌려봤지만 

대부분 스킨단에서 적용 하는 방법이 적혀있지 모듈 수정을 하는건 별로 없더라구요..

 

- 요약

 

본인이 작성한 글에는 댓글 레벨 제한이 걸리면 안됨

그래서

로그인한 회원 정보 != 글 작성자 회원 정보

(로그인한 회원 정보랑 글 작성자 회원 정보가 다르면 댓글 레벨 제한 걸리게 설정)

 

를 통해서 댓글이 작성되게 하려고 함

 

하지만 작동이 안됨..

 

글 작성자 회원 srl 만 알면 쉽게 해결될거같은데 말이죠..ㅠ

  • profile
    $document_srl 을 가져 올 수 있는 상황이라면 그나마 쉬운데 그 코드가 어느 펑션(메서드 function)에서 실행되는냐에 따라 달라져서 정확하게 답변 못드려요.

    해당 코드가 어디에 위치해 있는지 알려주시면 거기에 들어가는 트리거 대충 유추해서 답변드리기는 쉬워질지 모르겠지만, 트리거 실행위치에 따라 다 달라요. (서드파티 모듈 답변이 그래서 어려워요)

    document_srl 을 가져오는 방법을 알 수 있다면 document 을 통해서 게시글의 정보를 가져와서 ($oDocument = getModel('document')->getDocument($document_srl) <- 이런식) 해당 게시글의 member_srl 을 가져오면

    if($logged_info->member_srl == $oDocument->get('member_sr'))
    {
    return;
    }

    이런식으로 처리할 순 있어요
  • profile
    $oDocumentModel->getDocument(member_srl)<- 이렇게 적으셧는데 절대 성립 불가능합니다.

    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 에 해당되는 코드여야 합니다.
  • profile ?
    comment.controller.php 에 있는
    341 번째 줄

    function insertComment($obj, $manual_inserted = FALSE, $update_document = TRUE)

    펑션에서 실행되는 겁니닷!
  • ? profile

    보통 $obj->member_srl == $oDocument->get('member_srl') 이런식으로 검사해보시면 될거같아요. $oDocument를 이미 선언한 다음 코드에서요.

     

    $obj->member_srl (해당 펑션에서 이 코드는 댓글 작성자를 의미합니다.)

    $oDocument->get('member_srl') (해당 펑션에서$oDocument가 정상적으로 만들어졋다면 이는 글 작성자를 의미합니다.)

    근데 이렇게 불필요하게 코어를 수정하는 방식은 좋지 않아요.

  • profile ?
    앗.. 코어 수정 방법 말고는 레벨 제한을 두는 방법이 없을거같아서 ㅠㅠ..
  • profile ?
    $oDocument = &getModel('document')->getDocument($document_srl);

    이 부분을 추가하고

    ($level<10 && $notadmin && $obj->member_srl != $oDocument->get('member_srl'))

    이런식으로 저건을 줬는데 제한이 안걸리고 다 작성이 가능해버려지네여..

    멤버 srl을 제대로 못불러오는걸까요.. ㅠ
  • profile ?
    print_r($oDocument,true)

    뭔가 도큐멘트 srl이 0으로 출력하네요..

    로 확인하니.. 뭐지.. 코멘트쪽에선 애초에 게시글 정보를 못읽나요 ㄷㄷ?
  • ?
    어으;; 이게 넣는 위치에 따라 다른거였네요 해결했습니다 ㅠㅠ