Re: Simulating null parameters in macros
Attila Szegedi <[email protected]>
| Newsgroups | gmane.comp.web.freemarker.user |
|---|---|
| Message-ID | <[email protected]> |
You can check if it's not a scalar first:
<#if !param1?is_scalar || param1 != null)>
On Jul 5, 2011, at 9:21 AM, Hinkle, Cameron wrote:
> I asked this question on Stack Overflow but no one seemed to have an answer for me. Hoping someone here will:
>
> http://stackoverflow.com/questions/6553004/simulate-null-parameters-in-freemarker-macros
>
>
>
> I'm building a site using Freemarker and have started heavily using macros. I know in Freemarker 2.3 that passing a null value into a macro as a parameter is equivalent to not passing a parameter at all so I've created a global variable called "null" to simulate null checking in my macros:
>
> <#assign null="NUL" />
> Now in my macros I can do this:
>
> <#maco doSomething param1=null>
> <#if param1 != null>
> <div>WIN!</div>
> </#if>
> </#macro>
> The problem comes if I want to pass a parameter that isn't a scalar. For instance, passing a List (which in Freemarker is a SimpleSequence) to a macro and checking against my null keyword yields the error:
>
> freemarker.template.TemplateException: The only legal comparisons are between two numbers, two strings, or two dates. Left hand operand is a freemarker.template.SimpleSequence Right hand operand is a freemarker.template.SimpleScalar
>
> I took a look at the freemarker code and I can see the issue (ComparisonExpression.isTrue()):
>
> if(ltm instanceof TemplateNumberModel && rtm instanceof TemplateNumberModel) {
> ...
> }
> else if(ltm instanceof TemplateDateModel && rtm instanceof TemplateDateModel) {
> ...
> }
> else if(ltm instanceof TemplateScalarModel && rtm instanceof TemplateScalarModel) {
> ...
> }
> else if(ltm instanceof TemplateBooleanModel && rtm instanceof TemplateBooleanModel) {
> ...
> }
> // Here we handle compatibility issues
> else if(env.isClassicCompatible()) {
> ...
> }
> else {
> throw new TemplateException("The only legal comparisons...", env);
> }
> So the only solution I can think of is to set isClassicCompatible to true, which I think will call toString() on both objects and compare the result. However, the documentation specifically says anything relying on old features should be rewritten.
>
> My quesion is, is there a solution to this that doesn't rely on deprecated features?
>
>
>
> Thanks,
> Cameron
>
> Cameron Hinkle | Senior Application Engineer | Nike DCIT | 503.532.3075 | 7. Evolve Immediately |
>
> ------------------------------------------------------------------------------
> All of the data generated in your IT infrastructure is seriously valuable.
> Why? It contains a definitive record of application performance, security
> threats, fraudulent activity, and more. Splunk takes this data and makes
> sense of it. IT sense. And common sense.
> http://p.sf.net/sfu/splunk-d2d-c2_______________________________________________
> FreeMarker-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/freemarker-user
------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security
threats, fraudulent activity, and more. Splunk takes this data and makes
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2d-c2
_______________________________________________
FreeMarker-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freemarker-user