2014-06-12 2 views
2

우리는 모달 대화 상자에 cfWindows를 사용하기로 결정했습니다. 이것은 변경할 수없는 것이므로 "다른 프레임 워크 사용"에 대한 대답과 의견은 문제를 해결하지 못할 것입니다.cfWindow에서 디버깅 정보를 얻는 방법

IP 주소에 대해 디버깅이 설정되어 있고 디버깅 정보가 일반 페이지에 잘 표시되지만 cfWindows에는 아무 것도 표시되지 않습니다. 오늘 저는 디버깅 정보를 다시 만들고 창 HTML에 수동으로 작성하려고했습니다. 나는 일반적으로 불리는 페이지에 잘 작동 onRequestEnd에 다음 코드를 사용하여 시작 :

<cfset tempFactory = createObject("java", "coldfusion.server.ServiceFactory")> 
<cfset tempCfdebugger = tempFactory.getDebuggingService()> 
<cfset qEvents = tempCfdebugger.getDebugger().getData()> 

원하는대로 출력을 포맷하는 시간을 복용 후, 나는 마침내 cfWindow에서이 작업을 시도했다. 그러나, 나는 코드의 세 번째 줄에 다음과 같은 오류가 발생 :

Detail Its possible that a method called on a Java object created by CreateObject returned null. 
ErrNumber 0 
Message  Value must be initialized before use. 

이이 CF는 cfWindows에서 디버깅 정보를 표시하지 않도록 설정되어 그냥 아니지만 것을 의미하는 디버깅 정보 돈을 공급 자바 요소 cfWindows의 경우에도 똑같이 작동합니다. 근본적인 Java에 대해서는 거의 이해하지 못했으며, 게시 한 코드는 CF 블로그에서 가져온 것입니다. 따라서이 문제를 해결하는 방법을 모르겠습니다.

cfWindow에서 호출 된 페이지에 대한 디버깅 정보를 가져올 수 있습니까? 그렇다면 어떻게?

편집

주석의 제안에 후속, 내가 자신의 브라우저 창에서 CFWindow 템플릿을 여는 노력했다. 디버깅 정보는 정상적으로 나타납니다. 그런 다음 위의 세 줄 각각의 결과를 CFDumping 해 보았습니다. 처음 두 작품. "tempCfdebugger"변수에는 "getDebugger()"라는 함수가 있습니다. 문제는 그 함수가 CFWindow 내에서 호출 될 때인 것처럼 보입니다. 서버는 어떻게해서든지 CFWindow 요청을 다르게 해석해야합니다.

ServiceFactory에 연결하는 것 외에 다른 디버깅 정보를 얻는 다른 방법이 있습니까?

+0

CFWINDOW에로드되는 URL을 새 탭에 열 수 없습니까? –

+0

정확하지 않습니다. 윈도우 안팎으로 많은 변수가 전달되며, 많은 윈도우는 호출자와의 상호 작용에 의존합니다. 다른 장벽이 있습니다. 그러나 제안에 감사드립니다. – Nicholas

+1

그런 다음 워크 플로를 다시 생각해 볼 수 있습니다. D –

답변

1

나는 원래 문제를 해결 한 _cf_nodebug url 변수를 올바르게 제안 했으므로 Scott에게 증여상을 수여 할 예정입니다. 그러나 여기에 좀 더 완벽한 답변을 게시하고 싶습니다.

Scott은 전화를 걸 때 url에 _cf_nodebug = true를 추가하여 cfWindow에서 전체 디버깅 정보를 얻을 수 있다는 것이 맞습니다 (변수의 이름이 주어진 로직에 대해서는 명확하지 않지만). 이렇게하면 원래 질문에 언급 된 문제가 해결되고 cf_window 사용자 정의 태그에 쉽게 추가 할 수 있습니다. 스캇 정말 고마워. 그러나 AJAX 요청을 포함하여 모든 cfWindow 상호 작용에서 디버깅 정보를 얻으려고 실제로 시도했던 것처럼 질문에 불만을 나타 냈습니다. 이것으로 2 단계 수정이되었고, _cf_nodebug는 1 단계를 돌 보았습니다.

cfWindow의 초기로드에서 디버그 정보를 얻을 수 있지만 cfc를 수정하여 쿼리에 대한 세부 정보를보고해야했습니다. 우리가 cfc에서 serviceFactory에 액세스 할 수있게 해주는 URL 변수는 찾을 수 없지만 cfc라는 점과 본질적으로 쿼리의 조밀 한 컬렉션이라는 점을 감안할 때 다음 함수를 구성 요소에 추가하여 일부를 재생성 할 수있었습니다. 원하는 기능 :

