Sicuramente tutti voi attenti osservatori avrete notato la "scomparsa" della classe VelocityVariablesImpl
dalla versione 6.2 di Liferay.
Questa classe, per chi non lo sapesse, era quella che inseriva all'interno del contesto di Velocity le variabili che potevano essere quindi utilizzate all'interno dei temi di Liferay.
Dalla versione 6.2, quindi, dove potete vedere quali variabili avete all'interno del vostro tema?
La risposta è presto data!
Intanto potete consultare il file localizzato in<liferay_dir>/html/themes/_unstyled/templates/init.vm
; dentro a questo file, infatti, troverete buona parte delle variabili presenti all'interno del tema.
Ovviamente se dovete aggiungerne delle vostre dovete inserirle all'interno del vostro tema nel file init_custom.vm
, ricordatevelo! ;)
Le altre variabili, invece, sono inserite nel contesto di Velocity da questi file:
com.liferay.portal.template.TemplateContextHelper
com.liferay.portal.velocity.VelocityTemplateContextHelper
com.liferay.taglib.util.ThemeUtil
Vediamo un po' che cosa contengono di interessante! ;)
Le variabili usate più di frequente le trovate nel TemplateContextHelper
; qui dentro troverete la request HTTP, mappata nella variabile $request
e di tipo javax.servlet.http.HttpServletRequest
.
Come vedrete, poi, sono presenti anche la $renderRequest
e la $renderResponse
(rispettivamente javax.portlet.PortletRequest
e javax.portlet.PortletResponse
).
Potete trovare poi anche delle variabili di "supporto" al vostro codice, come il $portletConfig
, lo $scopeGroupId
o il $permissionChecker
(istanza del com.liferay.portal.security.permission.PermissionChecker
necessario per l'utilizzo dei permessi all'interno del vostro codice).
La classe VelocityTemplateContextHelper
, invece, è molto simile alla vecchia VelocityVariablesImpl
; al suo interno, infatti, potete trovare l'istanza del $dateTool
, l'oggetto che mappa la classe org.apache.velocity.tools.generic.DateTool.DateTool
. All'interno di questa classe trovate anche $mathTool
(org.apache.velocity.tools.generic.MathTool.MathTool
), $sortTool
(org.apache.velocity.tools.generic.SortTool.SortTool
) e una serie di altri oggetti che potete vedere aprendo il sorgente.
Questa classe, dicevo, è quella che riassume meglio la VelocityVariableImpl
e che incorpora quindi anche le funzionalità necessarie per poter passare dalla vostra portlet degli oggetti nello scope di Velocity.
Ricordate come si fa? :)
Questo snippet dovrebbe aprirvi un mondo di possibilità:
// Insert custom vm variables
Map<String, Object> vmVariables =
(Map<String, Object>) request.getAttribute(WebKeys.VM_VARIABLES);
if (vmVariables != null) {
for (Map.Entry<String, Object> entry : vmVariables.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (Validator.isNotNull(key)) {
template.put(key, value);
}
}
}
Infine, c'è la classe ThemeUtil
, all'interno della quale, come dice anche il nome, trovate una serie di oggetti molto comodi quando si costruisce un tema come, ad esempio, il $pageContext
(javax.servlet.jsp.PageContext
), il $themeServletContext
(javax.servlet.ServletContext
), il $taglibLiferay
(com.liferay.taglib.util.VelocityTaglib
).
Infine, prima di lasciarvi, un ultimo accorgimento!
Come già detto anche in un precedente articolo, se volete accedere ai metodi di service che, per inciso, sono mappati nel contesto dalla TemplateContextHandler
, è necessario abilitare la property di portale relativa al ServiceLocator
; nel dettaglio:
velocity.engine.restricted.variables=
valorizzandola, come sopra riportato, a stringa vuota. In questo modo "sbloccherete" l'accesso al ServiceLocator
e potrete così invocare i vostri *Service direttamente da Velocity! :)
Alla prossima e, se avete domande, basta commentare questo post! ;)
Ciao!