Author: cbrisson
Date: Tue Oct  2 15:01:33 2018
New Revision: 1842631

URL: http://svn.apache.org/viewvc?rev=1842631&view=rev
Log:
[VELOCITY-902] docfix - plus add how to test for special values

Modified:
    velocity/site/cms/trunk/content/engine/2.0/user-guide.mdtext
    velocity/site/cms/trunk/content/engine/devel/user-guide.mdtext

Modified: velocity/site/cms/trunk/content/engine/2.0/user-guide.mdtext
URL: 
http://svn.apache.org/viewvc/velocity/site/cms/trunk/content/engine/2.0/user-guide.mdtext?rev=1842631&r1=1842630&r2=1842631&view=diff
==============================================================================
--- velocity/site/cms/trunk/content/engine/2.0/user-guide.mdtext (original)
+++ velocity/site/cms/trunk/content/engine/2.0/user-guide.mdtext Tue Oct  2 
15:01:33 2018
@@ -431,53 +431,7 @@ The RHS can also be a simple arithmetic
     #set( $value = $foo * $bar )
     #set( $value = $foo / $bar )
 
-If the RHS is a property or method reference that evaluates to *null*, it will 
<b>not</b> be assigned to the LHS. Depending on how Velocity is configured, it 
is usually not possible to remove an existing reference from the context via 
this mechanism. (Note that this can be permitted by changing one of the 
Velocity configuration properties). This can be confusing for newcomers to 
Velocity.  For example:
-
-    :::velocity
-    #set( $result = $query.criteria("name") )
-    The result of the first query is $result
-
-    #set( $result = $query.criteria("address") )
-    The result of the second query is $result
-
-If *$query.criteria("name")* returns the string "bill", and 
*$query.criteria("address")* returns *null*, the above VTL will render as the 
following:
-
-    The result of the first query is bill
-
-    The result of the second query is bill
-
-This tends to confuse newcomers who construct *#foreach* loops that attempt to 
*#set* a reference via a property or method reference, then immediately test 
that reference with an *#if* directive.  For example:
-
-    :::velocity
-    #set( $criteria = ["name", "address"] )
-
-    #foreach( $criterion in $criteria )
-
-        #set( $result = $query.criteria($criterion) )
-
-        #if( $result )
-            Query was successful
-        #end
-
-    #end
-
-In the above example, it would not be wise to rely on the evaluation of 
*$result* to determine if a query was successful.  After *$result* has been 
*#set* (added to the context), it cannot be set back to *null* (removed from 
the context).  The details of the *#if* and *#foreach* directives are covered 
later in this document.
-
-One solution to this would be to pre-set *$result* to *false*.  Then if the 
*$query.criteria()* call fails, you can check.
-
-    :::velocity
-    #set( $criteria = ["name", "address"] )
-
-    #foreach( $criterion in $criteria )
-
-        #set( $result = false )
-        #set( $result = $query.criteria($criterion) )
-
-        #if( $result )
-           Query was successful
-        #end
-
-    #end
+If the RHS is a property or method reference that evaluates to *null*, then 
the LHS will be set to null.
 
 Unlike some of the other Velocity directives, the *#set* directive does not 
have an *#end* statement.
 
