짧은 주소 생성 애드온의 글 읽기 속도 저하를 해결해 보고자 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);
}
다른 자료와 함께 쓰는 필드이다보니 함부러 테스트하기도 어렵고 제가 프로그래밍을 공부한 사람이 아니다보니 개발자분들의 도움으로 시도해 보려고 합니다.
댓글 10
왠지 정겹네요 ㅎㅎ
$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);
어디가 오류가 있는걸까요?
일단 제가 위치 잡는라고 수정했던 버전으로 아래와 같이 해서 db에 저장하고 불러오는 것으로 성공한 것 같습니다.
현재 검토해야 할 사항은
1.정말 저장 이후에는 api요청작업을 안하는지
2.글 읽기 말고 다른 과정에서의 주소를 잘못 저장하는 곳은 없는지 확인
등을 확인해봐야 할 것 같네요.
<?php
/**
* @file qrcode.addon.php
* @author 최희철 (ironyjk@embian.com)
* @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);
}
}
?>
글 작성시 1번 api 작업을 하고 이후부터는 안하게 되니까요. 저는 처음 예상했던건 글 작성 이후 그 다음 방문자가 api 작업을 하게 될 줄 알았는데 그게 아니에ㅛ.
본 애드온에 해당 코드로 업데이트를 해도 될까요?
db에 저장하니 이제 직접 불러올 수 있어서 원하는 곳에 쉽게 붙일 수 있겠어요.
https://xetown.com/rxe_point/725073