如何在诸如init_custom.vm
,portal_normal.vm
之类的力度文件中的liferay主题中使用自定义服务方法。
我看到liferay提供了很多辅助工具类的变量,例如PortalUtil
的$portalUtil
,GetterUtil
的$getterUtil
等等,init.vm
内部文件。
那么可以从com.my.custom.service.MyCustomLocalServiceImpl
获取我的自定义服务的实例,例如UserLocalServiceImpl
的实例或liferay的服务吗?
这是一些伪代码,用于了解我的需求:
// this code calls method from MyCustomLocalServiceImpl class to fetch items
#set ($listOfItems = $myCustomLocalServiceUtil.getAllItems())
// this code calls method from UserLocalServiceImpl class to fetch users
#set ($listOfUsers = $userLocalServiceUtil.getUsers(0, 99))
环境:Liferay 6.1 CE GA1
答案 0 :(得分:6)
有可能。
以下代码显示了如何获取服务:
// Fetching instance of my custom services
#set ($myCustomLocalService = $serviceLocator.findService('myCustomServices-portlet', 'com.my.custom.service.MyCustomLocalService'))
// Fetching instance of UserLocalServiceImpl
#set ($userLocalService = $serviceLocator.findService('com.liferay.portal.service.UserLocalService'))
然后只需调用服务方法:
#set ($listOfItems = $myCustomLocalService.getAllItems())
#set ($listOfUsers = $userLocalService.getUsers(0, 99))
对于Liferay 6.1 CE GA1:我发现这个类VelocityVariablesImpl
(参见像insertHelperUtilities
,insertVariables
这样的方法)实际上使得所有变量和辅助工具可用于速度模板。子>
答案 1 :(得分:3)
您可以使用以下钩子插件扩展主题中使用的自定义变量和服务的速度上下文。我们假设您需要使用自定义本地服务。
使用以下liferay-hook.xml定义创建一个钩子插件
<hook>
<portal-properties>portal.properties</portal-properties>
</hook>
在main/resources
(当你使用maven时)或docroot/WEB-INF/src
(当你使用插件sdk时)创建 portal.properties ,在那里进行以下配置
servlet.service.events.pre=com.my.custom.action.MyCustomPreAction
在你的钩子中创建com.my.custom.action.MyCustomPreAction
类,它将扩展com.liferay.portal.kernel.events.Action
实施run
方法
@Override
public void run(final HttpServletRequest request, final HttpServletResponse response)
throws ActionException {
Map<String, Object> vmVariables = (Map<String, Object>) request.getAttribute(WebKeys.VM_VARIABLES);
if (vmVariables == null) {
vmVariables = new HashMap<String, Object>(1);
}
vmVariables.put("myCustomServiceUtil", com.my.custom.service.MyCustomLocalServiceUtil.class);
request.setAttribute(WebKeys.VM_VARIABLES, map);
}
可以在主题的速度模板中使用自定义服务
// this code calls method from MyCustomLocalServiceImpl class to fetch items
#set ($listOfItems = $myCustomServiceUtil.getAllItems())