트랙백 모듈을 손보고 있는 중인데요.

사이트 내부에서만 트랙백이 이뤄지도록 하고, 입력된 url로부터 타겟 문서번호를 추출하려고 합니다.

(나중에 타겟 문서번호를 통해 역링크 목록을 만들어보려구요)

암튼 아래와 같이 타겟 문서번호를 빼는 데 성공은 했는데, 약간 노가다 느낌이 나서....
간단한 함수나 간결한 방법이 없을까 해서 질문 남겨봅니다.

 

$obj = new stdClass();
$obj->document_srl = $document_srl;
$obj->url = $trackback_url;

$is_internal_document = false;
if ( Rhymix\Framework\URL::isInternalURL($trackback_url) )
{
    $url_info = parse_url($trackback_url);
    $path = $url_info['path'];
    $query = $url_info['query'];
    if ( isset($path) && strlen($path) > 1 && $path !== '/index.php' )
    {
        preg_match('/\/(\d+)/', $path, $match);
        if ( $match && $match[1] )
        {
            $trackback_target_srl = $match[1];
        }
    }
    else if ( isset($query) && preg_match('document_srl', $query) )
    {
        preg_match('document_srl=(\d+)/', $query, $match);
        if ( $match && $match[1] )
        {
            $trackback_target_srl = $match[1];
        }
    }

    if ( $trackback_target_srl )
    {
        $oDocument = DocumentModel::getDocument($trackback_target_srl);
        if ( $oDocument->isExists() )
        {
            $obj->trackback_target_srl = $trackback_target_srl;
            $is_internal_document = true;
        }
    }
}

 

  • profile

    $rewrite_level = Rhymix\Framework\Router::getRewriteLevel();

    $result = Rhymix\Framework\Router::parseUrl('GET', 'board/1234', $rewrite_level);

    $result->args를 뜯어보세요. 필요한 정보 다 나옵니다.^^

     

    이 때 넘기는 URL은 앞에 슬래시가 없는 RX_REQUEST_URL과 같은 형태여야 합니다.

    즉, URL의 path에서 맨 앞에 RX_BASEURL과 일치하는 부분은 제거하세요.

  • profile profile
    자려고 누웠는데 다시 일어나고 싶네요ㅋㅋㅋ
    내일 한번 시도해보겠습니다!
  • profile profile

    덕분에 잘 처리했습니다 :)

    37줄을 24줄로요ㅋㅋㅋㅋ

    Router::parseUrl 진짜 좋네요. act까지 다 잡아줘요ㄷㄷㄷ

    $obj = new stdClass();
    $obj->document_srl = $document_srl;
    $obj->url = $trackback_url;
    
    $is_internal_document = false;
    if ( Rhymix\Framework\URL::isInternalURL($trackback_url) )
    {
        $trackback_request_url = preg_replace('/^https?:\/\/[^\/]+\//', '', $trackback_url);
        $rewrite_level = Rhymix\Framework\Router::getRewriteLevel();
        $result = Rhymix\Framework\Router::parseUrl('GET', $trackback_request_url, $rewrite_level);
        if ( is_array($result->args) && !empty($result->args) && $result->args['document_srl'] )
        {
            $trackback_target_srl = $result->args['document_srl'];
        }
        if ( $trackback_target_srl )
        {
            $oDocument = DocumentModel::getDocument($trackback_target_srl);
            if ( $oDocument->isExists() )
            {
                $obj->trackback_target_srl = $trackback_target_srl;
                $is_internal_document = true;
            }
        }
    }

     

  • profile profile
    코어에서 짧은주소 해석하는 것과 100% 동일한 방식이므로
    게시판 이외의 모듈에서 꽤 복잡한 구조의 짧은주소를 선언하여 사용하더라도 항상 정확하게 나옵니다.

    단, 라이믹스를 서브폴더에 설치한 경우 $trackback_request_url이 이상하게 들어갈 수 있겠네요.
    parse_url() 함수로 도메인을 제외한 path만 추출한 후, RX_BASEURL 길이만큼 앞을 잘라서 써 보세요.

    11줄의 세 가지 조건은 isset($result->args['document_srl']) 하나로 압축할 수 있습니다.
    그리고 11줄의 조건을 충족하지 못하면 $trackback_target_srl 변수가 아예 선언되지 않아서
    PHP 최신버전에서는 15줄의 조건문이 워닝을 뿜을 것 같네요.^^
  • profile profile

    꼼꼼하게 리뷰해주셔서 감개무량입니다 :D

    별도 폴더 설치는 늘 까먹게 되더라구요.

    그냥 별도 폴더에 코어 설치해서 습작을 하는 게 낫겠다는 생각도 듭니다;;; ㅎㅎ

     

    다음과 같이 정리했습니다.

    $obj = new stdClass();
    $obj->document_srl = $document_srl;
    $obj->url = $trackback_url;
    
    $trackback_target_srl = '';
    $is_internal_document = false;
    if ( Rhymix\Framework\URL::isInternalURL($trackback_url) )
    {
        $host = parse_url($trackback_url, PHP_URL_HOST);
        $_length = strlen(RX_BASEURL);
        $rewrite_level = Rhymix\Framework\Router::getRewriteLevel();
    
        $trackback_request_url = preg_replace('/^https?:\/\//', '', $trackback_url);
        $trackback_request_url = str_replace($host, '', $trackback_request_url);
        $trackback_request_url = substr($trackback_request_url, $_length);
        $result = Rhymix\Framework\Router::parseUrl('GET', $trackback_request_url, $rewrite_level);
    
        if ( isset($result->args['document_srl']) )
        {
            $trackback_target_srl = $result->args['document_srl'];
        }
        if ( $trackback_target_srl )
        {
            $oDocument = DocumentModel::getDocument($trackback_target_srl);
            if ( $oDocument->isExists() )
            {
                $obj->trackback_target_srl = $trackback_target_srl;
                $is_internal_document = true;
            }
        }
    }

     

  • profile profile
    host를 추출하기를 원하신 건 아닐 텐데요... ㅎㅎ
  • profile profile

    역시 그냥 서브 폴더에 코어가 설치되어 있을 때도 parse_url($trackback_url, PHP_URL_PATH)로 하고, strlen(RX_BASEURL) 만큼 잘라주면 되는 건가요?
    서브 폴더에 코어가 설치되어 있을 때 주소를 어떤 식으로 파싱하거나 인식하는지를 잘 몰라서...

    제가 뭔가 잘못 이해했나봅니다;;

  • profile profile
    parse_url로 path를 추출하셨다면 무조건 앞에서 RX_BASEURL을 잘라주시면 됩니다.
  • profile profile
    네, 알겠습니다!!
  • profile

    https://xetown.com/questions/1711266#comment_1711354

    위의 댓글 링크의 코드에 잘못된 부분이 있어서 재정리합니다;;;;

    $obj = new stdClass();
    $obj->document_srl = $document_srl;
    $obj->url = $trackback_url;
    
    $trackback_target_srl = '';
    $is_internal_document = false;
    if ( Rhymix\Framework\URL::isInternalURL($trackback_url) )
    {
        $_length = strlen(RX_BASEURL);
        $rewrite_level = Rhymix\Framework\Router::getRewriteLevel();
    
        $_trackback_url = parse_url($trackback_url, PHP_URL_PATH);
        $_trackback_url = substr($_trackback_url, $_length);
        $result = Rhymix\Framework\Router::parseUrl('GET', $_trackback_url, $rewrite_level);
    
        if ( isset($result->args['document_srl']) )
        {
            $trackback_target_srl = $result->args['document_srl'];
        }
        if ( $trackback_target_srl )
        {
            $oDocument = DocumentModel::getDocument($trackback_target_srl);
            if ( $oDocument->isExists() )
            {
                $obj->trackback_target_srl = $trackback_target_srl;
                $is_internal_document = true;
            }
        }
    }