Boolean type fields enjoy a strange place in Marketo's Velocity implementation.
On the Marketo UI side and via most Marketo APIs, Booleans hold consistent true/false values (presumably using SQL bit type fields under the hood).
But in Velocity, as I've explored before, a Boolean field is presented as one of two Strings:
- "1" for Boolean true
- "" (empty string) for Boolean false
That conversion is actually really confusing.
See, Velocity inherits a lot of things (variable handling things) from Java.
In Java, a non-null String object, on its own, is always evaluated as Boolean true. Regardless of whether it has any characters in it (that is, regardless of whether it's empty).
So if you do:
#if( $lead.someBooleanField ) Field is true #else Field is false #end
You will always get “Field is true” even if you've unchecked the corresponding checkbox in the Marketo UI.
If Marketo Booleans were Velocity/Java Booleans, on the other hand, this would've worked fine. But alas.
So the question is what to do with these sort-of-Boolean-like-Strings (whose meaning we understand, but the VTL language doesn't). What do we convert them to to make them more usable?
You can do a step-by-step conversion to Boolean by doing a String comparison:
#if( $lead.someBooleanField.equals("1") ) #set( $lead.someBooleanField == true ) #else #set( $lead.someBooleanField == false ) #end
After that conversion, #if($field) w
ill work as expected.
But I've been thinking lately that maybe converting those Strings to Numbers — 0
for false and 1 for true, as the standard goes — gives us more juice within Velocity than if we were to go with true Booleans.