
I am assuming that you have your Liferay maven based development environment is ready. If not, I would recommend to read out this simple-way-to-setup-liferay-environment-through-maven. This is pretty straight forward and lovely pitch of guideline. So now you have your environment ready and the directory structure looks like the following image. Yes, we can now start developing a sample hook to achieve some functionalities.
Figure: Liferay Maven based development directory structure.
Project Environment: Linux Liferay 6.x+ Maven 2
Create Hook
Lets goto your hook directory from command prompt (i.e. cd /home/workspace/example/liferay/src/hook )
Type command mvn archetype:generate
A list of archetype will come up.
Find liferay-hook-archetype from the list and check the number for the same archetype. You will get something like below but number could be changed based on the version.
21: remote -> com.liferay.maven.archetypes:liferay-ext-archetype (Provides an archetype to create Liferay extensions.)
22: remote -> com.liferay.maven.archetypes:liferay-hook-archetype (Provides an archetype to create Liferay hooks.)
23: remote -> com.liferay.maven.archetypes:liferay-layouttpl-archetype (Provides an archetype to create Liferay layout templates.)
24: remote -> com.liferay.maven.archetypes:liferay-portlet-archetype (Provides an archetype to create Liferay portlets.)
In next step, you need to select Liferay Version. So select version accordingly (i.e. 6.1.0)
Next, define proper groupId (i.e. com.example.liferay)
Define proper artifactId (i.e. samplehook)
Specify version (i.e. 1.0-SNAPSHOT)
Package(i.e. com.example.liferay)
Confirm all the values and hit ‘Y’ for confirmation
Yahooooooooo , Your are done !!! Your Hook is created. Now you know how to create a hook in a minute, great! (y)
Before deploying your package, just confirm your Portal deploy path into your auto generated pom.xml inside your sample hook ( /home/workspace/example/liferay/src/hook/sample-hook/pom.xml )
Open the pom.xml in a text editor and find the …………..
So it will look like the following.
Now copy any blog portlet jsp file, for example – I want to override edit_entry.jsp, and put that into
# # Set this to true if all users are required to agree to the terms of use.
# terms.of.use.required=false
Deploy the hook and check the term’s page. You might need to restart the tomcat if u dont see its not effecting. Event Liferay has a few event handler connection points throughout its lifecycle.
The available events are: Application Startup Events (application.startup.events)
Login Events (login.events.pre, login.events.post)
Service Events (servlet.service.events.pre, servlet.service.events.post)
Now I want to override any event with my custom implementation, for example – application.startup.events, where I want to change some default behavior. So I can put that property into
portal.properties application.startup.events=com.liferay.samplehook.events.StartupAction
package com.liferay.samplehook.actions;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.events.ActionException;
import java.io.InputStream; import java.util.*;
/** * Action called on startup, used to create initial data.
* * @author Rony * */
public class StartupAction extends SimpleAction {
public void run(String[] ids) throws ActionException {
try {
doRun(GetterUtil.getLong(ids[0])); }
catch (Exception e) { throw new ActionException(e); } }
// Do your custom coding here. }
Do your customization in AppStartupAction, deploy it and restart the tomcat. Or you can also define override event using liferay-hook.xml like the following :
BlogsEntryLocalServiceWrapper is created as a wrapper of the BlogsEntryLocalService that is used to add, remove and retrieve blog entry. To modify the functionality of BlogsEntryLocalService from our hook, all we have to do is create a class that extends from BlogsEntryLocalServiceWrapper, override some of its methods or what ever you want, then we have to configure so that Liferay pick this extension instead of default wrapper class.
Sample code
// package com.liferay.samplehook.service;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
public class CustomBlogsEntryLocalServiceImpl extends CustomBlogsEntryLocalServiceWrapper{
//Add custom coding }
Next, lets ask Liferay to pick this class instead of the default one. Edit your liferay-hook.xml and add the
Lets take LayoutSetListener as an example and we want to set our own theme for all community layouts.
In Liferay portal.properties, we have a Listener class like this: value.object.listener.com.liferay.portal.model.LayoutSet=com.liferay.portal.model.LayoutSetListener
Now lets define our own class into Hook portal.properties to customize the layout like this: value.object.listener.com.liferay.portal.model.LayoutSet= com.liferay.samplehook .modellisteners.LayoutSetListener Example code to add custom theme for all group layouts by default instead of default Classic theme.
public class LayoutSetListener extends BaseModelListener
protected void addCommunityLayouts(Group group) throws Exception { // Look and Feel updateLookAndFeel(group); }
private void updateLookAndFeel(Group group) throws Exception { LayoutSetLocalServiceUtil.updateLookAndFeel(group.getGroupId(), “sample_WAR_sampletheme”, “”, “”, false); } }
We are done adding our own theme overriding LayoutSet model.
Add custom Model Listener: If we want to add our own Model Listener, we can also easily achieve that using hook system. Lets say we want to add a blog post Listener, we can inform liferay to pickup our custom model by adding a
public class MyBlogEntryListener implements ModelListener { //Custom code here. }
You can also Look into the post for detail at http://www.liferay.com/community/wiki/-/wiki/Main/Portal+Hook+Plugins
We are done! Overriding/Adding struts actions We can also override and add new Struts-actions from Hook System. Edit your liferay-hook.xml and add the following lines.