Showing 67 Comments
Scott Lee
10/7/08 10:37 AM
nice break down ray.. very helpful!
James Min
10/7/08 10:50 AM
nice... thanks for the writeup!
Rob Sonke
10/7/08 12:02 PM
With this new hooks I can drop all customization done through the ext environment except some spring (extensions in ext-spring.xml) and some customizations in the PortalImpl class.
Really looking forward to migrate the current customizations to hooks.
Mika Koivisto
10/7/08 2:14 PM
Very nice! That really makes customization easier. One question a colleague of mine asked today about this very thing is: Can you defined your custom AuthenticatorS with hooks or is that still something you need to deploy to the core portal?
Jonas Yuan
10/8/08 5:30 AM
Very nice! Looking forward to using it ....
Eric Soucy
10/8/08 7:33 PM
ok, so suppose you want to only update the login.jsp page, what do you do exactly?
Helmi Mahara
10/9/08 12:21 AM
Very helpful. A while ago I added new tables using EXT env. where the hibernate mapping files, java codes are generated using built-service task. Can I achieve this using Hook? If so how? Is it also possible to override Struts mapping file?
Thank you so much.
Simply place the jsp file for the login page in 'custom-jsp-dir'. Make sure it's the identical path from the top of the context.
You can use ServiceBuilder from the plugins SDK, you don't need hooks, although you can combine that and hooks to achieve different types of integrations. See the example portlets in the SVN repository, plugins repository portlets, or wiki for how to use ServiceBuilder in plugins SDK.
Overridding struts mapping files is not currently something you can do using Hooks.
Van Hoai Pham
10/11/08 8:52 AM
Thank you Ray for a very helpful note.
Anyway, is there anyway to access request object within ModelListener?
Ray Augé
10/11/08 12:38 PM
Sorry, no. What exactly do you need from the request? There might be other ways of getting it.
Erik Mellegård
10/17/08 6:54 AM
This is great!
Some reflections/questions:
I tried the following: add a portal.properties with auth.pipeline.pre=my.Autenticator,com.liferay.portal.security.auth.LDAPAuth
and added the my.Authenticator to my portlet. I get a ClassNotFoundException thogh. I guess its because LR use another class loader than my portlet.
Is it possible to add an own Autenticator through liferay-hook.xml?
Another thing, when I added login.events.pre/login.events.post and redeployed the portlet using hot-deploy (copy into $user/liferay/deploy). The previous registred actions still fires (now un deployed) still fired as well as the new one....
Ray Augé
10/17/08 7:15 AM
Q1 - Sorry, no Authenticators as of right now, but definitely a top candidate for inclusion.
Q2 - Yup, this is a known bug, fixed in trunk. Will be in a the next 5.1.x release.
Jeff Goodwin
10/22/08 10:34 AM
I have to create a custom autologin mechanism and was wondering if it was possible to develop it as a hook.
Thomas Kellerer
10/23/08 2:23 AM
Where do I put the hook config file?
This is not clear to me from this description
Ray Augé
10/23/08 4:53 AM
Not as of yet, but it shouldn't be too hard to implement the hook-autologin feature. It's essentially the same pattern as with Events.
Would you be willing to take a crack at it? We're really strapped for dev cycles right now.
Ray Augé
10/23/08 4:54 AM
Put it in the WEB-INF folder along with the other descriptors.
Alex Wallace
10/31/08 12:54 PM
I guess your confusion is like mine, originally... I looked at https://lportal.svn.sourceforge.net/svnroot/lportal/plugins/trunk/hooks/ to figure it out...
There is no create.sh in the hooks folder like other plugins.
Seems to me that:
1- you create a folder in hooks, with an arbitrary name
2- your hooks config goes in yourFolder/docroot/WEB-INF/liferay-hook.xml
3- your overrides go in /docroot/WEB-INF/src and need to be referenced by your hook config
4- you should have a yourFolder/docroot/WEB-INF/liferay-plugin-package.properties
5- you probably want to add a yourFolder/build.xml for ant
Ray Augé
10/31/08 1:03 PM
You can actually place your hook descriptor and any dependencies inside any other plugin WAR you already have.
So, unless you specifically want to separation (not a bad idea in some cases) it's not explicitly required.
It is really a great move!
I am trying to understand the functionality how hook is working, I want to modify the view.jsp of sms portlet can any body instruct me how to go about this.
Erik Mellegård
11/13/08 12:33 AM
Hi,
From my LoginPostAction defined in liferay-hook.xml I'm trying to use the session attribute "com.liferay.portal.servlet.SharedSessionAttributeCache" with no success.
I can get the object, using session.getAttribute("com.liferay.portal.servlet.SharedSessionAttributeCache"); but when I try to cast it to a 'usable' type, com.liferay.portal.servlet.SharedSessionAttributeCache, I either get an class not found exception, or a class cast exception (com.liferay.portal.servlet.SharedSessionAttributeCache cannot be cast to com.liferay.portal.servlet.SharedSessionAttributeCache)
The problem (I guess) is that my hook is lodad in the webbapps classloader and my webbapps classloder dont have access to the SharedSessionAttrributeCache class from portal-impl.jar (loaded by ROOT-webbapp). To use the same classloader using
<Context>
<Loader loaderClass="com.liferay.support.tomcat.loader.PortalClassLoader"/>
</Context>
is not an option (different versions of some libraries in webbapp than in LR). I have tried including the portal-impl.jar file as well as just putting a version of class file in web-inf/classes/ with no success. How can I form my LoginPostAction access the sharedSessionAttributesCache which is pressent in the httpSession i can get from the request parameter. Is this a "bug" or am I missing something?
Best regards
Erik
Ray, This is great! Is there a complete working sample implementation of each of the hook handlers?
Dipesh I Kamdar
2/24/09 12:48 PM
Great, I am looking for sample implementation for message board ( add new message and new category )
like BlogEntry class , Do we have MessageBoardEntry or CategoryEntry etc.
Michael Hanisch
3/2/09 6:49 AM
Erik M, have you managed to solve this problem in the meantime?
I'm not sure I understand the question here. Can you elaborate?
Edit: Nevermind I get it. I'd have to test that scenario!
Liferay User
3/12/09 12:32 PM
Ray Auge,
I am trying to implement hook for blogs. Trying to create custom Action class and invoke custom Java classes. Is there a sample or a pointer on how we achieve this. ?
I tried just having the code under web-inf/src but the hook is not picking it ip. Any help is appreciated.
Thanks
LR09
Liferay Support ACA
4/1/09 1:41 AM
Ray,
I'm having troubles in fully understand how Event Handlers work. Could you provide a brief but intuitive example of a possible application for Event Handlers and show some sample code of how you would roughly implement a custom Action class in that case?
Your help is much appreciated!
Naveed Shams
4/6/09 12:43 AM
My clients have asked me to keep a counter for every portlet that represents the number of Views for that portlet. I will need to create another portlet that displays a summary. I think hooks can be helpful. Please help me. How can I do this? Somehow I need my class member to get executed every time a portlet is displayed and increase counter for that portlet.
Shravan A
4/14/09 11:36 PM
We need <b>locales</b> (not mentioned in http://svn.liferay.com/browse/portal/trunk/definitions/liferay-hook_5_2_0.dtd?r=trunk) to override in hook portal.properties<br />how can we achieve it
Jose Ignacio Santa Cruz G.
7/8/09 3:41 PM
Quote: "Hooks can be built, packaged, and deployed, like other plugins, using the Liferay plugins SDK."
But how?
Portlets only need a create.sh/create.bat or similar, and a lot of easy and well documented step by steps instruction.
I tried to make a language hook to overwrite some language files without any success. Tried making it by hand and couldn't even build the hook, and tried to deploy it as a new portlet making the war, deploying it but seeing no results at all.
A fool-proof example and an easy to run shell script would be a great addition.
Tejas Shah
7/30/09 6:34 AM
Hi Ray
Thanks for the write up on hooks. I need some clarifiaction on this
Im relatively new to Liferay and have been assigned this huge task of trying to integrate it with and ecommerce product to implement some concepts of social shopping. We have identified some areas like Tagging, groups, forums etc that we are looking to extend. For Eg. we arelooking at a functionality where a user on an ecommerce site would be able to tag products.
What we are trying to figure out is how to go about extending Tagging in liferay. Do we have to use EXT for this? or is there a way to achieve this using hooks?
I would really appreciate it if you could give me some pointers on this.
Thanks in anticipation
Matthew O Smith
8/5/09 8:59 AM
What happened to the events in the 5.2 DTD?
Flavel ---------
8/6/09 11:52 AM
Have created a very simple jsp-hook portlet, that does not seem to override the jsp. Can anybody please look at the war file and tell me what I am doing wrong?
TIA
Ryan Terwedo
8/9/09 8:02 PM
Ray for a layman like me can you explain if hooks would be a good suggestion in this case?
I need to modify the iframe portlet with hard coded url and username data for say 20 sites, and also maintain the original iframe portlet.
Is it possible to just copy the iframe portlet code, modify it and then deploy it as a portlet or should a hook be used? I really dont get the hook concept.
thanks
Gord Harris
8/19/09 11:24 AM
What activities actually trigger login.events.pre and login.events.post events?
I have created some very simple handlers for these events. I see my handlers get called when I login with a valid username/password. I assumed that a login.events.pre event would be fired during an attempted (but unsuccessful) login -- eg. bad password, but this is not happening.
Sven Ehlert
8/25/09 6:13 AM
So, it seems that in 5.2 at least the hook configuration in liferay-hook.xml was changed completely. No events anymore, just <portal-properties>, if I got it right from reading the DTD. Is there any updated hook tutorial available for 5.2?
Alejandro Barrero
9/16/09 10:01 AM
Please clarify. For a service event handler in which file should I put the xml for the hook?
What name should I use for any request (I want to work with all requests). To put my class I need to know exactly where is <sdk_root>.
Thanks for your help,
Alejandro Barrero
Edgar Vonk
9/26/09 5:51 AM
One thing that I struggle with is that I write a hook plugin I almost always need access to Liferay classes that are in the portal-impl.jar.
This JAR is part of the ROOT.WAR and therefore you cannot access it from a Hook plugin. This means that I must add my custom code in the ROOT.WAR which defeats the whole purpose of Hook plugins.
Even for a very simple custom landing page action this is the case because you need access to the LastPath class. The same goes for the WebKeys class.
Any thoughts on this? I would very much like to see these classes be available to Hook plugins.
You're absolutely right! And your help would be much appreciated in helping us to track use cases we've overlooked. Please open a ticket for each case and we'll try to take care of those as soon as possible.
I personally think the LastPath feature should be improved. It seems to be a constant barrier to developers.
Note: Please never include the portal-impl.jar in your plugins. The problems that can arise are countless and undefined. It would be better to write a small reflection wrapper around the returned object than to include this jar in your plugin, at least until we solve the class access issue.
<sdk_root> is the root of where you have extract the plugins SDK that you downloaded. It contains several pre-existing folders to help structure and build your various plugins.
jeff gerbracht
10/12/09 1:45 PM
Ray, Maybe I'm mis-reading the blog but I was hoping to create a liferay-hook.xml file in WEB-INF pointing to a custom jsp directory under WEB-INF. I was expecting liferay to use the alternate path to find the relevant jsp page and if that jsp doesn't exist in the alternate path, to then look under the default path. However in reading these posts, I'm now wondering if the only way to utilize jsp hooks is to use the SDK and ant scripts (which will simply replace the jsps in the default path with my custom jsps).
Laszlo Nemethi
10/16/09 12:54 AM
Hi Erik, hi Ray,
i've run into the same issue i guess. Currently i'm using Plugins SDK 5.23 and tried to write a hook plugin for the event auth.pipeline.pre. The hook is hot-deployed without errors but when trying to sign in got class not found exception:
07:45:55,943 ERROR [InstancePool:107] Unable to load com.ext.portal.security.auth.PanelAuth with the portal class loader or the current context class loader
java.lang.ClassNotFoundException: com.ext.portal.security.auth.PanelAuth at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
I've tried with and without setting the portal class loader by /META-INF/context.xml but got the same error.
Have you guys got some idea how to workaround this issue, maybe i have to keep using EXT for implement this event handler instead Plugins SDK?
Thanks
Laszlo
Alejandro Barrero
10/30/09 8:27 AM
Thank you for your reply, but I still need some direction. I created a servelet service pre hook with NetBeans; it works fine. Now I want to create a model listener event but NetBeans doesn´t have that option. The question is how do I create a model listener event hook? What files do I have to modify as related to the servlet service event and how should they get modified?
Mahipalsinh Rana
11/6/09 10:30 AM
Portal Pack has support for Model listener , Please check following blog page which has details about how to add hook for operation model.
check section : Model Listener Hook
http://www.liferay.com/web/chetan/blog/-/blogs/2580490
Mahipalsinh Rana
11/6/09 10:34 AM
What about adding context.xml with
<Context>
<Loader
loaderClass="com.liferay.support.tomcat.loader.PortalClassLoader"
/>
</Context>
It works fine with Struts portlet used in Plugins SDK to access core classes. will it not work with Hooks.
Also curious to know , is it recommended solution or do you see issue with it?
Mónica Parejo Bellido
11/13/09 4:59 AM
I also need the request. In the method onAfterCreate, i create an user in Alfresco with web services. But if it happens something wrong in that creation, i need to post an error (with SessionErrors, i suppose) to the create_account.jsp.
Thanks a lot for your help
Andreas Kang
11/22/09 2:20 AM
I have the same problem.
Any solution/answer to this yet? I need to be able to make a check against another database before the user is authenticated against the liferay db. With the pre auth pipeline I get the classnotfoundexception and with the pre login the user is already authenticated before the action happens (I don't understand the point of the pre login if it's like this).
Thankful for answers.
Where are <model-listener> and <event> tags in 5_2_0 dtd ?
A new <service> appeared ... but can we hook models and events with this ?
How ? :-)
Found the answer by myself : need to use the portal.properties hook and define value.object.listener.<model> property (for models) and login.events.*/application.startup.events for events
But this doesn't explain to me what the <service> tag is aimed at =)
Emilie R
11/27/09 7:04 AM
Hi Ray,
Just a little question. Is it possible to use custom classes in a customized JPS?
Sampsa Sohlman
12/14/09 4:29 AM
I made issue and contribution because of this.
http://issues.liferay.com/browse/LPS-6491
Chris Whittle
12/23/09 12:34 PM
Ray when using JSPs in eclipse is there something that can be done so when you extend files that have jsp includes pointing back to the originals so they don't show errors on those pointers? the ext environment seems to have something but I can't see what it is...
Scott Langeberg
8/18/10 12:57 PM
Did you ever figure this out? I'm trying to do nearly the same thing! The question is, how do you create a new portlet, by extending the built-ins? I've not seen much via google.
Flavel ---------
8/18/10 6:55 PM
I will say using the Liferay IDE has explained A LOT about how hooks and portlets work with Liferay (at least from the service builder's point of view). It is reasonably easy to get it started up. Just generate the hook-plugin (or portlet-plugin), and then your hook (or portlet) project and it goes pretty smoothly
I also like using the IDE as a point of reference to find hooks that I might have not ever found on my own by searching through the ones available when creating the hook project. We are stuck using RAD, but I still use IDE to find hooks when needed.
Thanks for jumping in here Flavel!
I also think (thought I'm not an expert at it yet) that using the LIDE, the issue of jsp references is somewhat handled, I believe. Such that if you copy a portal jsp into a jsp hook plugin as long as the properties are all define appropriately, the references, for the most part, will refer correctly to the classes of the portal. Unless of course those classes are part of the internal API of the portal (a.k.a. in portal-impl.jar). For that case, you might have to temporarily reference that jar in your project's build path. But, be careful when doing so, because it is easy to create bad references this way, causing later deploys to fail due to classloader exceptions.
Wesley Reisz
12/13/10 2:12 PM
Ray, I'm actually getting the same issue that Chris describes above... I'm using eclipse +eclipse LIDE and I can create, build and deploy without a problem (inside and out of the ide). The issue is that in the hooks project <%@ include file="/html/portlet/iframe/init.jsp" %> references a file from the portal source, so my jsps complain in eclipse. It seems like this should be trivial thing to point eclipse to the html folder of the portal source, but I cant seem to get it to work. What am I doing something wrong?
wtr
Smilelws2010 lwz
2/10/11 11:52 AM
Ray,
Can we add new properties to portal.properties and put it under hook\docroot\web-inf\src\portal.properties.
And in the jsp do a PortletProps.get("Link1") where link1 is my key in the properties file.
Or can you help me with reading a property file inside a hook irrespective of it's path.
Ann
Smilelws2010 lwz
2/10/11 11:53 AM
I dont want to hardcode the path to my property file inside the jsp as it is gonna change very often. and so I can reuse it in others
Thanks,
Ann
Ray Augé
2/10/11 12:06 PM
If you can, you would have to get the property using PropsUtil not PortletPropsUtil. Try that!
Smilelws2010 lwz
2/11/11 5:52 AM
Thanks Ray for your prompt reply,
It worked like a charm.
Ann
Koen Cleynhens
2/15/11 3:19 AM
Is there already a solution to access the portal-impl.jar classes in the hook plugin?
Dave Weitzel
4/18/11 7:15 AM
two things:
a) Am I right in assuming that in 6.0 and later the <event> and<model-listener> entries are handled by portal properties not lifray-hook.xml entries?
b) I still cannot get hooks (6.0.5 or .6) to deploy correctly - service builder jar file has to be deployed to <tomcat>/lib/ext folder to allow class names to be resolved. Is there a configuration setting in the autogenerated xml files that needs to be set to tell Liferay to look in local <hook>/WEB-INF/lib foldler first?
Has any one got a zipped up hook porject that does all of these things - events, listeners, jsp, language and service oeverirde that they know works and is deployable using IDE and SDK? LIA chapter 8 'Inkwell ecommerce' doesn't deploy as zipped.
Hey Dave,
There should be a sample or example in the community plugins repository that works for any given version. If this is still an issue please let me know and we'll try to revive an attempt to figure this out.
Anil Sunkari
6/22/11 10:22 PM
thanks a lot RAY......... ITS VERY HELPFULL
Matt Walker
6/29/11 3:45 PM
I cannot find any way to get ANY jar put in the hook lib directory to be visible, and I don't especially want to go fishing through the community plugins to find something that <em>might</em> work. I just want to put my own (arbitrary - not a service builder thing) library into a hook rather than tomcat/lib/ext. I'm currently on 5.2.3. Has anyone looked into this?
[...] You can override the JSP which display this page. You have to build a hook: http://www.liferay.com/web/raymond.auge/blog/-/blogs/portal-hook-plugins?_33_redirect=%2Fweb%2Frauge%2Fblog (follow the... [...] Read More