포럼
XE에서 DataTables 사용하기
2013.09.28 14:48
XE1.7.3.4 + Bootstrap + DataTables (server-side/JSON)
요새 페이지를 새로 호출하지않고 JSON방식으로 많이 사용하는데요.
대표적으로 많이쓰이는(?) DataTables 를 제가 애용하는 편입니다.
부트스트랩붙여서 사용하면 목록출력작업은 이쁘고 정말 간편해지지요. 필드정렬 다되고~
검색(필터링)은 느려져서 좀 문제가 있지만..
아무튼 이전에 순수 php상에서나 코드이그나이터등에서는 손쉽게 작업이 가능한데요.
XE에서도 해보려고 찾아보니 아래처럼 쓰더군요.
function dispXXX() {
Context::setRequestMethod('JSON');
$this->set('key', 'value');
}
결과물은:
{'message':'', 'error':'', 'key': 'value'}
이런식으로 message와 error값이 반드시 포함되서 인코딩되서 출력되더라구요. ㅜㅜ
물론 XE에서 필요로 하는 기능이라 이런고정된 형태를 취하는거 같은데..
문제는 이런식이되버리면 DataTables가 원하는 JSON형식이 나오지 않아 정상적으로 동작하지 않는다는 겁니다.
제가 찾은 방법은 두가지가 있는데요.
1. 별도의 Addon으로 출력값을 decoding해서 해당 값을 제거하고 재인코딩해서 출력.
2. 코어소스 수정 :
classes/display/JSONDisplayHandler.php 에서 toDoc()메소드 시작부분에 아래 코드 추가.
if( isset($oModule->customVariables) ) {
return( $oModule->customVariables );
}
else if( isset($oModule->customJSONVariables) ) {
return( json_encode($oModule->customJSONVariables) );
}
그리고 모듈 액션코드에서는
function dispXXX() {
Context::setRequestMethod('JSON');
$this->customJSONVariables= $YYYY; // 출력할 값
}
댓글 10
-
퍼니엑스이
2013.09.30 14:40
-
doogle
2013.10.01 14:19
답변주셔서 감사합니다. 그런데 제가 이해가 안되는부분이 있어요 ^^
XE에서 JSON으로 요청한다는 말이 구체적으로 어떤 의미인가요? ^^;;
DataTables 즉 자바스크립트에서 serverside 호출은 GET이나 POST방식밖에 조절할 수 없는거 같은데..
그리고 응답을 JSON형식으로 출력하는게 문제가 아니고 DataTables 가 원하는 포맷으로 응답을 해줘야 제대로 동작을하는데
XE는 반드시 몇가지 값을 넣어서 반환해서 형식이 안맞는게 문제인겁니다.
그래서 본문처럼 DisplayHandler까지 수정한거구요.;;
그리고 물론 본문에 언급했듯이 $this->set() 을 사용해봤는데 안돼는거네요..^^;;
-
퍼니엑스이
2013.10.01 14:27
자바스크립트에서 JSON으로 호출하면 알아서 JSON으로 응답을 보내줍니다.
제가 보기엔 JSON 개념을 모르시는 것 같은데 GET/POST와 JSON은 전혀 다른 개념입니다.
GET/POST는 데이터를 보내주는 방식이고 JSON은 JavaScript Standard Object Notation, 즉 자바스크립트에서 받아들일 수 있는 객체 형식으로 결과값을 보내준다는 의미입니다.
-
doogle
2013.10.01 14:37
당연히 말씀대로 JSON하고 GET/POST하고는 다른 개념이지요.
근데 클라이언트쪽에서 JSON으로 요청하면 서버가 알아서 JSON형식으로 응답한다는 것은 처음 듣네요.
혹시 XE에서만 그런건가요?
-
퍼니엑스이
2013.10.01 14:39
네 XE에서 JSON으로 요청이 들어왔다는 것을 인식하고 JSON 형식으로 응답합니다.
-
doogle
2013.10.01 14:43
XE에서 JSON으로 요청이 들어온경우 JSON형식으로 응답할때 반드시 message, error 변수값이 포함되서 돌아오는데요.
DataTables에서 받는 형식이랑 다릅니다.
혹시 원하는 값으로 응답하도록 없앨방법이 없을까요?
그 때문에 DisplayHandler를 손본거거든요. ㅜㅜ
-
퍼니엑스이
2013.10.01 14:45
unset($this->error);
unset($this->message);
로 message, error 변수값을 제거하시면 됩니다.
-
doogle
2013.10.01 14:47
해당값은 XE코어소스중 classes/display/JSONDisplayHandler.php 에서 출력값을 뱉을때.. 즉 거의 출력 마지막에 세팅되고 있습니다.
결국은 XE 코어를 손대야 가능하지 않은가요?
아니면 Addon이나.. ㅡ.ㅡ;;
-
퍼니엑스이
2013.10.01 14:57
플러그인에서 error, message 변수를 제외하면 되지 않나요?
-
doogle
2013.10.01 15:02
물론 DataTables 같은 경우에는 서버사이드에서 받은 결과값을 받자마자 변경할 수 있게 자유도가 있습니다만..
꼭 DataTables만이 아니더라도.. FullCalendar나 다른 여러가지 jQuery 플러그인의 경우 그런것까지는 고려되지 않은 경우도 많습니다.
이런경우에는 동작안하게 되서 치명적인거 같아요..ㅜㅜ
코어소스에 NullDisplayHandler 같은거 하나 넣어두면 좋을텐데 말이죠.. 개발자가 원하는데로 백지상태에서 출력할 수 있게..^^;
XE에서는 JSON으로 요청하면 JSON으로 응답하기 때문에 굳이 requestMethod를 JSON으로 바꾸지 않아도 됩니다.
Context::set('key', 'value'); 대신에
$this->add('key', 'value'); 를 써보세요.