Solved

Problem with ToString in Coldfusion

Posted on 2010-11-23
20
733 Views
Last Modified: 2012-05-10
#Replace("<strong>" & ToString(qBusiness.businessName) & "</strong><br />"

This section of the code above is driving me crazy.  This code is a section of code being used for google maps.

Instead of listing business names and use emails the code works.  The only thing I can think of that is not allowing this to work would be blank spaces.

Any insight on this would be great.  If you want me to paste all the code I will.

Thanks
<cfoutput query="qBusiness">

    var address_0_#qBusiness_id# = {

      street: '#Replace("" & ToString(qBusiness.streetAddress) & "", "'", "\'")#',

      city: '#Replace("" & ToString(qBusiness.city) & "", "'", "\'")#',

      state: '#Replace("" & ToString(qBusiness.state) & "", "'", "\'")#',

      zip: '#Replace("" & ToString(qBusiness.postalCode) & "", "'", "\'")#',

      country: '',

      infowindow: 'custom',

      infowindowtext: '<span style="font: 12px Verdana, Arial, Helvetica, sans-serif; color: black;">#Replace("<strong>" & ToString(qBusiness.businessName) & "</strong><br />" & ToString(qBusiness.streetAddress) & "<br />" & ToString(qBusiness.city) & ", " & ToString(qBusiness.state) & " " & ToString(qBusiness.postalCode) & "", "'", "\'")#</span>',

      full: '#Replace("" & ToString(qBusiness.streetAddress) & "", "'", "\'")#, #Replace("" & ToString(qBusiness.city) & "", "'", "\'")#, #Replace("" & ToString(qBusiness.state) & "", "'", "\'")#, #Replace("" & ToString(qBusiness.postalCode) & "", "'", "\'")#',

Open in new window

0
Comment
Question by:sonicimpulse
  • 12
  • 8
20 Comments
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
If the values are being used in javascript you typically want to use either: JSStringFormat or ToScript (not ToString)

http://livedocs.adobe.com/coldfusion/8/functions_in-k_46.html
http://livedocs.adobe.com/coldfusion/8/functions_t-z_05.html#188861

I think that'll fix the problem. But if not
1) Can you explain what you mean by "doesn't work"?
2) What's an example of a #qBusiness.businessName# value that doesn't work?

0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
ToScript takes a string and escapes special characters so it's safe to use in javascript (or actionscript). ToString converts something that is *not* a string (integer, binary, etc..) into a string.
0
 

Author Comment

by:sonicimpulse
Comment Utility
I get the following error with ToScript

Parameter validation error for the TOSCRIPT function.  
The function accepts 2 to 4 parameters.  

The values are as follow.

businessName will out put "myMobi Saver"
email will output "ken2@mymobisaver.com

Whats weird is the city, state, and zip out puts correctly.

I attached the entire code below.  Its line 153 in dreamweaver that creating the problem.
function WAMapRef(mapObj)  {

  this.obj = mapObj;

  this.directions = false;

  this.icons = [];

  this.markers = [];

  this.addresses = [];

  this.points = [];

  this.getPointByAddress = getPointByAddressFunc;

  this.addressFailed = true;

  return this;

}



function WAMapPoint(theMarker, theAddress, theIcon)  {

  this.icon = theIcon;

  this.marker = theMarker;

  this.address = theAddress;

  return this;

}



function getPointByAddressFunc(value,attname)  {

  if (!attname) attname = "street";

  for (var x=0; x < this.addresses.length; x++) {

    if (eval("this.addresses[x]."+attname) == value)  {

      return WAMapPoint(this.markers[x],this.addresses[x],this.icons[x]);

    }

  }

  return false;

}



function getHTTPObject(){   

  if (window.ActiveXObject)        

    return new ActiveXObject("Microsoft.XMLHTTP");   

  else if (window.XMLHttpRequest)        

    return new XMLHttpRequest();   

  else {

    return null;

  }

}



