Wouldn't a custom tag be a simpler and more elegant way to do this?
David Grubb wrote:
Hi Carl,
This may be overkill for what you need, but I've recently been playing
with FreeMarker (freemarker.org <http://freemarker.org>) - a fairly
powerful Java-based templating engine. It can take a template such as:
Hi ${name}, your details are:
${city}
${country}
and replace the markers based on a supplied data structure:
data["name"] = "Dorothy";
data["city"] = "Emerald";
data["country"] = "Oz";
Pretty basic stuff, but what I found most interesting/useful, is the
ability to pass in more complex structures and arrays, and have them
displayed in lists, such as
(data struct)
data["name"] = "bob";
data["orders"][1]["date"] = "1/1/2006";
data["orders"][1]["description"] = "Yellow Bucket";
data["orders"][1]["cost"] = "$15.95";
data["orders"][2]["date"] = "1/1/2006";
data["orders"][2]["description"] = "Blue Bucket";
data["orders"][2]["cost"] = "$15.95";
data["orders"][3]["date"] = "1/1/2006";
data["orders"][3]["description"] = "Green Bucket";
data["orders"][3]["cost"] = "$15.95";
(template)
Hi ${name},
Here is a list of the items you have orders:
<#list orders as order>
${order.date} - ${order.description} - ${order.cost}
</#list>
(result)
Hi bob,
Here is a list of the items you have orders:
1/1/2006 - Yellow Bucket - $15.95
1/1/2006 - Blue Bucket - $15.95
1/1/2006 - Green Bucket - $15.95
It also supports conditional and aggregate directives within the
template design (such is if/else, average, sum)
In theory, you could pass in the entire SESSION structure as data, and
have any defined variables in your template updated.
I've attached a quick-n-dirty CFC 'wrapper' that I've been using to
call FreeMarkers functions (you will need to download the appropriate
.jar file from the website and install it somewhere in your class
path) - it's not pretty (my Java experience is fairly limited), but
seems to work. The only shortcoming is that the results of the
data/template merge needs to be written out to a file (this is a
limitation of my code - not freemarkers - I've not yet been able to
work out how to return the results directly to a CF variable).
HTH
Dave
On 04/02/06, *Carl Vanderpal* <[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>> wrote:
Just wondering if there is a better way of doing this..
I have a site that that customizes documents with about 5-10
(could expand later on) elements that customizable - the example I
can think of is a mail merge.
I say this as end users are entering the data and I want to make
it easy for them to utilize customizable fields..
~FirstName~ (replace with) SESSION[User].FirstName
~LastName~ (replace with) SESSION[User].LastName
~City~ (replace with) SESSION[User].City
~Country~ (replace with) SESSION[User].Country
and so forth...
but I will add to it at a later date
<!--- Get Text from CFC Query --->
<cfset myText = ReplaceNoCase(getMyText.TextBlock, '~FirstName~',
'<strong>#SESSION[User].FirstName#</strong>', 'ALL')>
<cfset myText = ReplaceNoCase(getMyText.TextBlock, '~LastName~',
'<strong>#SESSION[User].LastName#</strong>', 'ALL')>
<cfset myText = ReplaceNoCase(getMyText.TextBlock, '~City~',
'<strong>#SESSION[User].City#</strong>', 'ALL')>
and then I could go through all X amount of other ones..but is
there a quicker way of doing this instead of CFSEtting and REplace
10 times..
Thanks
:)
====================================
Postal: Po Box 3462 Dural, NSW 2158
Email: mailto: [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>
FireFly Internet Phone: 80011777
--
Haikal Saadh, Applications Programmer
Teaching and Learning Support Services
K405, Queensland University of Technology, Kelvin Grove Campus
[EMAIL PROTECTED], 3864 8633
CRICOS No. 00213J