CFML (ColdFusion Markup Language)

1: När skall variablar och uttryck vara inom #-tecken?  
2: När jag använder # för färger (exempelvis #FF00FF) får jag ett ColdFusion-fel. Hur åtgärdar jag det?  
3: Varför ser jag #var# i min genererade sida istället för värdet av variabeln?  
4: Vad används Verity till?  
5: Kan villkorliga taggar vara inkapslade i CFML?  
6: Kan en fil på något sätt veta sitt egna filnamn?  
7: Jag har en sida där jag använder cfincludes för sidhuvud och sidfot. Nu vill jag lägga till ett cfmail-formulär i sidfoten för kontakt med webbmastern. När e-postmeddelandet har skickats vill jag lägga till en länk till den sida som användaren skickade sina kommentarer från, exempelvis "tillbaka till sidan jag var på". Hur kan löser jag detta?  
8: Varför blir tomma element i en kommaseparerad ColdFusion-lista ignorerade?  
9: När och varför behövs citattecken för SQL-uttryck i <CFQUERY>?  
10: Bör jag använda taggarna <CFINSERT> och <CFUPDATE>?  
11: Min mailserver kräver en inloggning för att jag ska få skicka e-post. Hur kan jag, via ColdFusion, ange inloggningsuppgifter?  
12: Kan man i ett och samma e-postmeddelande både skapa en text- och HTML-version?  
13: Jag skickar e-postmeddelanden till en lista med flera mottagare och skulle behöva se vilka som misslyckas nå mottagaren av olika skäl. Hur gör jag det?  
14: Hur kan jag få fram datum, tid och storlek på en fil?  
15: Kan ColdFusion läsa eller nå filer på klientens dator?  
16: Kan ColdFusion avgöra vilken användare klienten är inloggad som?  
17: Hur kan jag överföra filer mellan klientens browser och ColdFusion?  
18: Hur skapar jag ett formulär som ska användas för filuppladdning?  
19: Hur når och hanterar jag uppladdade filer?  
20: REQUEST scope, vad är det?  
21: Hur får man en session att avslutas när browsern stängs?  
22: När ska jag använda <CFLOCK>?  
23: Vad är skillnaden mellan låsning av typerna EXCLUSIVE och READONLY?  
24: Hur kan jag skapa en variabel genom att använda en variabel i variabelnamnet?  
25: Hur kan jag få fram värdet ur en variabel som fått ett dynamiskt namn?  
26: Hur kan jag få en lista på kolumner som en query returnerar?  
27: Hur kan jag få en lista på alla mottagna FORM-fält eller URL-parametrar?  
28: Hur kan jag direkt nå specifik data från en query?  
29: Hur kan jag skapa utskriftbara PDF-filer med ColdFusion?  


