라이믹스를 배운지는 얼마 안되었습니다.
궁금한 것이 있어 문의드립니다.
콘트롤러에서 db에 insert를 하고, '저장되었습니다.' 또는 '수정되었습니다.'라는 메시지를 alert창으로 띄운후에
$this->setRedirectUrl로 특정페이지로 이동하려고 합니다.
콘트롤러에서 alert창을 띄우려면 어떻게 해야할까요?
$this->setMessage('success_registed');
또는
$this->setMessage('success_updated');
$this->setRedirectUrl(특정페이지); 이렇게 해도 alert창은 뜨지가 않네요
어떻게 해야 할까요?
setError로 0이 아닌 오류 코드를 지정했다면 setMessage로 지정한 메시지가 뜨고, 그렇지 않으면 setRedirectUrl이 우선합니다. 이것이 모든 폼 제출시 기본 동작입니다. 두 가지를 동시에 할 수는 없습니다.
폼 제출 처리는 PRG(POST/Redirect/GET) 패턴을 따르는 것이 정석이고, POST (컨트롤러) 상태에서는 화면에 어떤 내용도 출력해서는 안 되기 때문에, 우선 GET (뷰) 화면으로 리다이렉트한 후에 나오는 화면에서 메시지를 보여주든 말든 알아서 처리하라는 뜻이지요. 한국에서 많이 사용하는 alert+리다이렉트 방식은 이 PRG 패턴의 기본도 모르는 변태들이 오래 전에 만들어낸 것인데, 공공기관들이 워낙 남용하다 보니 여기저기에서 끊임없이 따라하고 있네요. 하긴 클라이언트가 까라면 까야죠;;;
기본 동작과 다른 동작을 원하신다면 폼에 rx_ajax 클래스를 추가하거나, exec_json으로 비동기 제출하면서 콜백 함수를 지정하여 얼마든지 커스터마이징할 수 있습니다. 그러면 서버에서 응답이 돌아왔을 때 기본 동작을 따르지 않고 콜백 함수를 호출하므로, 콜백 함수에서 alert을 하든 리다이렉트를 하든 마음대로 할 수 있습니다.
예:
<form action="..." method="post" class="rx_ajax" data-callback-success="myCallbackFunction">
<input ... />
</form>
<script>
function myCallbackFunction(data) {
alert(data.message);
// 그 밖에 원하는 동작 아무거나
location.href = data.redirect_url;
}
</script>