라이믹스를 배운지는 얼마 안되었습니다.

궁금한 것이 있어 문의드립니다.

콘트롤러에서 db에 insert를 하고, '저장되었습니다.' 또는 '수정되었습니다.'라는 메시지를 alert창으로 띄운후에

$this->setRedirectUrl로 특정페이지로 이동하려고 합니다.

 

콘트롤러에서 alert창을 띄우려면 어떻게 해야할까요?

 

$this->setMessage('success_registed');

또는 

$this->setMessage('success_updated');

 

$this->setRedirectUrl(특정페이지); 이렇게 해도 alert창은 뜨지가 않네요

어떻게 해야 할까요?

  • profile

    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>