라이믹스 사이트의 url로부터 document_srl을 가져오는 함수가 있나요?
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;
}
}
}
$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
$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과 일치하는 부분은 제거하세요.
내일 한번 시도해보겠습니다!
덕분에 잘 처리했습니다 :)
37줄을 24줄로요ㅋㅋㅋㅋ
Router::parseUrl 진짜 좋네요. act까지 다 잡아줘요ㄷㄷㄷ
$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;
}
}
}
게시판 이외의 모듈에서 꽤 복잡한 구조의 짧은주소를 선언하여 사용하더라도 항상 정확하게 나옵니다.
단, 라이믹스를 서브폴더에 설치한 경우 $trackback_request_url이 이상하게 들어갈 수 있겠네요.
parse_url() 함수로 도메인을 제외한 path만 추출한 후, RX_BASEURL 길이만큼 앞을 잘라서 써 보세요.
11줄의 세 가지 조건은 isset($result->args['document_srl']) 하나로 압축할 수 있습니다.
그리고 11줄의 조건을 충족하지 못하면 $trackback_target_srl 변수가 아예 선언되지 않아서
PHP 최신버전에서는 15줄의 조건문이 워닝을 뿜을 것 같네요.^^
꼼꼼하게 리뷰해주셔서 감개무량입니다 :D
별도 폴더 설치는 늘 까먹게 되더라구요.
그냥 별도 폴더에 코어 설치해서 습작을 하는 게 낫겠다는 생각도 듭니다;;; ㅎㅎ
다음과 같이 정리했습니다.
$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;
}
}
}
역시 그냥 서브 폴더에 코어가 설치되어 있을 때도 parse_url($trackback_url, PHP_URL_PATH)로 하고, strlen(RX_BASEURL) 만큼 잘라주면 되는 건가요?
서브 폴더에 코어가 설치되어 있을 때 주소를 어떤 식으로 파싱하거나 인식하는지를 잘 몰라서...
제가 뭔가 잘못 이해했나봅니다;;
https://xetown.com/questions/1711266#comment_1711354
위의 댓글 링크의 코드에 잘못된 부분이 있어서 재정리합니다;;;;
$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;
}
}
}