질문/조언질답게시판

문서를 작성한후에 로드되는 페이지에 헤더를 삽입할 수 있나요?

  • profile

    document.insertDocument (after) 트리거는 문서를 작성하는 POST 요청 도중에 발생합니다.

    글쓰기가 완료된 후 로드되는 페이지는 그것과는 별도의 GET 요청입니다.

    한 요청 도중에 추가한 헤더는 해당 요청에서만 유효하고, 다음 요청에서는 초기화됩니다.

    글쓰기, 댓글쓰기 등 POST 요청에서는 웹페이지를 표시하지 않는 것이 관례입니다. GET 화면으로 redirect한 후에 표시하지요. 그래야 새로고침하더라도 "데이터를 다시 전송하시겠습니까?" 따위의 팝업이 뜨지 않으니까요.

     

    글읽기 화면에 헤더를 추가할 수는 있으나

    방금 글을 쓰고 글읽기 화면으로 넘어온 건지, 아니면 그냥 글을 읽고 있는 건지 구분하기는 좀더 까다로울 거예요.

    글쓴이의 세션에 뭔가 데이터를 남겨 놓았다가 그걸 인식하도록 하거나...

    아무튼 쓰기 과정에서 한 번, 읽기 과정에서 다시 한 번 처리해야 할 겁니다. 트리거 하나만으로는 안돼요.

  • profile ?
    그렇군요...
    세션을 사용해 봐야겠네요, 감사합니다!
  • ?

    안녕하세요? ㅎㅎ;; 항상 질문만 드려서 죄송한데 궁금한게 하나 더 생겼습니다 ㅋ;;

     

        public function triggerBeforeDisplay($obj)
        {
            if(isset($_SESSION['test'])) {
                Context::addHtmlHeader("<script>alert('test IS set')</script>");
                //unset($_SESSION['test']);
            } else {
                debugPrint("test is NOT set");
            }
        }
     
        public function triggerAfterInsertDocument($obj)
        {
            $_SESSION['test'] = 'test';
        }

     

    위처럼 코드를 하면 'test IS set' 알림이 정상적으로 뜨는데요,

    궁금한게 저 unset 코드를 주석 해제하면 'test is not set' 이 나옵니다.

     

    제가 php를 해본적이 별로 없어서 모르는 건지는 모르겠는데요,

    저는 헤더가 추가되고 unset이 될줄 알았어요, 혹시 왜 이런지 아시나요?

     

    (오우 댓글에서는 vscode 복붙하면 이상하게 나오네요 본문은 잘되는디)

  • ? profile

    글쓰기 POST 요청에서도 triggerBeforeDisplay 트리거가 호출됩니다.
    글읽기 GET 요청에서 또 한 번 triggerBeforeDisplay 트리거가 호출되고요.
    첫 번째 호출되었을 때는 헤더고 뭐고 소용없는 POST 요청인데,
    여기서 헤더를 추가하고 세션을 unset 해버리니까
    정말로 헤더가 필요한 GET 요청시에는 test is NOT set으로 나오는 것 같습니다.

    triggerBeforeDisplay 트리거가 필요하지 않을 때는 건너뛰도록
    if(Context::getResponseMethod() != 'HTML') return; 리턴시켜 버리면 될 것 같습니다.

  • profile ?
    오호 그렇군요,
    항상 친절한 답변 감사드립니다 ^^