Проблемы с вызовом функции запроса Coldfusion внутри цикла запроса - PullRequest
0 голосов
/ 16 декабря 2011

У меня есть цикл запросов, и внутри этого цикла я делаю вызов функции cfc, чтобы вернуть второй запрос.Он делает странные вещи с дисплеем:

В приведенном ниже примере вместо вызова функции для получения второго запроса я создаю простой цикл.Это показывает нормально. Просмотреть фактическую страницу здесь

<cfoutput>
    <cfif qCal.recordcount>
        <a class="control" onClick="return hs.getExpander(this).printHtml()" href="##">Print</a>
    </cfif>
    <table width="100%" cellspacing="0" cellpadding="4">
        <cfloop query="qCal">
            <tr>
                <td align="middle" valign="top" style="width:150px;">
                    <a title="View full-sized image" onclick="return hs.expand(this)" href="/images/classes/#qCal.image#" class="highslide"><img src="/images/classes/#qCal.thumb#" class="resize2"></a></td>
                <td>
                    <table cellspacing="0" cellpadding="3">
                        <tr>
                            <td colspan="2" class="textNormal"><h2>#qCal.title#</h2></td>
                        </tr>
                        <tr>
                            <td class="textNormal"><strong>Date:</strong></td>
                            <td class="textNormal"><strong>Time:</strong></td>
                        </tr>
                        <cfloop from="1" to="5" index="i"> <!--- basic loop --->
                            <tr>
                                <td>#i#</td>
                                <td></td>
                            </tr>
                        </cfloop>   
                    </table>

                </td>
            </tr>
        </cfloop>
   </table> 
</cfoutput>

Но, как только я выполняю вызов функции для получения вторичного запроса, с дисплеем происходят необъяснимые вещи. Просмотреть фактическую страницу здесь (которая отображает полуобработанный HTML-код).

<cfoutput>
    <cfif qCal.recordcount>
        <a class="control" onClick="return hs.getExpander(this).printHtml()" href="##">Print</a>
    </cfif>
    <table width="100%" cellspacing="0" cellpadding="4">
        <cfloop query="qCal">
            <cfsilent>
                <cfset qCalItems = o_system.getCalendarItems(
                      start=dateformat(vStartDate,"yyyy-mm-yy"),
                      end=dateformat(vEndDate,"yyyy-mm-yy"),
                      classID=qCal.classID,
                      forQuarterlyCalendar=true,
                      order_by="i.startDate")>
            </cfsilent>
            <tr>
                <td align="middle" valign="top" style="width:150px;">
                    <a title="View full-sized image" onclick="return hs.expand(this)" href="/images/classes/#qCal.image#" class="highslide"><img src="/images/classes/#qCal.thumb#" class="resize2"></a></td>
                <td>
                    <table cellspacing="0" cellpadding="3">
                        <tr>
                            <td colspan="2" class="textNormal"><h2>#qCal.title#</h2></td>
                        </tr>
                        <tr>
                            <td class="textNormal"><strong>Date:</strong></td>
                            <td class="textNormal"><strong>Time:</strong></td>
                        </tr>
                        <cfloop query="qCalItems">
                            <tr bgcolor="#iif(qCalItems.CurrentRow MOD(2) eq 1,de('ffffff'),de('EFEFEF'))#">
                                <td>#DayOfWeekAsString(dayofweek(qCalItems.startDate))# #dateformat(qCalItems.startDate,"dd mmm yyyy")#</td>
                                <td>#qCalItems.startTime#-#qCalItems.endTime#</td>
                            </tr>
                        </cfloop>
                    </table>
                </td>
            </tr>
        </cfloop>
   </table> 
</cfoutput>

ОБНОВЛЕНИЕ - КОД ХФУ ДОБАВЛЕН

ПРИМЕЧАНИЕ. Функция возвращает либо структуру, либозапрос в зависимости от аргумента "forQuarterlyCalendar".Это определенно возвращает объект запроса в этом случае.Я выбросил запрос и подтвердил, что это действительный объект запроса.