1: När skall variablar och uttryck vara inom #-tecken?
I CFML används # för att markera start och slut för en ColdFusion-variabel eller uttryck för att skilja dessa från strängar. Alltså, i ett block mellan <CFOUTPUT> och </CFOUTPUT> (som i själva verket är en sträng) måste alla variablar och uttryck sättas inom #-tecken. Inom en tagg antas dock data vara variablar och uttryck vilket gör att man inte behöver sätta # runt dessa. Exempelvis i <CFSET x=y+1> behöver man inte sätta # runt x eller y. Regeln är enkel, använd #-tecken där ColdFusion antar eller förväntar sig att innehållet är en sträng.
2: När jag använder # för färger (exempelvis #FF00FF) får jag ett ColdFusion-fel. Hur åtgärdar jag det?
Tecknet # används av COldFusion för att avgränsa variablar eller uttryck. Om ColdFusion hittar ett #-tecken så förväntas det finnas ett likadant tecken i slutet av variabeln eller uttrycket. Om man vill använda # som just ett #-tecken måste man lägga till dubbla tecken. Exemplet i frågan skulle alltså behöva se ut enligt ##FF00FF för att fungera.
3: Varför ser jag #var# i min genererade sida istället för värdet av variabeln?
Detta beror nästan uteslutande på att man missat att lägga variabeln mellan <CFOUTPUT> och </CFOUTPUT>.
4: Vad används Verity till?
Verity är en motor för fulltextsökning. Man använder Verity för att utföra flexibla och snabba sökningar efter angivna texter. Verity används i ColdFusion på två sätt: 1) Du kan använda Verity för att söka efter innehåll i filer, exempelvis textfiler, wordfiler etc. 2) Verity kan användas för att söka efter text i databaser, speciellt i memo eller textfält som kan vara ganska långa). I ColdFusion används <CFSEARCH> för sökningar med Verity.
5: Kan villkorliga taggar vara inkapslade i CFML?
Ja, taggar för villkor och flödeskontroll, som <CFIF> och <CFLOOP>, kan absolut vara kapslade (placerade inuti andra taggar). Noteras skall dock att djup inkapsling kan påverka prestanda så man bör kapsla in med förnuft.
6: Kan en fil på något sätt veta sitt egna filnamn?
Det finns flera sätt: cgi.script_name pekar både på sökväg och filnamn. Om din fil exempelvis låg i en katalog under webbroten som hette stuff och hette foo.cfm skulle värdet av cgi.script_name bli /stuff/foo.cfm. En annan cgi-variabel, cgi.cf_template_path ger den fulla sökvägen till den aktuella filen. Du kan också använda CF-funktionen getCurrentTemplateath. Om du bara vill ha filnamnet från dessa värden, använd funktionen getFileFromPath.
7: Jag har en sida där jag använder cfincludes för sidhuvud och sidfot. Nu vill jag lägga till ett cfmail-formulär i sidfoten för kontakt med webbmastern. När e-postmeddelandet har skickats vill jag lägga till en länk till den sida som användaren skickade sina kommentarer från, exempelvis "tillbaka till sidan jag var på". Hur kan löser jag detta?
När du skapar länken till sidan med kommentarsformuläret så lägger du helt enkelt med den nuvarande sidans namn. Exempel: <cfset ref = cgi.script_name & "?" & cgi.query_string> <a href="feedback.cfm?ref=#urlEncodedFormat(ref)#"> Sidan med formuläret får i url.ref vilket är url'en tillsammans med eventuell frågesträng. Nu kan du spara värdet i ett gömt(hidden) formulärsfält och när sedan formuläret skickas kan du enkelt använda cflocation för att flytta användaren tillbaka eller skapa en dynamisk länk som han kan klicka på. Detta är också användbart i de fall du har ett loginformulär. Du kan modifiera ovanstående så att en användare som du till exempel tvingar logga in vid något tillfälle kan komma tillbaka till den sida han var på.
8: Varför blir tomma element i en kommaseparerad ColdFusion-lista ignorerade? Comments
ColdFusion-listor är inte CSV-listor och beter sig inte som sådana. ColdFusion ignorerar tomma listelement vilket gör att ListLen("a,b,,d,e") returnerar 4 (inte 5) och ListGetAt("a,b,,d,e",5) genererar ett fel. Använd Replace() och byt ut alla ",," med ", ," för att konvertera en ColdFusion-lista till en CSV-lista. Mellanslag är ett giltigt tecken och kommer inte ignoreras av ColdFusion.
9: När och varför behövs citattecken för SQL-uttryck i <CFQUERY>?
Allt innehåll inom <CFQUERY> och </CFQUERY> skickas till databasen via databasdrivrutinen som det är. SQL-frågor eller kommandon måste vara giltiga enligt den SQL-syntax som finns. Alla strängar (eller variablar som används som strängvärden) måste anges mellan enkla citattecken. Likaså måste alla datum och tider vara formaterade som giltiga datum- och tidsvärden.
10: Bör jag använda taggarna <CFINSERT> och <CFUPDATE>?
Det finns ingen anledning att inte göra det om du kan. Du bör dock vara uppmärksam på att dessa taggar har begränsningar. De fungerar bara med FORM-fält och de kräver att FORM-fälten har samma namn som namnen på tabellfälten. Du kan inte förändra eller processa informationen på något sätt och primärnyckeln måste även den anges i ett FORM-fält, exempelvis via ett hidden-fält.
11: Min mailserver kräver en inloggning för att jag ska få skicka e-post. Hur kan jag, via ColdFusion, ange inloggningsuppgifter?
I ColdFusion MX 6.1 lade man till support för SMTP-inloggning. Du kan antingen skicka inloggningsinformationen i <CFMAIL>-taggen via attributen USERNAME och PASSWORD eller så kan du ange uppgifterna i ColdFusion Administrator med följande syntax: användare:lösenord@servernamn.
12: Kan man i ett och samma e-postmeddelande både skapa en text- och HTML-version?
Detta kan man göra från och med ColdFusion MX 6.1 via den nya <CFMAILPART>-taggen. Följande kodexempel visar hur man kan göra detta:
<CFMAIL TO="..." FROM="..." SUBJECT="...">
   <CFMAILPART TYPE="text">

   Detta är textversionen.
   </CFMAILPART>
   <CFMAILPART TYPE="html">
   <B>Detta är HTML-versionen.</B>
   </CFMAILPART>

