2012-03-22 11 views
9

ベテランのテーマのベロシティテンプレートを作成しています。ベロシティテンプレート内に新しいオブジェクトを作成できるかどうかは疑問です。ベロシティテンプレートでオブジェクトを作成する

理由は、liferayではcontextToolがコンテキストに登録されておらず、特定の時刻にテンプレートに存在する変数を検査できるようにするためです。 クールなマクロがありますが、残念ながらコンテキストツールを使用しています。テンプレートのコンテキストでものを追加することであるLiferayのテーマが設けられており、Javaのコードになります

#set($contextTool = new ContextTool()) 

別の解決策:

私のような何かをしたいと思います。しかし、私は、これはどちらかうまくいく方法がわからない... ;-)

答えて

8

私はこれが何をしたいあなたを与える必要があるよりも、あなたを理解したIF

#set($contextTool = $portal.getClass().forName("full.package.ContextTool").newInstance()) 

EDIT

てみてください

あなたは、たとえば、使用することができます
#set($ve = $serviceLocator.findService("com.liferay.portal.kernel.velocity.VelocityEngine")) 
#set($wvc = $ve.getWrappedStandardToolsContext().getWrappedVelocityContext()) 

#set($cVE = $portal.getClass().forName("org.apache.velocity.app.VelocityEngine")) 
#set($cHSREQ = $portal.getClass().forName("javax.servlet.http.HttpServletRequest")) 
#set($cHSRES = $portal.getClass().forName("javax.servlet.http.HttpServletResponse")) 
#set($cSC = $portal.getClass().forName("javax.servlet.ServletContext")) 
#set($cCC = $portal.getClass().forName("org.apache.velocity.tools.view.context.ChainedContext")) 
#set($cVEI = $portal.getClass().forName("com.liferay.portal.velocity.VelocityEngineImpl")) 
#set($cC = $portal.getClass().forName("org.apache.velocity.context.Context")) 
#set($cVEU = $portal.getClass().forName("com.liferay.portal.kernel.velocity.VelocityEngineUtil")) 

#set($ve = $cVEU.getMethod("getVelocityEngine").invoke(null)) 

#set($fVE = $cVEI.getDeclaredField("_velocityEngine")) 
$fVE.setAccessible(true) 

#set($cc = $cCC.getConstructor($cC, $cVE, $cHSREQ, $cHSRES, $cSC).newInstance($wvc, $fVE.get($ve), $request, $response, $request.getSession().getServletContext())) 

#set($contextTool = $portal.getClass().forName("org.apache.velocity.tools.view.tools.ContextTool").newInstance()) 

$contextTool.init($cc) 

$contextTool.getKeys() 

これが必要なものでない場合は、私に教えてください...

+0

まあ、あなたは正しいです。 contextToolが作成されました! :-)しかし、テンプレート内のビューコンテキストにアクセスして正しく初期化することはできません:-( –

関連する問題