我们决定使用cfWindows作为模态对话框。这是无法改变的,因此“使用其他框架”的答案和评论无法解决问题。
虽然我们已经为我们的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元素的工作方式不同。我对底层Java了解甚少,我发布的代码是前一段时间从CF博客中提取的,所以我不确定如何解决这个问题。
是否可以获取cfWindow中调用的页面的调试信息?如果是这样,怎么样?
修改
为了跟进评论中的建议,我尝试在自己的浏览器窗口中打开CFWindow模板。调试信息正常显示。然后我尝试CFDumping上面列出的三行中的每一行的结果。前两个工作。 “tempCfdebugger”变量确实包含一个名为“getDebugger()”的函数。问题似乎是在CFWindow中调用该函数时。服务器必须以某种方式以不同的方式解释CFWindow请求。
除了连接到ServiceFactory之外,是否有其他方法来获取此调试信息?
答案 0 :(得分:1)
我将奖励给Scott,因为他正确地提出了解决原始问题的_cf_nodebug url变量。但是,我想在这里发布一个更完整的答案。
通过在调用时将_cf_nodebug = true附加到url,我们可以在cfWindow中获取完整的调试信息,这是正确的(虽然我不清楚给定变量名称的逻辑)。这解决了原始问题中所述的问题,并且很容易添加到我们的cf_window自定义标记中;非常感谢斯科特。但是,由于我们实际上试图从所有cfWindow交互中获取调试信息,包括AJAX请求,因此我的措辞很差。这最终是一个两阶段的修复,_cf_nodebug负责第一阶段。虽然我们现在能够从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>
然后我在cfc中进行了搜索和替换,以修改100个左右的cfQuery标记的开头和结尾:
<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>