Q&A

라이믹스 사이트의 url로부터 document_srl을 가져오는 함수가 있나요?

2022.09.27 15:36
8,205
1
CMS/프레임워크 Rhymix 2.0
개발 언어 PHP 7.4

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

사이트 내부에서만 트랙백이 이뤄지도록 하고, 입력된 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;
        }
    }
}

 

윤삼 Lv. 19
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.

댓글 10

  • 2022.09.27 15:44 #1711269

    $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과 일치하는 부분은 제거하세요.

  • 2022.09.27 16:11 #1711276
    자려고 누웠는데 다시 일어나고 싶네요ㅋㅋㅋ
    내일 한번 시도해보겠습니다!
  • 2022.09.27 23:56 #1711312

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

    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;
            }
        }
    }

     

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

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

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

    꼼꼼하게 리뷰해주셔서 감개무량입니다 :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;
            }
        }
    }

     

  • 2022.09.28 05:06 #1711391
    host를 추출하기를 원하신 건 아닐 텐데요... ㅎㅎ
  • 2022.09.28 06:15 #1711416

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

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

  • 2022.09.28 07:02 #1711434
    parse_url로 path를 추출하셨다면 무조건 앞에서 RX_BASEURL을 잘라주시면 됩니다.
  • 2022.09.28 08:37 #1711448
    네, 알겠습니다!!
  • 2022.09.28 13:50 #1711507

    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;
            }
        }
    }