<cffunction name="debugFunc" access="private" output="yes"> 
     <cfparam name="session.debugEnabled" default="false"> 
     <cfif session.debugEnabled> 
      <cfoutput> 
       <cfsavecontent variable="debugDetails"> 
        Recordcount: #Request.getDataQueryResult.recordcount#<br> 
        Execution Time: #Request.getDataQueryResult.ExecutionTime#ms<br> 
        <cfif isDefined('Request.getDataQueryResult.sqlparameters')> 
         Params: #Request.getDataQueryResult.sqlparameters#<br> 
        </cfif> 
        <br> 
        #Request.getDataQueryResult.sql# 
       </cfsavecontent> 

       <script> 
        parent.cfWindowDebugDivAdd("cfWindow: #url.method#", "#ReplaceList(debugDetails, "#Chr(10)#,#Chr(13)#,""", " ")#"); 
       </script> 
      </cfoutput> 
     </cfif> 
    </cffunction> 

나는 다음 검색을했고, 100 개 정도 CFQUERY 각 태그의 시작과 끝 수정 CFC의 대체 :이에 쿼리 정보를 저장

 <cfquery result="Request.getDataQueryResult" ...> 
      ... 
     </cfquery> 
     <cfset debugFunc()> 

을 Request 범위에 구조체를 추가 한 다음 위의 디버그 함수를 호출하여 일부 JS를 작성하여 상위 페이지로 다시 전달합니다. 그런 다음 부모 페이지에서 디버그 정보를 가져 와서 div, span 또는 브라우저 콘솔에 덤프 할 수있는 기능 만 있으면됩니다. 다른 사람들에게 도움이 될 경우 여기에 테스트 용 코드가 있습니다 :

<div id="cfWindowDebugDiv" style="width:1000px; height:300px; overflow:auto; text-align:left;"></div> 

    <script> 
     function cfWindowDebugDivAdd(heading, details) { 
      $("#cfWindowDebugDiv").append("<b><u>" + heading + "</u></b><br>"); 
      $("#cfWindowDebugDiv").append(details + "<br><br><br><br>"); 
     } 
    </script> 
+0

감사합니다. @Nicholas. 이것은 당신이 어떻게 문제를 해결했는지 보여주는 좋은 대답입니다. 이 노트는 cfajaxproxy의 CF Docs에서 가져온 것입니다. "프록시는 _CF_NODEBUG 부울 인수를 CFC 함수에 전달합니다. ColdFusion은이 값을 검사하고 이것이 사실 일 때 일반적으로 보내는 디버깅 정보를 응답에 추가하지 않습니다. 동작은 AJAX 요청에 대한 JSON 응답에 비 JSON (즉, 디버그 정보) 텍스트가 포함되지 않도록합니다. " –

2

Cfwindow 및 기타 AJAX 기능은 디버그하기가 더 어렵습니다 (ColdFusion AJAX뿐 아니라). cfwindow를 들어, URL이를 추가 할 수

cfdebug

뭐라고이하는 일은 여기 방법/더 자세한 설명 : 나도 알아가는 것이 좋습니다

http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec10e40-8000.html

방화범을 사용하는 법. 배우기에는 시간이 좀 걸리지 만 다른 프로젝트 (표준 jQuery/AJAX)에는 유용합니다. 그것은 배울 시간이 충분합니다.

이러한 종류의 개발을위한 다른 플랫폼/전략에 대한 의견을 얻을 것입니다. 필자는 내부 Adobe 기능을 사용하여 화상을 입었습니다. cfform, cfinput 등. jQuery를 배우는 것은 힘들다는 것을 알았지 만, ColdFusion의 새 버전으로 업그레이드 할 때 Adobe가 내게 통증을 덜어주었습니다. 또한 cfwindow와의 몇 가지 브라우저 호환성 문제가 발생했습니다.

UPDATE : 나는 생각 CF AJAX 호출 당신이 정상 작동을 위반하는 OnRequestEnd()에 코드를 추가하여. Ben Forta 블로그에 내가 갖고있는 문제 (이 링크를 열면 jibben 검색)에 관한 내 의견을 읽으십시오.

http://forta.com/blog/index.cfm/2007/6/4/ColdFusion-Ajax-Tutorial-4-Partial-Page-Updates

SHORT VERSION : 그들 중 많은 JSON 또는 다른 형식의 데이터를 예상하기 때문에 CF AJAX를 중단합니다() OnRequestEnd 사용하여 콘텐츠 출력을 추가 호출합니다. 간단한 "hello <br>"을이 함수에 추가하면 해당 함수가 데이터 스트림에 추가되고 예상 된 형식이 해제됩니다.

소스 속성에서 cfwindow가 호출하는 페이지에 디버깅 덤프를 추가하는 것이 좋습니다.

추가 참고 : 도움이 될 수 있기 때문에이 내용을 추가하겠습니다. CF에는 _cf_nodebug라는 또 다른 URL/Query String 변수가 있습니다. false이면 디버깅 출력을 켭니다.

+0

응답 지연에 대해 사과드립니다. 우리는 cfdebug를 보았지만 제대로 작동시키지 못했습니다. 어쨌든, 나는 이것이 단지 CF 디버깅 정보가 아니라 아약스 요청을 보았다고 생각했다. 그렇지 않은가요? – Nicholas

+0

_cf_nodebug에 대한 의견을 삭제 했습니까? 실제로 올바른 길로 나를 데려갔습니다. – Nicholas

+0

예, 저는이 경우에 도움이 될지 확신하지 못했습니다. 그것이 삭제되기 전에 당신이 그것을 보았 기 때문에 기쁘다. –