function searchCache(searchStr, zip) {

	var xmlDoc = null;

  if (window.ActiveXObject) {//IE

    xmlDoc=new ActiveXObject("Microsoft.XMLDOM");

  } else if(navigator.userAgent && navigator.userAgent.toLowerCase().indexOf('webkit') >= 0) { //webkit (Safari, Chrome)

  	var coordinates = '';

    xmlDoc = getHTTPObject();

    if(xmlDoc) {

      xmlDoc.onreadystatechange = function() {

        if(xmlDoc.readyState == 4) {

          var x = xmlDoc.responseXML.getElementsByTagName("geocode_entry");

          var geocode, id;

          searchStr = searchStr.replace(/,/g, ''); //remove commas

          for (i=0; i < x.length; i++) {

            id = x[i].getAttribute("ID");

            if (id == searchStr) {

              coordinates = x[i].getElementsByTagName("geocode")[0].childNodes[0].nodeValue;

              return coordinates;

            }

          }

        }

      };

      xmlDoc.open("GET", "_promaps_cache/_promaps_geocache.xml", false);

      xmlDoc.send(null);

    }

    

    return coordinates;

  } else if (document.implementation.createDocument) {//gecko (Mozilla, Firefox, Opera)

    xmlDoc=document.implementation.createDocument("","",null);

  } else {

    return '';

  }

  if (xmlDoc != null) {

    xmlDoc.async=false;

    try {

      if(xmlDoc.load("_promaps_cache/_promaps_geocache.xml")) {

        var x=xmlDoc.getElementsByTagName("geocode_entry");

        var geocode, id;

        searchStr = searchStr.replace(/,/g, ''); //remove commas

        for (i=0; i < x.length; i++) {

          id = x[i].getAttribute("ID");

          if (id == searchStr) {

            return x[i].getElementsByTagName("geocode")[0].childNodes[0].nodeValue;

          }

        } 

      } 

    }

    catch(err) {

      return '';

    }

  }

  return '';

}



function addToCache(fullAddress,zip, geocode){

  httpObject = getHTTPObject();

  if (httpObject != null) {

    httpObject.open("POST", "google_javascript/promaps_geocache_cfm.cfm", true);

    httpObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    var entryId = fullAddress.replace(/,/g, '');

    if (zip != '') {

      fullAddress = fullAddress.replace(zip+',', '');

    }

    entryId = escape(entryId);

    fullAddress = escape(fullAddress);

    geocode = escape(geocode);

    httpObject.send("sender=promapsforgoogle&action=add&entryId="+entryId+"&address="

+fullAddress+"&geocode="+geocode);

  }

}





