Spesso utilizzando le strutture per i web content di Liferay utilizziamo il tipo "Link a pagina": questo speciale tipo di dato permette al contributore, in fase di data entry, di selezionare da un comodo select box una pagina del sito, senza doverne mettere a mano il nome o altro.
All'interno del template di rendering del contenuto, poi, stampiamo il valore che il campo contiene ma il link che viene generato mostra solamente l'id della pagina e non il friendly url.
Lato Liferay, questo è poco male: il sistema, infatti, è in grado autonomamente di riconoscere l'indirizzo e di caricare la pagina relativa all'id, senza "turbare" la user experience del navigatore.
Peccato che i nostri amici della SEO poi vengono da noi e si lamentano che le pagine non hanno il nome parlante!
Quindi? Che fare??
Beh, un po' di velocity e tutto si sistema!
Ecco qui un bello snippet già pronto all'uso che, dato l'id della pagina letto dal campo contribuito in fase di data entry è in grado di generare il link usando la friendlyUrl:
#set ($service =
$serviceLocator.findService(
"com.liferay.portal.service.LayoutLocalService"))
#set ($myGroup = $getterUtil.getLong($groupId))
#set ($myLayoutId = $getterUtil.getLong($Linkpagina.getData()))
#set ($myLayout = $service.getLayout($myGroup, false, $myLayoutId))
<a href="$myLayout.getFriendlyURL()"><h2>$titolo.getData()</h2></a>
Che cosa ne pensate?
Facile, no? :)
Un'ultima raccomandazione, però: per poter utilizzare la variabile $serviceLocator
dentro al vostro template velocity dovete prima valorizzare a stringa vuota questa property dentro al vostro portal-ext.properties
:
journal.template.velocity.restricted.variables
Questo perché, di default, è valorizzata così:
journal.template.velocity.restricted.variables=serviceLocator
quindi la variabile viene inibita all'interno dei vostri template!
Alla prossima! :)