Advanced ColdFusion 9 Development Replace with a graphic White Master 5.5” Tall & 4.3” Wide Unit 5: Developing Advanced GUI’s Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 1 Topics Introducing ColdFusion AJAX functionality Debugging ColdFusion AJAX Applications Making Background Data Requests Developing the User Interface Working with Bind Expressions Submitting Form Data Asynchronously Using Special Text Input Fields Working with <cfgrid> Visualizing Data with Google Maps Working with Video ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 2 Introducing ColdFusion AJAX Functionality ColdFusion 9 supports a number of tags and functions to help you quickly build powerful AJAX applications. Direct hooks for integrating with Adobe Spry and making data requests to components Data binding, with only minimal knowledge of JavaScript Some of the technology was licensed from third-parties EXT-JS 3.0 (http://www.extjs.com) Yahoo Interface Library (http://developer.yahoo.com/yui) FCK Editor (http://www.fckeditor.net) Google Maps (http://code.google.com) ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 3 ColdFusion 9 AJAX Features A CFML-based tag abstration layer for creating AJAX applications AJAX Debugger displaying background server communications and field binding activities. Container tags that lay out or display content Form elements that support data binding A menu tag that creates hierarchical DHTML menus User assistance features that provide tool tips, validation messages, and form completion Facilities for styling AJAX compoents Integration with Adobe Spry Integration with Google Maps A Flash-based media player, controllable from JavaScript, that plays multiple file formats Background server requests through ColdFusion’s AJAX framework are made to CFC methods with an access type of REMOTE Data returned from remote methods can be automatically converted into JavaScript Object Notation (JSON), XML (WDDX) or Plain text ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 4 Debugging ColdFusion AJAX Applications ColdFusion 9 includes a built-in debugger that monitors background server requests, reporting any errors that are encountered and enabling you to easily view the data returned from the server. Use Firebug or the Microsoft IE developer toolbar to view similar information, inspect the document object model, and dump the contents of complex javascript data structures. ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 5 Using the ColdFusion AJAX Logger Since AJAX applications send data requests to the server that are by definition, invisible, ColdFusion 9 includes a built-in debugger that monitors background server requests, reporting any errors that are encountered. Enable the AJAX Debug log window in the ColdFusion Administrator Pass the URL variable CFDEBUG to the page running AJAX components The ColdFusion AJAX Logger will appear right-justified on your page ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 6 The ColdFusion Logging API ColdFusion.Log.debug() ColdFusion.Log.dump() ColdFusion.Log.error() ColdFusion.Log.info() <script language=”Javascript”> var aData = [{lastname:”drucker”,firstname:”steve”}]; ColdFusion.Log.dump(aData); </script> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 7 Using Firebug Firebug is a free, open source plug-in for Firefox Available from http://getfirebug.com Very powerful and intuitive Inspect and edit HTML Tweak CSS Visualize CSS metrics Monitor network activity DOM inspection Logging ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 8 Using console.log() You can output content to the Firebug console using the following syntax: console.log (“Hello World”); You can pass as many arguments as you want to console.log and they will be concatenated into a row as indicated here: console.log(2,4,6,8,”foo”,bar); You can pass any kind of object to console.log() Complex data types will be displayed as hyperlinked elements, functions, arrays, and objects Clicking on a link inspects the data type using whichever Firebug tab is appropriate ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 9 Inspecting JavaScript Objects When you return data from the server as part of an AJAX call, its often helpful to inspect the data. Use console.dir() to inspect complex data types console.dir() logs an interactive listing of an object’s properties Calling console.dirxml(element) on any HTML or XML element displays an interactive tree-based XML outline ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 10 Walkthrough 1: Debugging AJAX Applications Enable the ColdFusion AJAX Logger. Use Firebug to inspect the contents of a JavaScript variable that contains data returned from an AJAX request. ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 11 Making Background Data Requests Use <cfsprydataset> to bind a cfc method result to a JavaScript variable Use controls that natively support binding to a CFC method such as <cftree> and <cfgrid> Use <cfajaxproxy> to create a client-side JavaScript proxy for a CFC and its methods Use the <cfajaxproxy> tag to bind fields of ColdFusion AJAX form controls as parameters to a specific CFC function, JavaScript function, or HTTP request, and specify JavaScript functions to handle successful or error results This course will not cover <cfsprydataset> or the Adobe Spry SDK ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 12 Returning Data from Remote CFC Methods Return data as either XML or in JavaScript Object Notation (JSON) Use a ColdFusion function to convert your abstract data-type into either XML or JSON inside your function and return the result as a string serializeJSON() deserializeJSON() isJSON() Use the RETURNFORMAT attribute of <cffunction> to specify the encoding standard as Plain, WDDX, or JSON Invoke the remote method by passing a url variable named RETURNFORMAT with a value of Plain, WDDX, or JSON Passing a url variable named RETURNFORMAT is preferred as it enables the user of your service to choose whichever format is the easiest for them to work with ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 13 Returning JSON Data JSON deserializes into native JavaScript data types, making it easier to parse than XML JSON is less verbose than XML, and therefore takes less time to download resulting in marginally faster execution, depending on the size of the dataset being transferred JSON is well-supported by all the popular AJAX libraries including EXTJS, jQuery, and Spry <cfajaxproxy>, <cfgrid>, and <cftree> automatically instruct your remote methods to encode ColdFusion data types as JSON ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 14 Example: Returning JSON Data (test.cfc) <cfcomponent> <cffunction name="test" access="remote" returntype="array"> <cfreturn ["A","B","C"]> </cffunction> </cfcomponent> (test.cfm) <a href=”test.cfc?method=test&returnformat=json”> Click here to download the results as JSON </a> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 15 Securing your AJAX Requests Use the verifyclient=”yes” attribute of <cffunction> so that the service can only be invoked via AJAX by other ColdFusion tags in your application. Enable a JSON Prefix ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 16 Using VerifyClient Requires remote invocations of the page or calls to functions on the page to include an encrypted security token. Helps prevent security attacks where an unauthorized party attempts to perform an action on the server You must enable client management or session management in your application for this feature to operate properly Using this feature restricts the invocation of your CFC method to pages that respond to client-side ColdFusion AJAX features Client-side CF AJAX features automatically send the proper security token Using this feature prevents a remote function from being invoked as a web service ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 17 Example: Using VerifyClient <cfcomponent> <cffunction name="test" access="remote" returntype="array" verifyclient="true"> <cfreturn ["A","B","C"]> </cffunction> </cfcomponent> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 18 Using a JSON Prefix Helps prevent JSON hijacking whereby a rogue site attempts to access JSON content during the period from which you have left the site, but your login credentials have not expired. Prefixing your JSON with invalid JSON syntax prevents the rogue site’s script from properly interpreting the JSON ColdFusion’s AJAX tags automatically strips the JSON prefix before evaluating your JSON data If you are writing custom JavaScript that invokes a remote CFC method using the returnformat=JSON URL parameter, you will need to add code to strip the prefix before evaluating the JSON response There are several ways to enable the JSON prefix: In the ColdFusion Administrator (Server Settings > Settings) In the Application.cfc <cfset this.secureJSON = true> <cfset this.secureJSONPrefix = “//”> In the <cffunction> declaration: <cffunction secureJSON=”true” name=”r1” access=”remote”> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 19 Using <cfajaxproxy> Allows you to register and invoke CFC methods in the background from JavaScript. Define a success handler that will receive a native Javascript data type returned from your component methods Define an error handler that executes if the specified component method fails for any reason Basic Syntax: <cfajaxproxy cfc = "CFC name" jsclassname = "JavaScript proxy class name"> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 20 Example: Using <cfajaxproxy> (test.cfm) <cfajaxproxy cfc="test" jsclassname="cfcTest"> <script language="JavaScript"> errorHandler = function(statusCode,statusMsg) { alert(statusCode + ': ' + statusMsg) } successHandler = function(result){ alert(result); } getdata = function() { /* instantiate CFC */ var remoteRequestObj = new cfcTest(); /* configure responders */ remoteRequestObj.setErrorHandler(errorHandler); remoteRequestObj.setCallbackHandler(successHandler); /* invoke method */ remoteRequestObj.echo("this is a test"); } </script> <cfform> <cfinput type="button" name="btn" value="Click Me" onClick="getdata()"> </cfform> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 21 Walkthough 2: Making Background Requests with <cfajaxproxy> Secure a web service so that it may only be invoked by ColdFusion code located on the same server Use <cfajaxproxy> to build an AJAX proxy for the spell-check service that you created in unit 3 ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 22 Developing the User Interface Container tags, such as dialog boxes and draggable windows Form / Input tags that allow for data binding and a rich set of interactivity Menu tags that create a x-browser DHTML hierarchical menu User Assistance tags that support features like autosuggest. tooltips, and progress bars ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 23 Using Container Tags <cfdiv> Defines an area of a page that can have its contents dynamically updated without the need for a page reload By default, it outputs a <div> tag Can be used to output any HTML tag that supports a closing component <cfpod> Creates an area, wrapped as a box, that includes an optional title bar Has independent scroll bars <cflayout> Used to control the appearance of content nested in <cflayoutarea> tags Content can be arranged into different formats tabs / accordion expanding/collapsing grid horizontal / vertical scrolling regions Use the fittowindow attribute to have the layout control automatically adjust to the window size A Javascript API exists that enables you to programatically modify a layout - ColdFusion.Layout.methodname <cflayoutarea> Denotes virtual “pages” of information inside of a <cflayout> Attribute usage varies depending on the type of <cflayout> <cfwindow> Creates a virtual “pop-up” window within the browser A draggable, scrolling window that cannot be blocked by popup-blockers API enables client-side creation - ColdFusion.Window.createWindow() ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 24 Using <cfdiv> to create a redraw region The <cfdiv> tag creates an independent re-drawable area of the screen By default, generates an HTML <div> tag along with Javascript functions to dynamically replace its content Content can be generated from a variety of sources A Javascript function A URL on the same server A CFC method Data typed into form fields on the same page ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 25 Example: Using <cfdiv> <cfform> Complete the sentence below: <cfinput type="text" name="modifier"> <cfinput type="submit" name="btnsubmit"> </cfform> My instructor is a <cfdiv bind="{modifier@keyup}" tagName="span"> person Note: You will learn about bind expressions later in this unit ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 26 Using <cfpod> to display web content in a dialog box The <cfpod> tag allows you to wrap content in a box containing a title bar Unlike <cfwindow>, the boxes drawn by <cfpod> cannot be dragged at runtime by the end-user Pod content can be defined by either specifying a URL through it's SOURCE attribute, or, alternatively by placing HTML/CFML between its starting and ending tags While <cfpod> does allow you to change its header and body styles, it can only be positioned on screen through the use of the <cflayout> tag ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 27 Working with <cfpod> syntax <cfpod source = "path" bodyStyle = "CSS style specification" headerStyle = "CSS style specification" height = "number of pixels” name = "string" onBindError = "JavaScript function name" title = "string" width = "number of pixels"/> or <cfpod bodyStyle = "CSS style specification" headerStyle = "CSS style specification" height = "number of pixels" name = "string" onBindError = "JavaScript function name" title = "string" width = "number of pixels"> pod contents </cfpod> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 28 Using <cfajaximport> If the SOURCE attribute of <cfpod> or any other container tag points to a ColdFusion file that itself contains other ColdFusion AJAX-aware tags, you must place a <cfajaximport> tag on the calling page Use <cfajaximport> to specify the path to ColdFusion’s CFFORM scriptSrc directory, if it is located somewhere other than /CFIDE/scripts <cfajaximport> also enables you to specify an alternative location for the CSS files used in ColdFusion’s AJAX controls The params attribute enables you to specify a Google Maps key If you use a ColdFusion AJAX JavaScript function on a page that does not otherwise import any AJAX JavaScript functions, use the <cfajaximport> tag without any attributes import the base JavaScript functions ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 29 <cfajaximport> syntax <cfajaximport cssSrc = "local URL path" params = "parameters" scriptSrc = "local URL path" tags = "comma-delimited list"> Example: <html> <head><title></title></head> <body> <cfajaximport tags="cflayout-tab,cfform" > <cfpod title="Edit Article" source="cflayout.cfm" /> </body> </html> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 30 Using <cflayout> to define tabs and collapsible sections The <cflayout> tag creates a region on screen that can be configured as one of several different types of layouts Border A box with a border and up to five layout areas. Layout areas can be set to be collapsible and closeable HBox A horizontal box where all child components are stacked horizontally VBox A vertical box where all child components are arranged vertically Tab A tabbed display where each child component occupies the full width/height of the defined layout area and the user can toggle the display of each Accordion Similar in functionality to a tabbed panel, it enables you to compress many fields into a compact space. The immediate children of a <cflayout> tag must be <cflayoutarea> tags or nondisplay tags whose bodies contain one or more <cflayoutarea> tags at the top level ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 31 Using <cflayout> <cflayout type="border|hbox|tab|vbox|accordion" activeOnTop=”true|false” align="center|justify|left|right” fillHeight=”true|false” fillWidth=”true|false” fitToWindow=”true|false” name="string" padding="integer" style="CSS style specification" tabHeight="measurement" tabPosition="top|bottom" tabStrip=”true|false” titleCollapse=”true|false” width=”integer” height=”integer”> cflayoutarea tags </cflayout> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 32 Using <cflayoutarea> to define virtual pages of a layout A child tag of <cflayout> Sets properties of semi-autonomous regions within the overall layout Properties vary depending on layout type Border HBOX/VBOX Tab Accordion See pages 5-19, 5-20 for attribute list ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 33 <cflayout> example <cfform style="padding-top:0px; margin-top:0px;"> <cflayout type="tab“ name="CrimeRecord" tabheight="300"> <cflayoutarea name="CrimeDetails" title="Crime Details"> Details of crime go here </cflayoutarea> <cflayoutarea title="Narrative" name="Narrative"> Wysiwyg area for Narrative goes here </cflayoutarea> </cflayout> <div align="center"> <cfinput type="submit“ name="btnSubmit" value="Save"> </div> </cfform> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 34 Working with the <cflayout> JavaScript API <cflayout> has a series of JavaScript functions that can be used to programatically control layout areas through client-side scripting The function names are case-sensitive ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 35 <cflayout> JavaScript API Functions ColdFusion.Layout.collapseArea() ColdFusion.Layout.selectTab() ColdFusion.Layout.createTab() ColdFusion.Layout.hideTab() ColdFusion.Layout.disableTab() ColdFusion.Layout.showTab() ColdFusion.Layout.enableTab() ColdFusion.Layout.hideAccordion() ColdFusion.Layout.getBorderLayout() ColdFusion.Layout.showAccordion() ColdFusion.Layout.getTabLayout() ColdFusion.Layout.selectAccordion() ColdFusion.Layout.expandArea() ColdFusion.Layout.collapseAccordion() ColdFusion.Layout.showArea() ColdFusion.Layout.expandAccordion() ColdFusion.Layout.hideArea() ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 36 Example: <cflayout> JavaScript API <script language="JavaScript"> function fnHelp() { ColdFusion.Layout.createTab( 'CrimeRecord', 'help', 'Help', 'tabhelp.cfm', { inithide:false, selected:true, closable:true } ) } </script> <cfform style="padding-top:0px; margin-top:0px;"> <cflayout type="tab“ name="CrimeRecord” tabheight="300"> <cflayoutarea name="CrimeDetails” title="Crime Details"> Details of crime go here </cflayoutarea> <cflayoutarea title="Narrative" name="Narrative"> Wysiwyg area for Narrative goes here </cflayoutarea> </cflayout> <div align="center"> <cfinput type="submit“ name="btnSubmit" value="Save"> <cfinput type="button" onClick="fnHelp()" name="btnHelp" value="Help"> </div> </cfform> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 37 Using <cfwindow> The <cfwindow> tag allows you to embed a draggable window into your web page Similar to <cfpod>, but supports additional features Automatic centering on a page Draggable Modal Closable Resizable You can specify initial position Full JavaScript API Impervious to popup blockers ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 38 Deploying <cfwindow> <cfwindow bodyStyle = "CSS style specification" center="true|false" closable="true|false" draggable="true|false" headerStyle = "CSS style specification" height="number of pixels" initShow="false|true" minHeight="number of pixels" minWidth="number of pixels" modal="true|false" name="string" onBindError = "JavaScript function name" refreshOnShow = "false|true" resizable="true|false" source="path" title="string" width="number of pixels" x="numeric pixel coordinate" y="numeric pixel coordinate"> window contents </cfwindow> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 39 Using the <cfwindow> JavaScript API ColdFusion.Window.show(‘name’); ColdFusion.Window.onShow(); ColdFusion.Window.hide(‘name’); ColdFusion.Window.onHide(); ColdFusion.Window.create(); ColdFusion.Window.getWindowObject(); ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 40 Using <cfwindow> <cfwindow center="yes" width="200" height="150" name="mywindow" title="My First Window" closable="true" draggable="true" resizable="true" initshow="true"/> <cfform> <cfinput type="button" name=”btnShow” value="Show" onClick="ColdFusion.Window.show('mywindow')"> <cfinput type="button" name=”btnHide” value="Hide" onClick="ColdFusion.Window.hide('mywindow')"> </cfform> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 41 Walkthrough 3: Using Layout Controls Define a tabbed-based layout Use the ColdFusion <cflayout> API ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 42 Working with Bind Expressions Enables you to create dependencies between form elements, client-side recordsets, ColdFusion AJAX container elements, and information fetched from background data requests Bindings minimize the need to develop custom JavaScript You cannot use a bind expression to bind to controls in a dynamically loaded region (i.e. a <cflayoutarea> tag that specifies a SOURCE attribute or a <cfselect> that specifies a QUERY attribute) ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 43 Working with Bind Expression Syntax You can bind data to all AJAX-aware ColdFusion tags The syntax varies, depending on the source of the data and the tag that is using the expression Type Bind Expression Syntax CFC Method CFC:componentpath.functionName(params) JavaScript function javascript:functionName(params) URL url:URL?params URL URL?params String / Field Concatenation A string containing one or more instances of a bind parameter such as: {firstname}.{lastname}@{domain} ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 44 Example: Bind Expressions (test.cfc) <cfcomponent> <cffunction name="echo" access="remote" returntype="string" securejson="true" > <cfargument name="myinput" type="string"> <cfreturn myinput> </cffunction> </cfcomponent> (test.cfm) <cfdiv bind="cfc:test.echo('This is a test')" /> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 45 Binding Text Fields with the @modifier Input field bindings are specified by placing the name of the field in curly braces, i.e. a text field named myfield is represented in a bind expression as {formname:myfield}, or simply {myfield} Use the @keyup modifier to cause a binding to update as a user types data into a dependent field Use @click to cause a binding to update when a user clicks in a field Without using the modifier, the binding updates when the cursor focus changes to a different field In the following example, the email field is updated as a user types into either the firstname, lastname, or email fields: Do not use @keyup with CFC bind expressions as it would trigger a CFC request every time the user types a character into a bound field. ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 46 Example: Binding Textfields with the @modifier <cfform> First Name:<br /> <cfinput type="text" name="firstname"><br /> Last Name:<br > <cfinput type="text" name="lastname"><br /> Domain:<br> <cfinput type="text" name="domain"><br /> E-Mail:<br /> <cfinput type="text" name="email“ bind="{firstname@keyup}.{lastname@keyup}@{domain@keyup}"> <br /> <cfinput name="btnSubmit" type="submit"> </cfform> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 47 Example: Binding to a JavaScript Function <html> <head> <script language="javascript"> emailAddress = function(firstname,lastname,domain) { return (firstname.substring(0,1) + lastname + '@' + domain); } </script> </head> <body> <cfform> First Name:<br /> <cfinput type="text" name="firstname"><br /> Last Name:<br /> <cfinput type="text" name="lastname"><br /> Domain:<br /> <cfinput type="text" name="domain"><br /> E-Mail:<br /> <cfinput type="text" name="email" bind="javascript:emailAddress({firstname@keyup},{lastname@keyup},{domain@keyup})"> <br/> <cfinput name="btnSubmit" type="submit"> </cfform> </body> </html> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 48 Binding to <cfselect> Binding to text fields requires that your bind expression return a string By default, bind expressions in a <cfselect> are used to populate its OPTIONS array To populate the select box options your bind expression must return a two-dimensional array The first element represents the VALUE attribute of the <option> tag The second element represents the TEXT attribute of the <option> tag There is no built-in support for specifying the SELECTED attribute of a bound option One strategy for specifying the SELECTED option of a select-one box is to arrange your array so that the selected item is at array position zero ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 49 Example: Binding to <cfselect> <script language=”JavaScript”> getOffenses = function(offense) { aData = new Array(); aData[0] = new Array(); /* set default option if necessary*/ if (offense == null || offense == '') { offense = "Please Select"; } /* set first option in array to selected item*/ aData[0][0] = offense; aData[0][1] = offense; /* Use <cfoutput> to cache options in browser */ <cfoutput query="qCrimeTypes"> aData[#currentrow#]=new Array(); aData[#currentrow#][0] = '#jsStringFormat(qCrimeTypes.offense)#'; aData[#currentrow#][1] = '#jsStringFormat(qCrimeTypes.offense)#'; </cfoutput> /* remove selected item */ for (var i=1; i<aData.length; i++) { if (aData[i][0] == offense) aData.splice(i,1); } } return aData; } </script> ... <cfselect name="offense" bind="javascript:getOffenses({mydataset.OFFENSE@click})“ bindonload="true" /> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 50 Using a Bind Expression with <cfajaxproxy> You can configure <cfajaxproxy> to execute based on a change of form data This approach requires that you code less Javascript for event-driven structures than the <cfajaxproxy> examples presented earlier in this unit <cfajaxproxy> syntax using a bind expression uses the following syntax: <cfajaxproxy bind = "bind expression" onError = "JavaScript function name" onSuccess = "JavaScript function name"> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 51 Example: <cfajaxproxy> with bind expression <cfajaxproxy bind="cfc:employee.getlastnamebyid({userid})" onerror="errorHandler" onsuccess="successHandler"> <script language="JavaScript"> errorHandler = function(statusCode,statusMsg) { alert(statusCode + ': ' + statusMsg) } successHandler = function(result) { document.forms[0].lastname.value = result; } </script> <cfform> Enter a user id: <cfinput type="text" name="userid" value=""><br /> Last Name: <cfinput type="text" name="lastname" value=""><br /> </cfform> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 52 Walkthrough 4: Using Bind Expressions Modify the data entry form from the prior walkthrough to make background data requests and populate form fields Use <cfajaxproxy> to connect to a remote CFC method Use bind expressions to populate different types of form fields ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 53 Submitting Form Data Asynchronously By default when a form is submitted the layout container that holds the form will be overwritten by the result from the form's ACTION page You can override this default behavior by using the ColdFusion 9 javascript method ColdFusion.Ajax.submitForm() The method sends your form data through the XMLHttpRequest() object, posting it to whatever URL you wish Note that you could also submit form data directly to ColdFusion CFC methods through the <cfajaxproxy> technique discussed previously. Use ColdFusion.Ajax.submitForm() to quickly AJAX-enable pre-existing forms Due to a limitation in the underlying XMLHttpRequest() object, you are not be able to post <input type="file"> fields The content generated by the action page is returned to the callback handler function -- so be sure to trim extraneous whitespace from your output You will need to explicitly invoke CFFORM validation and/or code your own clientside validation routines ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 54 Using ColdFusion.Ajax.submitForm() <script language="JavaScript"> ColdFusion.Ajax.submitForm( formId, URL [ ,callbackhandler ,errorhandler ,httpMethod ,asynch] ); </script> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 55 Explicitly invoking CFFORM Validation CFFORM validation is invoked by applying REQUIRED and VALIDATE attributes to your <CFINPUT> tags. ColdFusion.Ajax.submitForm() does not invoke the generated client-side javascript validation functions The name of the controller function is _CF_checkformname where formname is the value of the name attribute assigned to your form The validation function returns true if all fields comply with their validation rules You should pass the entire form as a Javascript object to the generated form validation function as indicated here: if (_CF_checkmyform(document.myform)) { /* your form data passed! Now submit it! */ } ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 56 Retrieving Object/Attribute Values Use the ColdFusion JavaScript API method ColdFusion.getElementValue() in order to get the value of an attribute of a bindable ColdFusion control Supports most CF input widgets cfgrid cfinput (checkbox, datefield, file, hidden, radio, text) cfselect cftextarea cftree if (ColdFusion.getElementValue('offense') == { alert("You must select an offense"); return; } 'Please Select') ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 57 Building the Action Page Whatevever content is output on the action page is returned to the ColdFusion.Ajax.submitForm() success method Submit your form variables for processing to a CFC method Disable CF debugging output on the action page using <cfsetting showdebugoutput=”false”> Tightly control whitespace generation using <cfsetting enablecfoutputonly=”true”> The following example illustrates a typical action page which pases form data to a CFC method and tightly controls the text output that is transmitted to the ColdFusion.Ajax.submitForm() success handler: ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 58 Example: AJAX Action Page <cfsetting showdebugoutput="no"> <cfsetting enablecfoutputonly="true"> <!--- write to db ---> <cfset cfcCrimeService = createObject("#application.settings.cfcpath#crime").init( application.googleMapKey, form.id, form.blocksiteaddress, "Washington", "DC", 0.1)> <cfset cfcCrimeService.update( form.offense, '', form.narrative, form.reportdatetime )> <cfoutput>Record #form.id# Saved</cfoutput> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 59 Deploying ColdFusion.Ajax.submitForm() See example, pages 5-41, 5-42 ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 60 Walkthrough 5: Asynchronously Submitting Forms Programatically trigger ColdFusion’s client-side form validation routines Inspect the value of a <cfselect> box Submit form data to an action page asynchrously using ColdFusion.Ajax.submitForm() ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 61 Using Special Text Input Fields ColdFusion 9 has a series of rich form controls that extend the native functionality of a standard text field and textarea. These include the following: Autosuggest Graphical Date Chooser WYSIWYG Editor The AJAX form controls are derived from the EXT-JS 3.0 framework ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 62 Using Autosuggest Text Fields A variant on the standard <cfinput type="text"> field The goal is to limit the number of characters a user must type in order to select an item As a user types into the field, a box with suggestions appears beneath it The data that populates the selection list can be either statically declared, or can be read dynamically from a ColdFusion component method Use the AUTOSUGGESTMINLENGTH attribute to reduce the number of requests to the server and the amount of data that will be returned The basic syntax for implementing an autosuggest box is the following: <cfinput name="userName" type="text" autosuggest="Dave, Steve, Sue"> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 63 Using Autosuggest with a limited data set You can hardcode values into the AUTOSUGGEST attribute of <cfinput type="text"> as indicated below This method is best used when the data set is limited to fewer than one hundred entries <cfquery name="qs” cachedwithin="#createtimespan(365,0,0,0)#"> select statename from state order by statename </cfquery> <cfform> <div style="float: left“>Enter the State:</div> <cfinput name="statename" type="text" autosuggest="#valuelist(qs.statename)#"> <br /><br /> </cfform> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 64 Using Autosuggest with large data sets There may be scenarios where, due to data volume, it is not practical to specify the autosuggest data set as a comma delimited string Use a bind expression whereby a user's input is passed in the background to a ColdFusion component method The CFC method must be defined with ACCESS="REMOTE" The CFC method must return an array of strings The typed text can be passed into the CFC method using the {cfautosuggestvalue} bind parameter ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 65 Example: Using Autosuggest with large data sets <!--- (cfc method) ---> <cffunction name="getCrimeIDs” access="remote“ returntype="array“ output="false"> <cfargument name="searchstring" type="String"> <cfset local.q = ""> <cfquery name="q" > select id from crime where convert(id,char(10)) like <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.searchstring#%"> limit 0,10 </cfquery> <cfreturn listToArray(valuelist(q.id))> </cffunction> <!--- front-end GUI ---> <cfinput type="text” name="id" validate="numeric" autosuggest="cfc:#application.settings.cfcpath#crimeservice.getCrimeIDs( {cfautosuggestvalue})"> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 66 Customizing Autosuggest Behavior autosuggestBindDelay autosuggestMinLength delimiter matchContains maxResultsDisplayed onBindError showAutosuggestLoadingIcon typeahead ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 67 Working with the DateField Selector Like the autosuggest feature, the graphical date chooser is implemented through the <cfinput> tag Gives the user a date entry field with an expanding calendar from which users select the date or dates The user has the option to type in a date instead of using the gui selector You can customize the appearance of the calendar Use the dayNames attribute to specify acomma-delimited list that sets the names of the weekdays displayed in the calendar The monthNames attribute controls the names of the months that appear in the calendar. Specify as a comma delimited list. The firstDayOfWeek attribute is an integer in the range 0-6 that specifies the first day of the week in the calendar: 0 indicates Sunday; 6 indicates Saturday. ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 68 Example: Using the DateField Selector <label for="reportdatetime"> Report Date: </label> <cfinput type="datefield" name="reportdatetime" bind="{mydataset.REPORTDATETIME@click}" required="yes" validate="date" /> <br /> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 69 Using the WYSIWYG Editor Implemented through the <cftextarea richtext=”yes”> tag An abstraction layer for the CK Editor (www.ckeditor.com) Highly configurable allowing you to potentially restrict functionality to specific groups of users Develop custom toolbars Specify allowable styles Enable its built-in spell checker You cannot use the WYSIWYG editor if your ColdFusion server is configured to process htm files ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 70 <cftextarea> attributes Width Height fontFormats fontSizes MaxLength BasePath Skin sourceForTooltip Toolbar ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 71 Customizing the Editor Toolbar You can define custom toolbars for the editor by modifying the FCKConfig.Toolbarsets variable located in /CFIDE/scripts/ajax/FCKEditor/fckconfig.js file as indicated below Adding to the variable makes additional options available via the TOOLBAR attribute of <cftextarea> You will need to customize the editor in order to support uploading media, including images and Flash Additional developer documentation is available at http://docs.cksource.com ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 72 Example: Customizing the Editor Toolbar FCKConfig.ToolbarSets["MyCustomToolbar"] = [ ['Bold', 'Italic', '-', 'OrderedList', 'UnorderedList', '-', 'Link', 'Unlink', '-' ], [ 'Cut', 'Copy', 'Paste', '-', 'Image', 'Flash', 'About' ] ]; ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 73 Specifying Allowed WYSIWYG Styles You can configure specific styles to be supported by the editor Styles are defined using XML Default styles are defined in /CFIDE/scripts/ajax/FCKEditor/fckstyles.xml Create additional style definitions using the following syntax and link them to <cftextarea> using the STYLESXML attribute ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 74 Example: Adding WYSIWYG Styles <Styles> <Style name="Image on Left" element="img"> <Attribute name="style" value="padding: 5px; margin-right: 5px" /> <Attribute name="border" value="2" /> <Attribute name="align" value="left" /> </Style> <Style name="Image on Right" element="img"> <Attribute name="style" value="padding: 5px; margin-left: 5px" /> <Attribute name="border" value="2" /> <Attribute name="align" value="right" /> </Style> <Style name="Custom Bold" element="span"> <Attribute name="style" value="font-weight: bold;" /> </Style> <Style name="Custom Italic" element="em" /> <Style name="Title" element="span"> <Attribute name="class" value="Title" /> </Style> <Style name="Code" element="span"> <Attribute name="class" value="Code" /> </Style> <Style name="Title H3" element="h3" /> <Style name="Custom Ruler" element="hr"> <Attribute name="size" value="1" /> <Attribute name="color" value="#ff0000" /> </Style> </Styles> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 75 Using the <cftextarea richtext=”yes”> javascript API You can programatically get and set the data in a <cftextarea> using the following JavaScript methods: ColdFusion.RichText.getEditorObject(editorID).GetHTML() Retrieves the html contained by the WYSIWYG editor ColdFusion.RichText.setValue(editorID, replacementHTML) Replaces the contents of the WYSIWYG editor with the specified html function fnReplace(formID,WYSWYGID,searchFor,replaceTerm) { var msgbox = document.forms['myform'][WYSIWYGID].id; var html = ColdFusion.RichText.getEditorObject(msgbox).GetHTML(); ColdFusion.RichText.setValue(msgbox, html.replace(searchFor, replaceTerm)); } ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 76 Extending the WYSIWYG editor Review the following lins that detail how to unlock hidden features of <cftextarea> Implementing Spell Checking and File Uploads in the WYSIWYG editor http://www.rakshith.net/blog/?p=58 The CKEditor Documentation http://docs.cksource.com/ ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 77 Walkthrough 6: Implementing Rich Text Controls Define and configure an autosuggest field as well as its associated bindings Define and configure a datefield control Use <cftextarea> to invoke a CKEditor control ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 78 Working with <cfgrid> <cfgrid type=”html”> is AJAX-enabled and can load data incrementally from the server Allows for client-side sorting of rows Supports boolean column values (rendered as checkboxes) Supports drop-down lists in columns (combobox) Allows the user to choose from a datepicker from within date columns Allows for row grouping Supports a grid title Expand/collapse functionality Text fields can bind to grid data using bind=”{gridname.columnname}” ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 79 Deploying <cfgrid type=”html”> for use with large datasets Working with <cfgrid> and large datasets involves incrementally fetching “pages” of records from a ColdFusion component through a bind expression. Pagination Attributes: bind BindOnLoad PageSize PreservePageOnSort StripeRowColor StripeRows ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 80 Defining the Bind Expression Pass four variables to the CFC method responsible for returning dynamic data {cfgridpage} {cfgridpagesize} {cfgridsortcolumn} {cfgridsortdirection} Example: <cfgrid format="html" name="incidentGrid" collapsible="yes" title="Crime Incidents" bind="cfc:crimeservice.getForGrid({cfgridpage},{cfgridpagesize},{cfgridsortcolumn},{cfgridsortdirection})" striperows="yes” striperowcolor="cccccc" width="450" height="200" pagesize="5" autowidth="true" colheaderbold="true"> <cfgridcolumn name="reportdatetime" type="date" width="50" header="Date"> <cfgridcolumn name="offense" type="combobox" header="Offense" width="50"> <cfgridcolumn name="blocksiteaddress" type="string_noCase" header="Address" width="220"> </cfgrid> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 81 Returning Query Data for a Grid The CFC method access must equal REMOTE The CFC method must return a STRUCT The query data returned from the CFC must be returned through the ColdFusion function QueryConvertForGrid() QueryConvertForGrid() accepts the following arguments: The query to be converted The grid page number The number of rows per page ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 82 Example: Returning Data for a Grid <cffunction name="getforgrid" access="remote" returntype="struct" output="false"> <cfargument name="page"> <cfargument name="pageSize"> <cfargument name="gridsortcolumn"> <cfargument name="gridsortdirection"> <cfset local.q = ""> <cfif arguments.gridsortcolumn is ""> <cfset arguments.gridsortcolumn = "reportdatetime"> </cfif> <cfif arguments.gridsortdirection is ""> <cfset arguments.gridsortdirection = "asc"> </cfif> <cfquery name="q"> select blocksiteaddress,id, offense, narrative, DATE_FORMAT(reportdatetime,'%m/%d/%Y') as reportdatetime from crime order by <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.gridsortcolumn#”> <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.gridsortdirection#"> </cfquery> <cfreturn queryConvertForGrid (q,arguments.page,arguments.pagesize)> </cffunction> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 83 Making a Grid Editable <cfgrid> attributes: Use the selectmode=”edit” attribute to render a grid editable Use the delete=”yes” attribute to allow the users to delete rows Use insert=”yes” to allow users to insert rows Pass data from the grid to a ColdFusion component method by specifying a bind expression in the onchange attribute of the grid Date values must be in a supported format (i.e. mm/dd/yyyy) Specify <cfgridcolumn> types Boolean Date Combobox Numeric String_nocase ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 84 Example: Making a Grid Editable <cfgrid selectmode=”edit” name=”crimegrid” ... > <cfgridcolumn type="date" name="reportdatetime" width="50" header="Date"> <cfgridcolumn type="combobox" values="#valuelist(qoffenses.offense)#" name="offense" header="Offense" width="50" > <cfgridcolumn type="string_noCase" name="blocksiteaddress" header="Address“ width="220“> </cfgrid> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 85 Example: Making a Grid Editable ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 86 Using <cfgrid selectmode=”edit”> Bind Parameters The onchange bind expression should pass the following information to the CFC method {cfgridaction} {cfgridrow} {cfgridchanged} <cfgrid selectmode=”edit” onChange="cfc:#application.settings.cfcpath#.crimeservice.setFromGrid( {cfgridaction}, {cfgridrow}, {cfgridchanged})" .... </cfgrid> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 87 Saving Data from a Grid <cffunction <cfargument <cfargument <cfargument name="setFromGrid" access="remote" returntype="boolean" verifyclient="yes"> name="cfgridaction" required="yes" type="string" Hint="I, U or D"> name="cfgridrow" required="yes" type="struct"> name="cfgridchanged" required="yes" type="struct"> <cfswitch expression="#arguments.cfgridaction#"> <cfcase value="D"> <cfquery> delete from crime where id = <cfqueryparam cfsqltype="cf_sql_numeric" value="#arguments.cfgridrow.id#"> </cfquery> </cfcase> .... </cfswitch> <cfreturn true> </cffunction> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 88 Controlling a Grid using the JavaScript API Use ColdFusion.Grid.getGridObject() to access the underlying Ext JS library methods ColdFusion.Grid.refresh() forces the grid to reload and redisplay data ColdFusion.Grid.sort() programmatically sorts the grid There is not a native method for updating a grid’s contents The following method allows you to programmatically change the contents of a grid control: function gridSetElementValue(gridname,row,column,thevalue) { var objGrid = ColdFusion.Grid.getGridObject(gridname); objRow = objGrid.store.data.items[row]; objRow.set(column,thevalue); objGrid.view.refreshRow(row); } ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 89 Determining the active row The function must be declared within the <head> section of the page You must use ColdFusion’s ajaxOnLoad() function to invoke the event listener definition <script language="Javascript"> var selectedRow = 0; initGrid = function() { var grid = ColdFusion.Grid.getGridObject("incidentGrid"); grid.addListener("rowclick", function(objGrid, rowNumber, e){ selectedRow = rowNumber; }); } </script> <cfset ajaxOnload("initGrid")> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 90 Walkthrough 7: Using <cfgrid> Define an editable <cfgrid> control Bind a grid to a ColdFusion remote method Bind form fields to grid data Transmit grid updates to ColdFusion for processing Push data from form fields into a grid ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 91 Visualizing Data with Google Maps Currently, ColdFusion supports only embedding of Google maps To generate a map, you must provide a valid Google map API key You must specify a map center position as either a latitude/longitude or a valid street address End-users must be able to access subdomains of google.com from their web browsers and Javascript must be enabled You can attach custom events to map markers ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 92 Acquiring a Google Maps Key You must create a Google account in order to work with most of Google's API's If you already have a GMail account, then you're ready to proceed Sign up for a Google account at www.google.com/accounts/NewAccount License keys are tied to both your Google account and the domain name where your application will be hosted Get a free license key at http://code.google.com/apis/maps/signup.html Google Maps has specific licensing terms There is no limit on the number of page views you may generate per day using the Maps API There is a limit on the number of geocode requests per day The Maps API does not include advertising Your service must be freely accessible to end users You may not alter or obscure the logos or attribution on the map Maps should not be used to display illegal activity (such as locations to procure illicit drugs) or reveal personal information If your service is not freely accessible, you will need to contact Google to discuss paid-license terms ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 93 Acquiring a Google Maps Key ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 94 Registering your Google Maps Key with ColdFusion In the ColdFusion Administrator (Server Settings > Settings) Set this.googlemapkey in the Application.cfc file Use the <cfajaximport> tag <cfajaximport params="#{googlemapkey='Map API Key'}#"> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 95 Using <cfmap> and <cfmapitem> <cfmap> dictactes the overall look and feel of the map <cfmapitem> places map markers on the map You can the center position by using either the centeraddress attribute or the centerlatitude and centerlongitude attributes. ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 96 <cfmap> syntax <cfmap centeraddress="address" centerlatitude="latitude in degrees" centerlongitude="longitude in degrees" collapsible="true|false" continuouszoom="true|false" doubleclickzoom="true|false" height="integer" hideborder="" markerbind="bind expression" markercolor="marker color" markericon="icon path " markerwindowcontent="content" name="name" onerror="JavaScript function name" onload="JavaScript function name" overview="true|false" scrollwheelzoom="true|false" showallmarkers="true|false" showcentermarker="true|false" showmarkerwinodw=""true|false" showscale="true|false" tip="center property marker tips" title="string" type="map|satellite|hybrid|earth|terrain" typecontrol="none|basic|advanced" width="integer" zoomcontrol="none|small|large|small3d|large3d" zoomlevel="integer" <!--- zero or more <cfmapitem> tags ---> <cfmapitem address="address" latitude="latitude in degrees" longitude="longitude in degrees" markercolor="marker color" markericon="icon path " markerwindowcontent="content" name="name of the map" showmarkerwinodw=""true|false" tip="marker tip" /> </cfmap> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 97 Example: Using <cfmap> <cfmap centeraddress="#form.address# Washington, DC" type="map" width="400" height="200" typecontrol="basic" zoomcontrol="small3d" showcentermarker="true" showmarkerwindow="true" zoomlevel="17" name="crimemap" onload="resizeMap"> <cfloop query="qincidents"> <cfmapitem latitude = "#qincidents.lat#" longitude= "#qincidents.lng#" markercolor="FF3030" markerwindowcontent="<span class='map'>#qincidents.offense#<br />#qincidents.narrative#<br />#qincidents.reportdatetime#</span>"> </cfloop> </cfmap> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 98 Controlling a <cfmap> with JavaScript ColdFusion.Map.addEvent() ColdFusion.Map.addMarker() ColdFusion.Map.getLatitudeLongitude() ColdFusion.Map.getMapObject() ColdFusion.Map.setCenter() ColdFusion.Map.setZoomLevel() ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 99 Example: Adding a Map Event Listener ColdFusion.Map.addEvent("crimemap","click",function(overlay) { if (overlay != null) { var myPano = new GStreetviewPanorama(document.getElementById("streetview"), {latlng:overlay.getLatLng()}); } }); ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 100 Walkthrough 8: Using <cfmap> Use <cfmap> to instantiate a map Plot data points on a map Link the map to Google Street View ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 101 Working with Video <cfmediaplayer> Supports multiple formats FLV MP3 MP4 Progressive downloads and streamed content from a Flash Media Server via RTMP ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 102 <cfmediaplayer> syntax <cfmediaplayer align="alignment option" autoplay="true|false" bgcolor="hexadecimal value" hideborder="true|false" hidetitle="true|false" controlbar="true|false" fullScreenControl="yes|no" name="name" onComplete="JavaScript function name" onLoad="JavaScript function name" onStart="JavaScript function name" quality="low|high|medium" source="source name" style=="style specification" height="integer" width="integer" wmode="window|opaque|transparent"> </cfmediaplayer> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 103 Styling the Media Player Use the style attribute <cfmediaplayer name="myplayer" style="bgcolor:EDC393; titletextcolor:C0C0C0; titlebgcolor:EDC393; controlbarbgcolor:EDC393; controlscolor:FFFFFF; progressbgcolor:DDDDDD; progresscolor:A0B1D5; borderleft:20; borderright:20; bordertop:10; borderbottom:13" hideborder="false" hideTitle=false controlbar="true" source="myfile.flv"> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 104 Using the <cfmediaplayer> JavaScript API ColdFusion.Mediaplayer.resize() ColdFusion.Mediaplayer.setMute() ColdFusion.Mediaplayer.setSource() ColdFusion.Mediaplayer.setVolume() ColdFusion.Mediaplayer.startPlay() ColdFusion.Mediaplayer.stopPlay() ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 105 Example: Using the <cfmediaplayer> JavaScript API <script language=”JavaScript”> function playVideo(url) { ColdFusion.Mediaplayer.setSource(‘mediaplayer’,url); ColdFusion.Mediaplayer.startPlay(‘mediaplayer’); } </script> <select name="videourl“ onChange="playVideo(this.options[this.selectedIndex].value)”> <option value="/acfd9/assets/video/sample1.flv">Camera 1</option> <option value="/acfd9/assets/video/sample2.flv">Camera 2</option> </select> ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 106 Walkthrough 9: Using <cfmediaplayer> Use the <cfmediaplayer> tag to instantiate a media player Use the <cfmediaplayer> JavaScript API to play selected videos ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 107 Summary Use the ?debug url variable to help you troubleshoot ColdFusion-AJAX applications ColdFusion supports four layout tags - <cfwindow>, <cfpod>, <cflayout>, and <cfdiv> ColdFusion has a JavaScript API to programmatically manipulate layout controls on the client Use the BIND attribute to link form fields with data from CFC methods, URL's, and JavaScript Use the ColdFusion.Ajax.submitForm() method to post form data asynchronously ColdFusion 9 supports several "rich form" controls Message Box Progress Bar AutoSuggest WYSIWYG Grid Tree Datefield Use <cfmap> to plot locations on a Google Map You can extend the built-in functionality of AJAX controls by getting access to their underlying JavaScript objects Use <cfmediaplayer> to progressively download a video or stream one from a Flash Media Server ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 108 Unit Review How do you enable debugging of a CF-AJAX application? Describe the differences between <cfpod> and <cfwindow> What kind of data structure must be returned from a cfc method bound to an autosuggest element?. How can you create custom toolbars for the WYSIWYG editor? How do you incrementally populate an HTML grid with data from a CFC method? What information is required in order to plot a point on a Google Map? You cannot attach special click handlers to a Google Map (true/false)? Which video formats are supported by <cfmediaplayer>? ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 109 ® Copyright 2009 Adobe Systems Incorporated. All rights reserved. Adobe confidential. 1 110