<cffunction name="getCalendarItems" access="remote" returntype="any" output="false" returnformat="json">
        <cfargument name="classID" type="any" required="false" default="">
        <cfargument name="forSelect" type="boolean" required="false" default="false">
        <cfargument name="forQuarterlyCalendar" type="boolean" required="false" default="false">
        <cfargument name="start" type="any" required="false" default="">
        <cfargument name="end" type="any" required="false" default="">
        <cfargument name="order_by" type="any" required="false" default="c.title">
        <cfargument name="sort_direction" type="any" required="false" default="asc">
        <cfargument name="json" type="boolean" required="false" default="true">
        <cfargument name="must_have_store_item" type="boolean" required="false" default="true">
        <cfset var qClass = 0>
        <cfset var realStart = "">
        <cfset var realEnd = "">
        <cfset var results = []>
        <cfset var vUrl = "">
        <cfset var vId = "">
        <cfset var vTitle = "">
        <cfset var vStart = "">
        <cfif len(trim(arguments.start))>
            <cfset realStart = EpochTimeToLocalDate(arguments.start)>
        </cfif>
        <cfif len(trim(arguments.end))> 
            <cfset realEnd = EpochTimeToLocalDate(arguments.end)>
        </cfif>

        <cfquery name="qClass" datasource="#application.datasource#">
            select  <cfif arguments.forSelect>
                        c.title, i.calendarItemID as id, convert(varchar, i.startDate, 103)+' '+i.startTime+'-'+i.endTime as text 
                    <cfelseif arguments.forQuarterlyCalendar>
                        c.description, i.calendarItemID as id, i.startDate, i.startTime, i.endTime 
                    <cfelse>
                        i.calendarItemID, i.startDate, i.startTime, i.endTime
                        ,c.classID, c.title, c.description, c.price, c.places, c.exclusive, c.discounted, c.url
                        ,s.storeItemID 
                    </cfif>
            from calendarItem i
            <cfif arguments.must_have_store_item>
                join storeItem s on s.entityID = i.calendarItemID and s.storeItemTypeID = 3 
            </cfif>
            join class c on c.classID = i.classID and c.active=1
            where i.active=1
            <cfif isnumeric(arguments.classID)>
                and i.classID = <cfqueryparam value="#arguments.classID#" cfsqltype="cf_sql_integer">
            </cfif>
            <cfif len(trim(arguments.start))>
                <cfif arguments.forQuarterlyCalendar>
                    and i.startDate >= <cfqueryparam value="#arguments.start#" cfsqltype="cf_sql_date">
                <cfelse>
                    and i.startDate >= <cfqueryparam value="#dateformat(realStart,'yyyy-mm-dd')#" cfsqltype="cf_sql_date">
                </cfif>
            </cfif>
            order by #arguments.order_by# #arguments.sort_direction#
        </cfquery>
        <cfif qClass.recordcount>
            <cfif not arguments.forSelect and not arguments.forQuarterlyCalendar>
                <cfloop query="qClass">
                    <cfset vUrl = qClass["url"]>
                    <cfset vId = qClass["storeItemID"]> 
                    <cfset vTitle = qClass["title"]>
                    <cfset vStart = GetEpochTimeFromLocal(qClass.startDate)>
                    <cfif not len(trim(url)) or len(trim(url)) is 0>
                        <cfset vUrl = "#application.webroot#/class_detail.cfm?id=#vId#">
                    </cfif>
                    <cfset s = structnew()>
                    <cfset s["id"] = vId>
                    <cfset s["url"] = vUrl>
                    <cfset s["title"] = vTitle>
                    <cfset s["start"] = vStart>
                    <cfset arrayappend(results, s)> 
                </cfloop>
            <cfelse>
                <cfset results = qClass>
            </cfif>
        </cfif>
        <cfif arguments.json>
            <cfcontent type="application/json">
        </cfif>
        <cfreturn results>
    </cffunction>

1 Ответ

2 голосов
/ 16 декабря 2011

Вам нужно изменить область 's':

<cfset s = structnew()>
...