짧은 주소 생성 애드온의 글 읽기 속도 저하를 해결해 보고자 api에서 짧은주소를 받아 오는 작업을 1회로 줄여보려고 합니다.

 

문서 db의 extra_vars 필드값을 가져와서 거기에 다시 짧은주소 데이터를 합쳐서 업데이트 해야 되는 것으로 이해가 됩니다.

 

api에서 받아온 결과는 $result 에 저장이 됩니다.  이 값을 extra_vars 안에 넣으려고 합니다.

extra_vars 안에 넣을 id ? ggurl 로 하려고 합니다.

 

$args->document_srl =  Context::get('document_srl');
$tmpout = executeQuery('addons.name.getDocumentExtra', $args);
$exvars=unserialize($tmpout->data->extra_vars);

 

여기까지가 기존에 저장된 값을 불러와 $exvars에 담아 두는 듯 합니다.

 

질문.1 : $ggurl에 ggurl의 값을 담고 싶습니다. 

 

if($ggurl) {

$ggurl 을 이용해 짧은 주소를 출력하는 코드

} else

{

구글api로 짧은주소 가져오기 코드

구글에서 가져온 짧은 주소를 

$result에 담았습니다.

 

질문2:아래 $exvars에 위 $result 값이 ggurl로 추가되어 아래 업데이트시 함께 업데이트가 되려면 추가해야할 코드가 궁금합니다.

$args->extra_vars = serialize($exvars);
$tmpout = executeQuery('addons.name.updateDocumentExtra', $args);

}

 

 

다른 자료와 함께 쓰는 필드이다보니 함부러 테스트하기도 어렵고 제가 프로그래밍을 공부한 사람이 아니다보니 개발자분들의 도움으로 시도해 보려고 합니다.

 

  • profile
    제가 변수만들때 귀찮아서 하는짓이 프리픽스로 gg 붙이는건데 url 을 겹치지 않게 ggurl 로도 자주 쓰고 있습니다.
    왠지 정겹네요 ㅎㅎ
  • profile profile
    구글이라 ㅋ
  • profile
    값이 저장이 안되는데요.

    $result = $json->id;
    $args->document_srl = Context::get('document_srl');
    $tmpout = executeQuery('addons.urlshortener.getDocumentExtra', $args);
    $exvars=unserialize($tmpout->data->extra_vars);
    $exvars->ggurl = $result;
    $args->extra_vars = serialize($exvars);
    $tmpout = executeQuery('addons.urlshortener.updateDocumentExtra', $args);


    어디가 오류가 있는걸까요?
  • profile

    일단 제가 위치 잡는라고 수정했던 버전으로 아래와 같이 해서 db에 저장하고 불러오는 것으로 성공한 것 같습니다.

    현재 검토해야 할 사항은
    1.정말 저장 이후에는 api요청작업을 안하는지
    2.글 읽기 말고 다른 과정에서의 주소를 잘못 저장하는 곳은 없는지 확인

    등을 확인해봐야 할 것 같네요.

    <?php
    /**
    * @file qrcode.addon.php
    * @author 최희철 ([email protected])
    * @brief 해당글 주소의 QRcode 를 이미지로 찍어주는 애드온입니다. 생성된 QRCode 를 인쇄하거나 저장하여 사용하세요.\n
    * 구글 Chart API 를 를 사용하였고 misol 님의 soo_mcrblog_link 애드온을 참고하였습니다.
    **/

    if(!defined('__XE__')) exit();
    if(isCrawler()) return; // robot 무시
    if($called_position != 'before_display_content') return; // before_display_content type 만 처리
    if(Context::getResponseMethod() != 'HTML') return; // HTML 만 처리


    // 현재 페이지 구함
    $current_page = getenv('HTTP_HOST').getenv('REQUEST_URI');

    // Google에 보낼 리퍼러
    $referer = getenv('HTTP_HOST');

    // 디자인 기본 값 설정
    if(!$addon_info->btn_align) $addon_info->btn_align = 'right';
    if(!$addon_info->class_id) $addon_info->class_id = 'urlshort';

    $args->document_srl = Context::get('document_srl');
    $tmpout = executeQuery('addons.urlshortener.getDocumentExtra', $args);
    $exvars=unserialize($tmpout->data->extra_vars);
    $ggurl = $exvars->ggurl;
    if($ggurl) {
    // 문서 하단 삽입
    $output = str_replace('<div class="short_url"></div>', '<div class="short_url"><a class="copy_cmt_addr1" href="#" data-clipboard-text="'.$ggurl.'" onclick="return false;">짧은주소 복사 : '.$ggurl.'</a></div>', $output);
    } else if($current_page)
    {
    $longUrl = getFullUrl('','document_srl',$document_srl);
    $apiKey = $addon_info->key;

    $postData = array('longUrl' => $longUrl);
    $jsonData = json_encode($postData);
    $Curl = "https://www.googleapis.com/urlshortener/v1/url?key=".$apiKey;
    $curlObj = curl_init();

    curl_setopt($curlObj, CURLOPT_URL, $Curl);
    curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curlObj, CURLOPT_HEADER, 0);
    curl_setopt($curlObj, CURLOPT_REFERER, $referer);
    curl_setopt($curlObj, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
    curl_setopt($curlObj, CURLOPT_POST, 1);
    curl_setopt($curlObj, CURLOPT_POSTFIELDS, $jsonData);

    $response = curl_exec($curlObj);

    //change the response json string to object
    $json = json_decode($response);

    curl_close($curlObj);

    if(isset($json->error)){
    $result = $json->error->message;
    }else{
    $result = $json->id;
    $args->document_srl = Context::get('document_srl');
    $tmpout = executeQuery('addons.urlshortener.getDocumentExtra', $args);
    $exvars=unserialize($tmpout->data->extra_vars);
    $exvars->ggurl = $result;
    $args->document_srl = Context::get('document_srl');
    $args->extra_vars = serialize($exvars);
    $tmpout = executeQuery('addons.urlshortener.updateDocumentExtra', $args);
    }
    }
    ?>

  • profile
    글 수정,작성 시에도 동작을해서 단축주소를 저장해 주는데 이건 오히려 도움이 되는것 같습니다.

    글 작성시 1번 api 작업을 하고 이후부터는 안하게 되니까요. 저는 처음 예상했던건 글 작성 이후 그 다음 방문자가 api 작업을 하게 될 줄 알았는데 그게 아니에ㅛ.
  • profile
    열정과 수고가 대단하십니다. ^^
    본 애드온에 해당 코드로 업데이트를 해도 될까요?
  • profile profile
    네. 당연하죠. 문제점 검토해서 반영해주세요.
    db에 저장하니 이제 직접 불러올 수 있어서 원하는 곳에 쉽게 붙일 수 있겠어요.
  • profile profile
    적용했습니다. 올리도록 할께요. ^^
  • profile profile
    반영하시면서 id 값을 바꾸시면 저희 같은 경우 기존에 작업해 놓은 것이 무용지물 됩니다. 반영하실때 참고해주세요.
  • profile
    @마시마로님 께서 배포자료에 적용해 주셔서 이제 글 읽기 시에도 속도저하 없이 이용 가능해졌습니다. 좋은 자료 만들어 주셔서 감사합니다.

    https://xetown.com/rxe_point/725073