CMS/프레임워크 | Rhymix 2.1 |
---|---|
개발 언어 | PHP 8.4 |
안녕하세요.
아래와 같은 disp로 get요청을 하면 가공된 html 조각만 내려주는 그런 기능을 만들어보고 있습니다.
public function dispCustomView()
{
$documentSrl = Context::get('document_srl');
/.. 중략 ../
Context::setResponseMethod('HTML');
echo '<div>Hello,Universe.</div>';
exit;
}
제가 원하는건 <div>Hello,Universe.</div>
만 응답해줬으면 좋겠는데, html 전체가 응답됩니다. setTemplateFile 이런거 없이, 그냥 html 조각만 가공해서 응답하려면 현재 라이믹스에서 정석적인 방법이 어떤것들이 있을까요?
감사합니다.

루키
Lv. 3
댓글 4
정석적인 방법이 있긴 한데, 템플릿은 사용해야 하는 구조입니다.
Context::setResponseMethod('RAW', 'text/html');
$this->setTemplatePath($this->module_path . 'tpl');
$this->setTemplateFile('my_html');
이렇게 하면 딱 my_html 템플릿 파일의 내용만 출력되고,
앞뒤에 <html><head><body> 및 레이아웃이 붙지 않습니다.
예를 들어 RSS 모듈에서 html이 아닌 내용을 출력하기 위해 이런 방법을 사용합니다.
템플릿이 필요하지 않다면 단순히 변수 하나만 출력하는 템플릿을 만들어서
완성된 html 내용을 전달하는 식으로 가볍게 랩핑할 수도 있고요.
단, 템플릿을 사용하지 않고 컨텐츠를 문맥에 맞게 escape하실 줄 아는 분이 드물기 때문에
웬만하면 템플릿v2 또는 autoescape 사용을 추천합니다.
네, 그잖아도 v2를 사용하면 @fragment 로도 구현될수는 있는건데, 완전 작은 html조각 같은 경우에서는 $this->setTemplatePath($this->module_path . 'tpl'); 이런 경로 지정과정이 없이 , 혹시 더 좋은 방법이 없을까해서 문의했습니다. 역시나 setTemplate 을 거쳐야 겠군요.
답변 감사합니다!
RAW response method가 애당초 RSS 모듈을 위해 만들어진 기능이나 마찬가지라,
이름에 걸맞지 않게 현재는 템플릿을 사용하고 있습니다.
템플릿 대신 출력할 내용을 직접 지정하는 방법도 조만간 제공하겠습니다.
html을 직접 내려주는 방법을 물어보셔서 위와 같이 답변을 드렸지만,
현업에서는 html을 $this->add()로 담아서 json 형식으로 응답하는 경우가 더 많은 것 같습니다.
코어에서 제공하는 AJAX 관련 함수들도 모두 json 기반이니,
템플릿이 거추장스럽다면 차라리 json을 활용해 보시는 것이 어떨까요?^^
이번 고민의 시작점은 프론트에서 하던 상태관리를 백엔드 driven 으로 이전하여 특정 액션(proc)을 실행하면 새로고침없이 최신상태까지 반영해서 화면에 뿌려주는거를 만들어보고 있었습니다. json으로 응답하면 프론트단에서 다시 스크립트를 작성해야서, 프론트에서 요청만, 상태관리와 응답은 백엔드서 해보자! 라는 목표가 있기에... 삽질이 시작되었습니다.
htmx 같은 라이브러리와 결합해서 사용시 커스텀모듈 액션에 요청 한번으로 상태가 업데이트되면서 화면까지 새로고침없이 최신상태를 반영하는것까지 구현은 성공했습니다만, 백엔드에 작성할 코드가 많이 지저분하고 유지보수도 아마 쉽지않겠다는 개인적인 판단이 있었습니다. (아마 저의 재량 문제가 크겠습니다;;) 그리하여 proc 에 단순한 요청보내면 disp에서 html 전체 아닌 단순한 조각만 내려주고, 이걸 자동으로 revalidate 되게 만들면 실사용에서 쓸만한 무언가가 되지않을까? 하던 중이었습니다.
$this->setTemplatePath($this->module_path . 'tpl'); 와 setTemplateFile 을 피하고 싶은 이유는 재사용시 템플릿의 경로가 자주 변하거나, 디자인이 변하거나, 이 기능이 필요한 템플릿이 동시에 여러개 존재할수도 있거나등, 여러가지 경우가 생길수 있어, 단순함을 유지하기 위해서입니다.
템플릿 대신 출력할 내용을 직접 지정하는 방법이 완전 기대됩니다. 늦은 시간까지 조언 감사합니다.^^