</CFMAIL>
13: Jag skickar e-postmeddelanden till en lista med flera mottagare och skulle behöva se vilka som misslyckas nå mottagaren av olika skäl. Hur gör jag det?
I <CFMAIL> finns ett attribut som heter FAILTO. Där anger du till vilken adress felmeddelanden ska skickas. Du ange en annan adress än den normala svarsadressen, exempelvis en separat brevlåda som bara samlar alla fel:
<CFMAIL TO="#email#"
        FROM="admin@myhost.com"

        FAILTO="listadmin@myhost.com" ...>
...
</CFMAIL>
14: Hur kan jag få fram datum, tid och storlek på en fil?
<CFDIRECTORY> används för att hantera kataloger och dess innehåll. Med ACTION="list" får man fram filinformation som datum, tid, storlek och attribut.
15: Kan ColdFusion läsa eller nå filer på klientens dator?
Nej. Eftersom ColdFusion körs på servern så kan den inte göra något på klientens dator. Faktum är att den enda informationen ColdFusion får från klienten är det som browsern skickar, ingenting annat. Det betyder att ColdFusion inte kan nå klientbaserade Access-filer, Word-dokument, filer, bilder eller någonting som inte är direkt uppladdat till servern.
16: Kan ColdFusion avgöra vilken användare klienten är inloggad som?
Detta är något som utvecklare verkligen vill kunna göra. Att dynamiskt få reda på användarinformation och använda detta för säkerhetskontroll i sina egna applikationer skulle vara väldigt användbart men det är ingenting som serverteknologier likt ColdFusion kan. Om det hade fungerat skulle det också innebära en stor säkerhetsrisk. Enda sättet att få denna information är att ha en applikation på klientsidan som skickar informationen till servern (det skulle kunna vara en Java-applet eller ActiveX-kontroll till exempel).
17: Hur kan jag överföra filer mellan klientens browser och ColdFusion?
Det säkraste sättet att överföra filer från klienten är att göra det via HTTP. ColdFusion kan också nå filer via HTTP eller FTP men detta fungerar bara om datorn som filerna finns på kör en HTTP- eller FTP-server vilket inte de flesta klienter gör.
18: Hur skapar jag ett formulär som ska användas för filuppladdning?
Du måste skapa ett formulär där du sätter attributet ENCTYPE i taggen <CFFORM> till "multipart/form-data" och sedan lägga till ett formulärsfält av typen file (TYPE="file"). Formuläret som visas innehåller då ett fält och en knapp för att välja fil. När sedan formuläret skickas kommer den valda filen att laddas upp till ColdFusion. Här är ett exempel:
<FORM ACTION="process.cfm"
      ENCTYPE="multipart/form-data"

      METHOD="post">