@@ -545,6 +499,14 @@ The variable *$foo* is evaluated to dete
 
 (please note that this is the default behavior, but Velocity can be configured 
to [skip all checks beyond boolean and nullity 
ones](configuration.html#if-directive)).
 
+To test if a reference has a special values, you can use:
+
++ `#if ($ref == $null)` to specifically test for the null value (provided you 
didn't put anything in `$null`)
++ `#if ($ref == false)` to specifically test for the false value
++ `#if ($ref == '')` to specifically test for the empty string
++ `#if ($ref == 0)` to specifically test for zero
++ `#if ($ref.size() == 0)` to specifically test for an empty collection
+
 Remember that the Velocity context only contains Objects, so when we say 
'boolean', it will be represented as a Boolean (the class).  This is true even 
for methods that return `boolean` - the introspection infrastructure will 
return a `Boolean` of the same logical value.
 
 The content between the *#if* and the *#end* statements become the output if 
the evaluation is true. In this case, if *$foo* is true, the output will be: 
"Velocity!". Conversely, if *$foo* has a null value, or if it is a boolean 
false, the statement evaluates as false, and there is no output.

Modified: velocity/site/cms/trunk/content/engine/devel/user-guide.mdtext
URL: 
http://svn.apache.org/viewvc/velocity/site/cms/trunk/content/engine/devel/user-guide.mdtext?rev=1842631&r1=1842630&r2=1842631&view=diff
==============================================================================
--- velocity/site/cms/trunk/content/engine/devel/user-guide.mdtext (original)
+++ velocity/site/cms/trunk/content/engine/devel/user-guide.mdtext Tue Oct  2 
15:01:33 2018
@@ -431,53 +431,7 @@ The RHS can also be a simple arithmetic
     #set( $value = $foo * $bar )
     #set( $value = $foo / $bar )
 
-If the RHS is a property or method reference that evaluates to *null*, it will 
<b>not</b> be assigned to the LHS. Depending on how Velocity is configured, it 
is usually not possible to remove an existing reference from the context via 
this mechanism. (Note that this can be permitted by changing one of the 
Velocity configuration properties). This can be confusing for newcomers to 
Velocity.  For example:
-
-    :::velocity
-    #set( $result = $query.criteria("name") )
-    The result of the first query is $result
-
-    #set( $result = $query.criteria("address") )
-    The result of the second query is $result
-
-If *$query.criteria("name")* returns the string "bill", and 
*$query.criteria("address")* returns *null*, the above VTL will render as the 
following:
-
-    The result of the first query is bill
-
-    The result of the second query is bill
-
-This tends to confuse newcomers who construct *#foreach* loops that attempt to 
*#set* a reference via a property or method reference, then immediately test 
that reference with an *#if* directive.  For example:
-
-    :::velocity
-    #set( $criteria = ["name", "address"] )
-
-    #foreach( $criterion in $criteria )
-
-        #set( $result = $query.criteria($criterion) )
-
-        #if( $result )
-            Query was successful
-        #end
-
-    #end
-
-In the above example, it would not be wise to rely on the evaluation of 
*$result* to determine if a query was successful.  After *$result* has been 
*#set* (added to the context), it cannot be set back to *null* (removed from 
the context).  The details of the *#if* and *#foreach* directives are covered 
later in this document.
-
-One solution to this would be to pre-set *$result* to *false*.  Then if the 
*$query.criteria()* call fails, you can check.
-
-    :::velocity
-    #set( $criteria = ["name", "address"] )
-
-    #foreach( $criterion in $criteria )
-
-        #set( $result = false )
-        #set( $result = $query.criteria($criterion) )
-
-        #if( $result )
-           Query was successful
-        #end
-
-    #end
+If the RHS is a property or method reference that evaluates to *null*, then 
the LHS will be set to null.
 
 Unlike some of the other Velocity directives, the *#set* directive does not 
have an *#end* statement.
 
@@ -545,6 +499,14 @@ The variable *$foo* is evaluated to dete
 
 (please note that this is the default behavior, but Velocity can be configured 
to [skip all checks beyond boolean and nullity 
ones](configuration.html#if-directive)).
 
+To test if a reference has a special values, you can use:
+
++ `#if ($ref == $null)` to specifically test for the null value (provided you 
didn't put anything in `$null`)
++ `#if ($ref == false)` to specifically test for the false value
++ `#if ($ref == '')` to specifically test for the empty string
++ `#if ($ref == 0)` to specifically test for zero
++ `#if ($ref.size() == 0)` to specifically test for an empty collection
+
 Remember that the Velocity context only contains Objects, so when we say 
'boolean', it will be represented as a Boolean (the class).  This is true even 
for methods that return `boolean` - the introspection infrastructure will 
return a `Boolean` of the same logical value.
 
 The content between the *#if* and the *#end* statements become the output if 
the evaluation is true. In this case, if *$foo* is true, the output will be: 
"Velocity!". Conversely, if *$foo* has a null value, or if it is a boolean 
false, the statement evaluates as false, and there is no output.


Reply via email to