질문/조언질답게시판
Extra Form
PHP PHP 7.2
CMS Rhymix 2.0

안녕하세요.

라이믹스를 이용해 홈페이지를 구성중에 있습니다.

진행 도중 막히는점이 있어 질문합니다.

 

XE 엔진 ajax 구동방식이 [View (php) > html > exec_json > Controller > json return] 이런식으로 구성되어 있습니다.

View을 통해 페이지를 띄우는 방식은 XE 엔진이 관리하고 있습니다.

 

라이믹스 문서는 XE 구조를 그대로 따라가는걸 권장하고 있는데

제가 겪고 있는 문제는 ajax > ajax > ajax 이런식으로 여러번 호출하는 경우입니다.

라이믹스 페이지는 XE코어에서 View을 참고해 조작을 하게 되는데

첫번째 ajax할때 Controller로 제어가 넘어가면 json을 리턴하는 과정에서 XE코어는 Controller을 단순하게 호출하는걸로 보이며 그러므로 Controller에서 두번째 html페이지에서 ajax을 요청하는 방법을 딱히 찾을수가 없습니다.

저는 단순히 call controller() 한후 json을 리턴받는 방식으로 파악했습니다.

 

저는 ajax을 하면 View쪽에서 제어권을 넘겨 받는식으로 ajax을 통해 다중 View하는식으로 구성되는식을 희망합니다만.. 제가 생각했을때는 안될것 같습니다.

[View (php) > html > exec_json > Controller > ??? > View > $this->setTemplateFile > html > exec_json ...]

이런식으로 재귀형식으로 구동되길 희망하고 있습니다.

 

결국 제가 생각하는 구현 방식은

1. Controller에서 html과 php파일을 섞인 파일(.php) 경로를 json으로 넘겨주고 tpl/html에서 호출한다.

2. ajax 호출한 controll 메소드에서 하드코딩으로 "<br>" 이런식으로 넣어 $this->add() 해주고 html에서 출력해준다.

 

이렇게 두가지 인데 이렇게 되면 XE 엔진 구조와도 동떨어지고 코드도 깔끔해지지 않아 고수님들께 좋은 방법이 있는지 묻고 싶습니다.

 

  • profile

    XE 시절부터 있어왔던 exec_xml, exec_json 등의 함수는 말씀하신 것처럼 controller 클래스의 proc* 액션을 호출하고, JSON으로 간단한 결과값만 받는 것이 일반적입니다. 그러나 꼭 그러라는 법은 없습니다. model이나 view의 특정 액션을 호출해도 아무 문제가 없습니다. 해당 액션에서 쓸만한 결과를 반환하기만 하면 됩니다.

     

    예를 들어 모바일에서 새로고침 없이 댓글 페이지를 넘어가는 데 사용하는 board.mobile.php의 dispBoardCommentPage 액션은 템플릿을 컴파일한 HTML 결과물을 $this->add()로 반환하도록 되어 있습니다. 형식상 JSON으로 감싸기는 했지만, data.html 속성에 HTML이 들어 있으니 그걸 프론트단에서 그대로 쓸 수 있지요. 만약 그 안에 스크립트가 포함되어 있다면, 그 스크립트를 body에 삽입하는 순간 실행될 것입니다.

     

    직접 개발하시는 자료라면 view 클래스의 disp* 액션에서도 레이아웃과 템플릿 경로를 지정하는 대신 $this->add()만 사용하셔도 아무 문제가 없습니다. 브라우저에서 해당 mid, act를 직접 요청하면 아무 것도 나오지 않겠지만, 동일한 액션을 exec_json으로 요청하면 JSON이 돌아옵니다. 그 안에는 HTML을 넣든 스크립트를 넣든 자유입니다.

     

    [12:43 수정] 그러나 ajax 좀 실행하겠다고 HTML 페이지를 통째로 받는 건 낭비지요. 두 번째, 세 번째 ajax 요청에 필요한 몇 개의 값들만 받아오고, success_callback을 사용해서 그 다음 단계로 넘어가는 것이 훨씬 자연스럽습니다.

     

    예:

     

    exec_json('모듈.액션1', { 처음에 넣을 데이터 }, function(data) {

        exec_json('모듈.액션2, { param1: data.result1, param2: data.result2 }, function(data2) {

            exec_json('모듈.액션3', { foobar: data2.foobar }, function(data3) {

                ... 기타등등 ...

            });

        });

    });

  • profile ?
    제가 본 코드가 컨트롤러를 호출하고 있어서 컨트롤러만 호출되는줄 알았더니 모듈 전체를 확인하나보네요 예제 위치도 올려주시고 다중 exec_json도 재밌어 보이네요. 정확한 해결방법을 여러가지로 알려주셔서 감사합니다. 라이믹스가 보면 볼수록 참 좋은 프레임워크 같습니다^^