File: <INPUT TYPE="file" NAME="FileToUpload">
<BR>
<INPUT TYPE="submit" VALUE="Upload">
19: Hur når och hanterar jag uppladdade filer?
Filer som laddats upp i HTML-formulär hanteras genom taggen <CFUPLOAD ACTION="upload">. Denna tagg ger dig möjlighet att spara den uppladdade filen och döpa om den. Du kan också välja att enbart acceptera vissa filtyper etc.
20: REQUEST scope, vad är det?
Ett scope är ett område för variablar. Området REQUEST är likt VARIABLES på så sätt att det är kopplat till en enskild förfrågan och innehållet bara existerar under tiden för sidans bearbetning. Skillnaden mellan REQUEST och VARIABLES är att REQUEST är tillgängligt även för andra sidor som bearbetas samtidigt, exempelvis Custom Tags.
21: Hur får man en session att avslutas när browsern stängs?
Detta gör man enkelt med ColdFusion MX. Gå in i ColdFusion Administrator, välj Memory Variables och klicka i "Use J2EE session variables". I tidigare versioner av ColdFusion använde sessions-variablarna cookies (kallade CFID och CFTOKEN) för att identifiera klienterna. Standardförfarandet var att dessa sparades på disk vilket gjorde att sessionerna låg kvar även efter att browsern stängts. Vill man undvika detta kan man göra om dessa cookies till sk. browser cookies (cookies som slutar gälla när browsern stängs). Följande exempel visar hur dessa skrivs:
<CFCOOKIE NAME="cfid" VALUE="#SESSION.cfid#">
<CFCOOKIE NAME="cftoken" VALUE="#SESSION.cftoken#">
22: När ska jag använda <CFLOCK>?
Syftet med <CFLOCK> är att kontrollera samtidigt användande av kod eller ett scope. I versioner före ColdFusion MX fanns det en begränsning som gjorde att samtidig access utan låsning kunde medföra minnesproblem och därmed serverproblem. Detta problem finns inte i ColdFusion MX men det finns fortfarande goda anledningar att använda <CFLOCK>. Först och främst bör man låsa kod som inte är säkrad för fleranvändning (exempelvis kan detta vara tredjeparts-taggar, access till filsystem etc) för att försäkra sig om att access sker sekventiellt och inte samtidigt. Sedan är det så att även om man inte riskerar rena serverproblem genom att inte låsa delade scope så kan det innebära att applikationen beter sig felaktigt. Ett exempel är om man uppdaterar ett antal variablar i APPLICATION-scopet utan att låsa det, så kan det bli så att vissa användare får gamla variablar och vissa nya. Detta behöver inte vara ett problem, beroende på applikationen, men man bör tänka på att <CFLOCK> kan vara bra i vissa sammanhang.
23: Vad är skillnaden mellan låsning av typerna EXCLUSIVE och READONLY?
<CFLOCK> stödjer två typer av låsningar, EXCLUSIVE och READONLY. EXCLUSIVE innebär att man förhindrar access för all annan kod. READONLY är egentligen ingen fullständig låsning utan mer en flagga som markerar kod som bara exekveras om det inte finns en aktiv EXCLUSIVE-låsning. Det är viktigt att använda låsning av typen READONLY då ColdFusion annars skulle kunna exekvera den koden även om du hade en aktiv EXCLUSIVE-låsning. Utan låsningen skulle ColdFusion inte ha kunna veta att koden inte skulle exekveras i det läget.
24: Hur kan jag skapa en variabel genom att använda en variabel i variabelnamnet?
Tricket är att omgärda hela variabelnamnet inom citattecken och sedan sätta #-tecken runt variabeln i namnet. Här är ett exempel:
<!--- Set i --->
<CFSET i=1>

<!--- Skapa variabeln product1 dynamiskt --->
<CFSET "product#i#"="apple">
<!--- Visa variabeln product1  --->
<CFOUTPUT>#product1#</CFOUTPUT>
25: Hur kan jag få fram värdet ur en variabel som fått ett dynamiskt namn?
Man kan konstruera variabelnamn dynamisk och sedan använda funktionen Evaluate() för att få fram värdet. Här är ett exempel:
<!--- Set i --->
<CFSET i=1>
<!--- Visa variabeln product1 --->
<CFOUTPUT>#Evaluate("product#i#")#</CFOUTPUT>
26: Hur kan jag få en lista på kolumner som en query returnerar?
Varje query, eller databasfråga, innehåller en variabel som heter columnlist och denna får man fram som query.columnlist, där query är namnet på din query.
27: Hur kan jag få en lista på alla mottagna FORM-fält eller URL-parametrar?
URL och FORM är uppbyggda som ColdFusion-strukturer och kan användas som vilken struktur som helst. Man kan till exempel dumpa innehållet, anropa enskilda fält och använda <CFLOOP> för att loopa genom URL- och FORM-fälten.
28: Hur kan jag direkt nå specifik data från en query?
Man kan nå specifika rader och kolumner i en query, genom att hantera dem som strukturer och arrays. Du kan peka på en specifik kolumn genom att använda formen #query.column[row]#. Om du till exempel vill ha fram kolumnen "pris" från den femte raden i en query kallad "produkter" skulle du använda uttrycket #produkter.pris[5]#. Detta är speciellt användbart då man behöver loopa genom en query för att utföra någon form av behandling av resultatet.
29: Hur kan jag skapa utskriftbara PDF-filer med ColdFusion?
Från och med ColdFusion MX 7 kan man generera PDF-filer med taggen <cfdocument>.
Hem  |  Faq  |  Cfblog  |  Artiklar  |  Kalender  |  Länkar  |  Aktuellt  |  Kontakt  |  Sajtkarta
2010 © ColdFusion User Group Sweden