<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-1252">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.0.4417.0">
<TITLE>[opencms-dev] On how to integrate OpenCMS and velocity:</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>Ok here is the additional info I promised:</FONT>
</P>

<P><FONT SIZE=2>I hope the connectors between OpenCMS and Velocity are already posted on the OpenCMS site (havenīt had time to check that yet)</FONT></P>

<P><FONT SIZE=2>But here is a small example on how to integrate both.</FONT>
</P>

<P><FONT SIZE=2>The approach is rather straight forward:</FONT>
</P>

<P><FONT SIZE=2>First of all you just need a pretty empty html form:</FONT>
</P>

<P><FONT SIZE=2><![CDATA[</FONT>

<BR><FONT SIZE=2>put your standard OpenCMS HTML code here</FONT>
</P>

<P><FONT SIZE=2>]]><process>velocity_code</process></FONT>
</P>
<BR>
<BR>

<P><FONT SIZE=2>Feel free to put the process tag wherever you like. All you now have to do is, to connect an appropriate Velocity template</FONT></P>

<P><FONT SIZE=2>into the process tag. You can do it like that (I hope this code works ootb since I copied it from splitted code in my own work framework:</FONT></P>
<BR>
<BR>

<P>                <FONT SIZE=2>static final String VELOCITY_FIELD = "velocity_code";</FONT>

<BR>                <FONT SIZE=2>static final String VELOCITY_TEMPLATE = "theVelocityTemplate"; //you could use an absolute path absolute from / here in this case the internal path is searched</FONT></P>

<P>                <FONT SIZE=2>public byte[] getContent(CmsObject cms, String templateFile, String elementName, Hashtable theParameters, String templateSelector) throws CmsException</FONT></P>

<P>        <FONT SIZE=2>{</FONT>
</P>

<P>                <FONT SIZE=2>CmsXmlTemplateFile templateDocument = getOwnTemplateFile(cms, templateFile, elementName, theParameters, templateSelector);</FONT></P>

<P>                <FONT SIZE=2>templateDocument.setData(VELOCITY_FIELD, " "); //this is necessary to avoid an error in case the field is not set</FONT></P>

<P>                <FONT SIZE=2>CmsSession session = (CmsSession) cms.getRequestContext().getSession(true);</FONT>
</P>

<P>                

<BR>                <FONT SIZE=2>/*</FONT>

<BR>                <FONT SIZE=2> Do whatever you like here and then pass it down into the parameter list</FONT>

<BR>                <FONT SIZE=2>*/</FONT>

<BR>                <FONT SIZE=2>try</FONT>

<BR>                <FONT SIZE=2>{</FONT>

<BR>                        <FONT SIZE=2>parseResult = (String) LC_Velocity_OpenCMS.getInstance().parseTemplate(VELOCITY_TEMPLATE, theParameters, cms);</FONT></P>

<P>                <FONT SIZE=2>}</FONT>

<BR>                <FONT SIZE=2>catch (Exception ex)</FONT>

<BR>                <FONT SIZE=2>{</FONT>

<BR>                        <FONT SIZE=2>//do error handling</FONT>

<BR>                <FONT SIZE=2>}</FONT>

<BR>                <FONT SIZE=2>if (parseResult!=null)</FONT>

<BR>                        <FONT SIZE=2>templateDocument.setData(VELOCITY_FIELD, parseResult);</FONT>
</P>

<P>                <FONT SIZE=2>return startProcessing(cms, templateDocument, elementName, theParameters, templateFile);</FONT>

<BR>        <FONT SIZE=2>}</FONT>
</P>
<BR>
<BR>

<P><FONT SIZE=2>This is my current approach, there are two downsides, a publish wonīt publish a Velocity Template you have to publish yourself and you have to take care about the correct user settings in the velocity template. </FONT></P>

<P><FONT SIZE=2>However the advantages in my opinion outweight the disadvantages by tons. You pretty much can automate standard form passing this way (aka parameters are passed from one from to the other and then are interpreted), as I also said it is rather easy to iterate over collections, simply pass a vector of the collection down the parameter list and do it from Velocity:</FONT></P>

<P><FONT SIZE=2>here is an example from a template in my current development system:</FONT>
</P>

<P><FONT SIZE=2>----</FONT>
</P>

<P><FONT SIZE=2><center><H3>Following users were found</H3></center></FONT>

<BR><FONT SIZE=2><br><br></FONT>

<BR>        <FONT SIZE=2>#if($resultset) </FONT>

<BR>                <FONT SIZE=2>#foreach ($user in $resultset)</FONT>

<BR>                        <FONT SIZE=2><li></FONT>

<BR>                        <FONT SIZE=2>#if($user.getNewsletter())</FONT>

<BR>                                <FONT SIZE=2><A HREF="JavaScript:getCurrUrl('user_list.html?operation=query&operation2=deaktivate&</FONT>

<BR>                                <FONT SIZE=2>id=$user.getId()')">[User is active]</A> </FONT>

<BR>                        <FONT SIZE=2>#else   </FONT>

<BR>                                <FONT SIZE=2><A HREF="JavaScript:getCurrUrl('user_list.html?operation=query&operation2=aktivate&</FONT>

<BR>                                <FONT SIZE=2>id=$user.getId()')">[User is inactive]</A> </FONT>

<BR>                        <FONT SIZE=2>#end    </FONT>

<BR>                                <FONT SIZE=2>$user.getNachname() $user.getVorname() $user.getAdresse() $user.getPlz() $user.getEmail() <A HREF="JavaScript:getCurrUrl('user_edit.html?operation=query&id=$user.getId()')">Edit user</A> </FONT></P>

<P>                        <FONT SIZE=2><br> </FONT>

<BR>                <FONT SIZE=2>#end</FONT>

<BR>        <FONT SIZE=2>#else</FONT>

<BR>                <FONT SIZE=2>There were no entries found</FONT>

<BR>        <FONT SIZE=2>#end            </FONT>

<BR><FONT SIZE=2><br><br></FONT>
</P>

<P><FONT SIZE=2>---</FONT>
</P>

<P><FONT SIZE=2>You can see where this leads to:</FONT>

<BR><FONT SIZE=2>a) You can iterate over collections</FONT>

<BR><FONT SIZE=2>b) You can access bean like objects within your parameter list ($user.getPlz() for instance gives back the zip code as string of a user entry)</FONT></P>

<P><FONT SIZE=2>and you can have generally a very dynamic content without to much coding effort(have a look at the outer if statement in my example- it either gives a list of users or an error message that no users were found, the inner if can switch between an active and inactive user). And as well the whole syntax is very close to PHP so lots of web designer shouldnīt have to many problems recognizing the code and what it does.</FONT></P>

<P><FONT SIZE=2>As for integration into Ope</FONT>

<BR><FONT SIZE=2>nCMS, Iīm not really sure what the best approach is. One very good one would be to have Velocity as additional type, another one would be to be able to add a <velocity> entry into the page management file which could point to a related Velocity file which then could be displayed optionally (very similar to my approach-which tried to avoid to alter the OpenCMS system)-Actually I would prefer both approaches or if not possible the second one since it doesnīt break the current xml template structure.</FONT></P>

<P><FONT SIZE=2>I hope this sums up the handling of the connectors (additionally to the readme file)</FONT>
</P>

<P><FONT SIZE=2>Happy coding (and feel free to contact me if there are questions)</FONT>
</P>

<P><FONT SIZE=2>Werner Punz Labor_C-Austria</FONT>
</P>

</BODY>
</HTML>