I am making a change to a native Liferay portlet, that comes with Liferay Intallation. How can I change a function to my own implementation by a hook or similar approach?
I have read how to make pre and post conditions and how to make new implementation of an interface, but I don't know how to just replace random function inside random class at a portlet that I want to keep otherwise as it is originally.
There are several ways you can modify the functionality of a native Liferay portlet. Here is a quick overview.
Most hooked functionality is described through the liferay-hook.xml file located in your /docroot/WEB-INF directory. Here are the most common method.
In the liferay-hook.xml file, add the following child to <hook/>
<custom-jsp-dir>/META-INF/custom_jsps</custom-jsp-dir>
This element defines the location of where you are going to place JSPs to be overwritten. For example you may want to rewrite view.jsp for the Document Library portlet at:
[custom-jsp-dir]/html/portlet/document_library/view.jsp
For this one you'll have to define a portal.property file typically stored at,
/docroot/WEB-INF/src/portal.property
And tell liferay-hook.xml
its location. The following is an example for the above,
<portal-properties>portal.properties</portal-properties>
if you want to listen to changes in User, for example, you would write in the property,
value.object.listener.com.liferay.portal.model.User=com.my.example.UserListener;
Which is in the following format,
value.object.listener.[class-to-listen]=[my-listener-class]
And your class should implement com.liferay.portal.model.BaseModelListener
.
Here you can listen to events such as Add, Update, Remove, and a few others.
A similar story here, in liferay-hook.xml
in the <hook />
element add
<service>
<service-type>com.liferay.portal.service.UserService</service-type>
<service-impl>my.example.service.UserServiceImpl</service-impl>
</service>
Here your implementation should extend the correct wrapper class for a particular service. For the example above, for instance, is
com.liferay.portal.service.UserServiceWrapper;
You should now be able to overwrite all the public methods for the UserService like updateUser(..)
.
In very similar fashion as extending services, define the elements for <hook />
<struts-action>
<struts-action-path>/message_boards/view</struts-action-path>
<struts-action-impl>my.example.action.SampleViewAction</struts-action-impl>
</struts-action>
You'll need to extend,
com.liferay.portal.kernel.struts.BaseStrutsAction
and you'll have access to the request and can perform a custom action. Which is very powerful in conjunction with custom JSPs.
Be sure to check compatibility with the version of Liferay you are using.
If you need even more control you would need to use the ext-plugin.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With