首页 > 解决方案 > 在 cfscript 中使用 Valuelist 不起作用

问题描述

我正在使用来自 cflib.org 的 iCalUS 函数,该函数使用 cfscript 为日历生成 iCal。一项活动可能有多个位置。这些位置来自不同的表,所以我想使用 Valuelist 来获取逗号分隔的列表。

我的代码:

<cfquery datasource="#application.dsn#" name="getEvents">
select project.project_id,omschrijving, project.naam, project.start,project.eind,room, meeting_url
from project, lp_booking, lp_locaties
where export = <cfqueryparam value="1" cfsqltype="cf_sql_bit"> 
and keuren is null 
 and project.datum >= <cfqueryparam value="#createODBCDate(Now())#" cfsqltype="cf_sql_date"> 
and lp_locaties.room_id = lp_booking.room_id
and lp_booking.project_id = project.project_id
order by project.datum
</cfquery>


<cfscript>
eventStr = StructNew();
function iCalUS(stEvent) {
    var vCal = "";
    var CRLF=chr(13)&chr(10);
    var date_now = Now();
    vCal = vCal &  writeoutput('BEGIN:VCALENDAR'& CRLF);
    vCal = vCal &  writeoutput('VERSION:2.0'& CRLF);
    vCal = vCal &  writeoutput('PRODID:Name'& CRLF);
    vCal = vCal &  writeoutput('X-WR-CALNAME:SOMENAME' CRLF);
    vCal = vCal &  writeoutput('CALSCALE:GREGORIAN'& CRLF);
    vCal = vCal &  writeoutput('METHOD:PUBLISH'& CRLF);
    for(i=1; i LTE getEvents.RecordCount; i=i+1){
    vCal = vCal &  writeoutput('BEGIN:VEVENT'& CRLF);
    vCal = vCal &  writeoutput('SUMMARY:'&getEvents.naam[i]& CRLF);
    vCal = vCal &  writeoutput('UID:'&getEvents.project_id[i]& CRLF);
    vCal = vCal &  writeoutput('SEQUENCE:0'& CRLF);
    vCal = vCal &  writeoutput('STATUS:CONFIRMED'& CRLF);
    vCal = vCal &  writeoutput('TRANSP:OPAQUE'& CRLF);
    vCal = vCal &  writeoutput('DTSTART;TZID=Europe/Amsterdam:'&reReplace(getEvents.start[i],"[-:]","","all")& CRLF);
    vCal = vCal &  writeoutput('DTEND;TZID=Europe/Amsterdam:'&reReplace(getEvents.eind[i],"[-:]","","all")& CRLF);
    vCal = vCal &  writeoutput('DTSTAMP:'&reReplace(getEvents.start[i],"[-:]","","all")& CRLF);
    vCal = vCal &  writeoutput('LOCATION:'&getEvents.room[i]& CRLF);
    vCal = vCal &  writeoutput('DESCRIPTION:'&getEvents.omschrijving[i]&'\n\n\n'&getEvents.meeting_url[i]& CRLF);
    vCal = vCal &  writeoutput('URL:'&application.webUrl& CRLF);
    vCal = vCal &  writeoutput('END:VEVENT'& CRLF);             
    }
    vCal = vCal &  writeoutput('END:VCALENDAR'& CRLF);  
    return Trim(vCal);
   }
   </cfscript>
   <cfcontent type="text/calendar" reset="Yes">
   <cfheader name="Content-Disposition" value="inline;    filename=churchbookAgenda.ics">    <cfoutput>#iCalUS(eventStr)#</cfoutput>`

现在我想使用:

  vCal = vCal &  writeoutput('LOCATION:'&valuelist(getEvents.room[i])& CRLF);

当我这样做时,我得到一个错误:变量 [SomeRoomName] 不存在。当我删除 [i] 时,它可以工作,但我得到了查询中找到的所有位置。

 vCal = vCal &  writeoutput('LOCATION:'&valuelist(getEvents.room)& CRLF);

标签: coldfusioncfmllucee

解决方案


评论太长了。

如果您使用标签而不是脚本,这会更容易。这将允许你这样做:

<cfoutput query = "getEvents" group = "a suitable field from your query">
code for stuff you only want to appear once
<cfoutput>
generate your list of rooms here
</cfoutput>
</cfoutput>

我不知道是否有一个与此等效的简单脚本。

编辑从这里开始

如果要使用脚本和值列表,可以在循环中使用queryExecutewith 。您可以在此处dbtype="query"找到一个非常简单的示例。您所要做的就是将这个一般想法应用于您自己的情况。


推荐阅读