function wagmp_map_1() {

  if(GBrowserIsCompatible()) {

    if(!document.getElementById('wagmp_map_1')) return false;

    var map = new GMap2(document.getElementById('wagmp_map_1'));

    wagmp_map_1_obj = new WAMapRef(map);

    map.enableContinuousZoom();

    map.enableDoubleClickZoom();

    map.addControl(new GSmallMapControl());

    map.addControl(new GMapTypeControl());

    var geocoder = new GClientGeocoder();

    

    var fromAddress = {

      enabled: false,

      street: '<cfoutput></cfoutput>',

      city: '<cfoutput></cfoutput>',

      state: '<cfoutput></cfoutput>',

      zip: '<cfoutput></cfoutput>',

      country: '<cfoutput></cfoutput>',

      full: ''

    };



    var icon_0 = new GIcon();

    icon_0.image = 'google_javascript/images/flag_deepjungle.png';

    icon_0.shadow = 'google_javascript/images/flag_shadow.png';

    icon_0.iconSize = new GSize(31,35);

    icon_0.shadowSize = new GSize(31,35);

    icon_0.iconAnchor = new GPoint(4,27);

    icon_0.infoWindowAnchor = new GPoint(8,3);

    icon_0.printImage = 'google_javascript/images/flag_deepjungle.gif';

    icon_0.mozPrintImage = 'google_javascript/images/flag_deepjungle_mozprint.png';

    icon_0.printShadow = 'google_javascript/images/flag_shadow.gif';

    icon_0.transparent = 'google_javascript/images/flag_deepjungle_transparent.png';

<cfset qBusiness_id=0>

<cfoutput query="qBusiness">

    var address_0_#qBusiness_id# = {

      street: '#Replace("" & ToString(qBusiness.streetAddress) & "", "'", "\'")#',

      city: '#Replace("" & ToString(qBusiness.city) & "", "'", "\'")#',

      state: '#Replace("" & ToString(qBusiness.state) & "", "'", "\'")#',

      zip: '#Replace("" & ToString(qBusiness.postalCode) & "", "'", "\'")#',

      country: '',

      infowindow: 'custom',

      infowindowtext: '<span style="font: 12px Verdana, Arial, Helvetica, sans-serif; color: black;">#Replace("<strong>" & ToScript(qBusiness.businessName) & "</strong><br />" & ToString(qBusiness.streetAddress) & "<br />" & ToString(qBusiness.city) & ", " & ToString(qBusiness.state) & " " & ToString(qBusiness.postalCode) & "", "'", "\'")#</span>',

      full: '#Replace("" & ToString(qBusiness.streetAddress) & "", "'", "\'")#, #Replace("" & ToString(qBusiness.city) & "", "'", "\'")#, #Replace("" & ToString(qBusiness.state) & "", "'", "\'")#, #Replace("" & ToString(qBusiness.postalCode) & "", "'", "\'")#', 

      isdefault: true,

      addressType: 'address',

      loop: 'qBusiness',

      latitude: '',

      longitude: '',

      markerStyle: 'Flag',

      markerColor: 'Deep Jungle'

    };

    

    if (address_0_#qBusiness_id#.addressType == "coordinates") {

      var cacheReturn = '';

    } else {

      var cacheReturn = searchCache(address_0_#qBusiness_id#.full, address_0_#qBusiness_id#.zip);

    }

    if (cacheReturn != "" || (address_0_#qBusiness_id#.addressType == "coordinates")) {

      if(address_0_#qBusiness_id#.addressType == "coordinates") {

        var latitude = address_0_#qBusiness_id#.latitude;

        var longitude = address_0_#qBusiness_id#.longitude;

      } else {

        var latitude = cacheReturn.substring(1,cacheReturn.indexOf(",")-1);

        var longitude = cacheReturn.substring(cacheReturn.indexOf(",")+1,(cacheReturn.length)-1);

      }

      var point = new GLatLng(latitude, longitude);

      if (point && !isNaN(latitude)) {

        wagmp_map_1_obj.addressFailed = false;

        var marker_0_#qBusiness_id# = new GMarker(point, icon_0);

        GEvent.addListener(marker_0_#qBusiness_id#, 'click', function() {

          marker_0_#qBusiness_id#.openInfoWindowHtml(address_0_#qBusiness_id#.infowindowtext);

        });

        if(!fromAddress.enabled || 'address_0_#qBusiness_id#' != 'address_0_0') {

          if('address_0_#qBusiness_id#' == 'address_0_0')

          map.setCenter(point, 13);

          map.addOverlay(marker_0_#qBusiness_id#);

if('address_0_#qBusiness_id#' == 'address_0_0')

            marker_0_#qBusiness_id#.openInfoWindowHtml(address_0_#qBusiness_id#.infowindowtext);

        }

          wagmp_map_1_obj.markers.push(marker_0_#qBusiness_id#);

          wagmp_map_1_obj.addresses.push(address_0_#qBusiness_id#);

          wagmp_map_1_obj.icons.push(icon_0);

          wagmp_map_1_obj.points.push(point);

        } else {

        if (wagmp_map_1_obj.addressFailed) {

          map.setCenter(new GLatLng(30, -98), 3);

        }

        wagmp_map_1_obj.addressFailed = true;

      }

    } else if (address_0_#qBusiness_id#.addressType == "address") {

      geocoder.getLatLng (

      address_0_#qBusiness_id#.full,

      function(point) {

        if(point) {

          this.addressFailed = false;

          addToCache(address_0_#qBusiness_id#.full, '', point);

          var marker_0_#qBusiness_id# = new GMarker(point, icon_0);

          GEvent.addListener(marker_0_#qBusiness_id#, 'click', function() {

            marker_0_#qBusiness_id#.openInfoWindowHtml(address_0_#qBusiness_id#.infowindowtext);

          });

          if(!fromAddress.enabled || 'address_0_#qBusiness_id#' != 'address_0_0') {

            if('address_0_#qBusiness_id#' == 'address_0_0')

            map.setCenter(point, 13);

            map.addOverlay(marker_0_#qBusiness_id#);

if('address_0_#qBusiness_id#' == 'address_0_0')

            marker_0_#qBusiness_id#.openInfoWindowHtml(address_0_#qBusiness_id#.infowindowtext);

          }

              wagmp_map_1_obj.markers.push(marker_0_#qBusiness_id#);

          wagmp_map_1_obj.addresses.push(address_0_#qBusiness_id#);

          wagmp_map_1_obj.icons.push(icon_0);

          wagmp_map_1_obj.points.push(point);

        

        } else {

          var noZipAddress = address_0_#qBusiness_id#.full.replace((address_0_#qBusiness_id#.zip+','), '');

          geocoder.getLatLng (noZipAddress,

            function(point) {

              if(point) {

                wagmp_map_1_obj.addressFailed = false;

                addToCache(address_0_#qBusiness_id#.full, address_0_#qBusiness_id#.zip, point);

                var marker_0_#qBusiness_id# = new GMarker(point, icon_0);

                GEvent.addListener(marker_0_#qBusiness_id#, 'click', function() {

                  marker_0_#qBusiness_id#.openInfoWindowHtml(address_0_#qBusiness_id#.infowindowtext);

                });

                if (!fromAddress.enabled || 'address_0_#qBusiness_id#' != 'address_0_0') {

                  if('address_0_#qBusiness_id#' == 'address_0_0')

                  map.setCenter(point, 13);

                  map.addOverlay(marker_0_#qBusiness_id#);

if('address_0_#qBusiness_id#' == 'address_0_0')

            marker_0_#qBusiness_id#.openInfoWindowHtml(address_0_#qBusiness_id#.infowindowtext);

                }

                    wagmp_map_1_obj.markers.push(marker_0_#qBusiness_id#);

          wagmp_map_1_obj.addresses.push(address_0_#qBusiness_id#);

          wagmp_map_1_obj.icons.push(icon_0);

          wagmp_map_1_obj.points.push(point);

        

              } else {

                if (wagmp_map_1_obj.addressFailed) {

                  map.setCenter(new GLatLng(30, -98), 3);

                }

                  wagmp_map_1_obj.addressFailed = true;

              }

            }

          );

        }

      }

    );

  }

<cfset qBusiness_id=qBusiness_id+1>

</cfoutput>





  }

}

Open in new window

0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
>> Whats weird is the city, state, and zip out puts correctly.
Ok.. but you still didn't explain what "not correct" means ;-)  Are you getting an error in FF/Firebug?


>> I get the following error with ToScript
Yeah, ToScript requires at 2 parameters minimum (ToScript(cfvar, javascriptvar, ....).  Try JSStringFormat() instead. It's simpler.

0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
Could you post the javascript code generated, or a link to a live page? It'd be easier to spot the problem.

Btw: I'm going to be heading to sleep soon.  It's been a loong day ;-)
0
 

Author Comment

by:sonicimpulse
Comment Utility
JSStringFormat does not work either. I'm not getting an error but no map.
Here is whats happening.

When I use an email the actual google map show up.  If I use a business name it does not show up at all.

Link below.
http://mymobisaver.com/indexbak.cfm

0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
Can you post a separate link showing the non-working business name?
0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
I tried to look a the page, but for some reason a view source of the page is killing FF/Firebug ... :(  Maybe all the javascript?  

Sorry - I hate to run out, but I have to go to sleep now :) I'll check back tomorrow, if you haven't figured it out by then.
0
 

Author Comment

by:sonicimpulse
Comment Utility
I narrowed done the problem.

the apostrophe " ' " in business names is causing the problem.  All I need to know is how do I fix the problem without taking that out of every business name?

If someones business names is KICK's it will not work only KICKs will.

0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
>> the apostrophe " ' " in business names is causing the problem

Something doesn't sound right. Single quotes are one of the special characters JSStringFormat escapes.  Notice how

      #JSFormat("Bob's Business")#

... becomes

       Bob\'s Business

Which works fine in javascript.  Without the JSStringFormat() it _doesn't_ work.

<cfoutput>
<script>
      var value1 = '<b>#JSStringFormat("Bob's Business")#</b>';
      alert(value1);
</script>
</cfoutput>

So are you *positive* you've applied the function correctly?

0
Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

 
LVL 52

Expert Comment

by:_agx_
Comment Utility
So are you *positive* you've applied the function correct

... meaning you use JSStringFormat() instead of Replace(). Because JSStringFormat handles more than just single quotes.

0
 

Author Comment

by:sonicimpulse
Comment Utility
Still does not work.  here is my code below with the JSStringFormat.

<span style="font: 12px Verdana, Arial, Helvetica, sans-serif; color: black;">#Replace("<strong>" & JSStringFormat(qBusiness.businessName) & "</strong><br />" & ToString(qBusiness.streetAddress) & "<br />" & ToString(qBusiness.city) & ", " & ToString(qBusiness.state) & " " & ToString(qBusiness.postalCode) & "", "'", "\'")#</span>',
0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
>> Still does not work.

No, you're not doing what I described ;-)

1) Get rid of the ToString()'s.  
The function doesn't do anything when the values are already strings!

2) Get rid of the Replace()'s.  
That's what JSStringFormat() is for. It handles more than replace(). Including both functions will cause errors.

3) Try a simple example with JSStringFormat() only.  Get a small example working 1st.

<cfset qBusiness.businessName = "Bob's buisiness">
<cfset qBusiness.streetAddress = "address blah">
<cfset qBusiness.city = "Seattle">
<cfset qBusiness.state = "WA">
<cfset qBusiness.postalCode = "00000">
<cfoutput>
<script>
	var test = '<span style="font: 12px Verdana, Arial, Helvetica, sans-serif; color: black;"><strong>#JSStringFormat(qBusiness.businessName)#</strong><br />#JSStringFormat(qBusiness.streetAddress)#<br />#JSStringFormat(qBusiness.city)#, #JSStringFormat(qBusiness.state)# #JSStringFormat(qBusiness.postalCode)#</span>';
	alert(test);
</script>
</cfoutput>

Open in new window


4) Watch out for line breaking in the middle of the string. It can sometimes cause problems.

0
 

Author Comment

by:sonicimpulse
Comment Utility
I get a message from from webpage with your example.

I'm not really good with this yet so thanks for the help so far.
0
 
LVL 52

Accepted Solution

by:
_agx_ earned 500 total points
Comment Utility
Generating big strings is always a pain when quotes are involved.  Sometime it's easier to create a CF variable with the html first. Then convert the 1 variable to javascript




<!--- 

    create a CF variable w/html first 

--->	

<cfsavecontent variable="MyOutput">

<cfoutput>

<span style="font: 12px Verdana, Arial, Helvetica, sans-serif; color: black;">

	<strong>#qBusiness.businessName#</strong><br />

	#qBusiness.streetAddress#<br />

	#qBusiness.city#, #qBusiness.state# #qBusiness.postalCode#

</span>

</cfoutput>

</cfsavecontent>



<!--- then pass it to javascript --->

<cfoutput>

<script>

	var test = '#JSStringFormat(MyOutput)#';

	alert(test);

</script>

</cfoutput>

Open in new window

0
 

Author Comment

by:sonicimpulse
Comment Utility
Even if I use your example:

<span style="font: 12px Verdana, Arial, Helvetica, sans-serif; color: black;"><strong>#JSStringFormat(qBusiness.businessName)#</strong><br />#JSStringFormat(qBusiness.streetAddress)#<br />#JSStringFormat(qBusiness.city)#, #JSStringFormat(qBusiness.state)# #JSStringFormat(qBusiness.postalCode)#</span>'

Still the map will not show. I'm not getting any errors just no map.
0
 

Author Comment

by:sonicimpulse
Comment Utility
There has to be away to pass single quotes into a variable with in Java.
0
 

Author Closing Comment

by:sonicimpulse
Comment Utility
Thanks so much I found out what I was doing wrong.  Its works now.
0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
Can you post a *small* standalone example we can test? Because the string works in a simple test, so obviously there's more going on in the map.
0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
Didn't see your last post before responding.  So what was the problem? :)
0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Join & Write a Comment

Hi, I will be creating today a basic tutorial on how we can create a Mail Custom Function and use it where ever we want. The main advantage about creating a custom function is that we can accommodate a range of arguments to pass to the Function and …
Load balancing is the method of dividing the total amount of work performed by one computer between two or more computers. Its aim is to get more work done in the same amount of time, ensuring that all the users get served faster.
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now