질문/조언질답게시판
Extra Form
PHP PHP 7.4
CMS Rhymix 2.x

태그 연관글 애드온과 SNS 공유 시 문서 불러오는 문제입니다.

 

사용 애드온

1. tag_relation (혹은 rxp_tag_relation)

2. xns_addon_insert_sns_share

 

이 둘을 함께 사용했을 때 SNS 공유 시 tag_relation 에서 표시한 가장 마지막 글을 불러옵니다. 

즉, 해당 문서를 불러와 공유하는 것이 아니라 연관글의 마지막 글이 공유되어 버립니다

 

코알못이지만

tag_relation 의 마지막 문서 document 번호가 어디 변수(?)에 남아 xns_ 애드온이 이걸 불러오는 게 아닌가 하는 추측을 해 봅니다.

 

xns_ 애드온에서는

$item_url = getFullUrl('','document_srl',$oDocument->document_srl);

 

이렇게 문서 정보를 불러오는 것 같습니다.

 

어떻게 해결해야 할지 도움 주시면 감사 드리겠습니다.

 

 

 

TAG •
  • profile

    sns 공유 애드온에서 

     

    //$oDocument = Context::get('oDocument')

    위 코드주석하고 아래것으로 바꿔보세요.

     

    if(!Context::get('document_srl')) return;
    $document_srl = Context::get('document_srl');
    $oDocumentModel = getModel('document');
    $oDocument = $oDocumentModel->getDocument($document_srl);

     

    RXP 태그 연관글 애드온 다른 오류도 있고 애로점이 있네요.....

  • profile profile
    이것으로 땜빵은 가능하겠지만... 근본적인 원인은 태그 연관글 애드온이 $oDocument 변수에 엉뚱한 것을 집어넣고 있다는 것이니, 가능하면 태그 연관글 애드온에서 다른 변수명을 사용하도록 일괄변환하는 것이 더 확실하겠습니다.
  • profile profile
    네. 그런거 같긴한데 태그연관글 애드온을 열어봐야할지... 열어봐야겠죠.........
  • profile profile

    참고로 라이믹스 2.0 기준
        $oDocumentModel = getModel('document');
        $oDocument = $oDocumentModel->getDocument($document_srl);
    이 코드는
        $oDocument = DocumentModel::getDocument($document_srl);
    로 축약할 수 있습니다.^^

  • profile profile
    어느 쪽을 수정하든 어딘가 한 군데는 열어봐야겠죠... ㅠ
  • profile profile
    네. 원인은 태그연관글 애드온이라고 짐작은 했고 땜빵하는 곳을 열어봤어요 ㅜㅜ
  • profile profile

    너무나 감사합니다.
    기진곰님 말씀처럼 근본적인 게 해결되면 좋겠지만, 제 수준에서는 이것도 감지덕지입니다.
    웹지기님은 거의 개발자시네요.^^

  • profile profile
    태그 연관글 애드온 스킨의 $oDocument 가 문제인 듯 합니다.

    해당 스킨에서 loop 돌면서 마지막 대상글이 잡히는 문제....
  • profile profile

    아래 댓글에 적었듯이 태그연관글 애드온 스킨(index.html)에 등장하는 $oDocument 를 다른 문자열로 적당히 모두 동일하게 바꿔보세요. 물론 이게 맞는 수정인지는 저도 확신있게 답변드리기 어려우나... 해보니 원래 있던 문제는 사라지는 듯 합니다.

  • profile profile
    네 그렇지 않아도 앞 댓글 주신 내용 참고해서 $oDocument 를 $oDocument_relation 이런식으로 모두 교체했더니 정상적으로 작동합니다.
    변수에 이런 생각지도 못한 오류를 일으키는 군요..
    오늘도 정말 많이 배웠습니다.
    감사합니다.
  • profile
    태그 연관글의 경우 해당 태그와 연관된 게시글을 다시 찾아주는 역할 하므로 oDocument 변수를 덮어 씌우는 경향이 있을 수 있겠네요..

    보통 이런경우 윗분처럼 처리하거나 태그연관글에서 $oDocument 변수나 Context::set('oDocument', $oDocument); 로 처리된 부분을 다른 형태로 변환시켜준다면, sns 공유애드온에서 처리될 내용이 변경되지 않습니다.

    윗분 답변처럼 Context::get('document_srl') 을 우선으로 가져온다 하더라도 만약 태그 애드온에서 $document_srl 변수를 덮어 씌운 내역이 있다면 문제가 될 수도 있고요.

    즉 실행 위치에 따라 tag 연관글이 먼저 실행되고 그다음 xns 애드온이 실행되는데, tag_에 해당되는 애드온의 모든 변수명을 $tag_ 으로 시작, Context::set( 하는 부분도 모두 tag_ 라는 접미사로 시작한다면 문제 없을 거예요. Context::get( 으로 XE의 고유 정보를 가져오는 부분 빼고 변수 선언하는 부분에만 접미사 쓰도록 하면, 보통 다음 다른 애드온에 영향을 주지 않습니다.

    애드온은 실행 방식이 굉장히 단순한 방식이라 잘못 사용한다면 무조건 위와 같이 에러가 발생되는게 '정상'인 경우가 많아 사용에 '주의'가 필요합니다.
  • profile profile
    넵, 조언 감사합니다.
    다른 애드온이나 위젯 등에 영향을 줄 수 있으므로 그런 점을 고려해야 하는 거겠네요.
  • profile profile
    애드온은 위젯에는 영향을 왼만해선 안줍니다. 애드온끼리, 혹은 모듈 실행되는 부분의 실행시점에 있는것은 모듈에 영향을 가장 많이 줍니다..
  • profile profile
    // 모듈 제목 구함
    $module_title = array();
    if ($addon_info['print_module_title'] == 'Y') {
    foreach ($documents as &$oDocument) {
    if (!$module_title[$oDocument->get('module_srl')]) {
    $args = new stdClass();
    $args->module_srl = $oDocument->get('module_srl');
    $output = executeQuery('module.getMidInfo', $args);
    if (!$output->data) {
    continue;
    }

    $module_title[$oDocument->get('module_srl')] = $output->data->browser_title;
    }
    $oDocument->add('module_title', $module_title[$oDocument->get('module_srl')]);
    }
    }

    if ($oCacheHandler->isSupport()) {
    $oCacheHandler->put($cache_key, $documents, 900);
    }

    return $documents;



    마지막 부분에 위부분이 영향을 주는 듯 합니다.

    이게 스킨에서도
    <[email protected]($rxp_tag_related_document_list as $oDocument)-->

    등장해서

    날도 덮고 머리도 안돌고....

    나중에 파보던지..... 해야겠습니다.
  • profile profile
    태그가 먼저 실행될때 태그에서 사용되는 PHP파일은 모두 실행되므로 따로 함수 ( function 으로시작하는 코드들) 을 제외하고 PHP최상위단에 class선언도 없이 작성된 코드는 다음 PHP파일에 영향을 줍니다.
  • profile profile
    태그 연관글 애드온 스킨이 범인인 듯 합니다.

    스킨에 등장하는 $oDocument 를 모두 다른 string 으로 바꾸니 문제가 사라지는 듯 하네요.
  • profile profile
    넵 질문에서 언급하신 부분을 본다면 ㅎㅎ 그 부분에 영향이 있을지도요 ㅎㅎ

    애드온은 사용하실때 최대한 변수명을 독단적으로 사용하시는게 좋습니다.
  • profile profile

    네. 믿고있던 분??? 이 제작한 애드온이라 뭐 문제가 없을 줄...... 변수사용에 주의를 할 필요가 있는데 제작자분들이 그냥 무시하시는거 같아요. 솔직히 지금 들여다보고 거기에 왜 $oDocument 를 썼는지 살짝 이해가 안가긴 합니다.

  • profile profile
    보통은 documentItem 을 가져오는 경우이니 o< 오브젝트인 Document 문서이다 라는 느낌으로 사용합니다.

    $oModuleModel = 이라고 하는것도 o는 앞의 object를 한글자로 줄인거거든요.

    getModel('document')->getDocument 으로 불러오는 document 는 무조건 object으로 구성된 document 이니 그렇게 쓰는 것인데 애드온에서 스킨단에서까지 영향이 있을줄이야죠 뭐 ㅎㅎㅎ

    결국은 스킨에서 선언한 것이 Context::set 을 선언한 효과가 있어서 다음 애드온에 영향이 있는걸지도요 ㅎㅎ

    어찌되었던 애드온은 하나하나 PHP를 쭉 길게 쓴것과 같다고 생각하여 작성되어야 하기 때문에 명확하게 다른 기능을 한다면 무조건 다른 변수명을 쓰는게 좋습니다.

    https://github.com/rhymix/rhymix/blob/a6ace52c9e25047f966eb83253526215936029b1/classes/module/ModuleObject.class.php#L631