Forums

Home » Liferay Portal » English » 3. Development

Combination View Flat View Tree View
Threads [ Previous | Next ]
toggle
Barry Rowe
[RESOLVED] Load Custom Portlet Plugin via AJAX from Dockbar
October 22, 2010 9:24 AM
Answer

Barry Rowe

Rank: New Member

Posts: 14

Join Date: October 22, 2010

Recent Posts

Desired Functionality:

I would like to provide a link in the dockbar that will load a custom Portlet Plugin into a Dockbar Underlay. I want this to work just like the "addApplication" feature that loads the Layout_Configuration portlet.

What I'm trying:
I have a created a simple portlet plugin called about-portlet and the liferay-portlet.xml <portlet> entry looks like below:
 1<portlet>
 2        <portlet-name>about-portlet</portlet-name>
 3        <icon>/icon.png</icon>            
 4        <instanceable>false</instanceable>
 5        <ajaxable>true</ajaxable>                   
 6        <header-portlet-css>/css/portlet.css</header-portlet-css>
 7        <footer-portlet-javascript>
 8            /js/javascript.js
 9        </footer-portlet-javascript>
10        <css-class-wrapper>aboutportlet-portlet</css-class-wrapper>       
11        <add-default-resource>true</add-default-resource>       
12        <system>true</system>
13    </portlet>


This portlet works as expected (I set <system> to false and am able to add the portlet to any of my pages and it shows just fine).

I have a hook plugin that overrides the view.jsp for the Dockbar, and I have added what is almost a duplicate of the AUI javascript function that loads the addApplication portlet (p_p_id = 87). The following appears just before the addApplication.on('click'.... code in /dockbar/view.jsp:
 1
 2var aboutPortal = A.one('#aboutPortal');
 3                                        if(aboutPortal){
 4                                            aboutPortal.on('click',
 5                                                function(event){
 6                                                    alert(themeDisplay.getPlid());                                                                                                       
 7                                                    if(!Liferay.Dockbar.aboutUnderlay){                                                                                                                                                                                       
 8                                                        instance.addUnderlay(
 9                                                            {                                                               
10                                                                className: 'about_portal',
11                                                                io: {
12                                                                        data: { p_l_id: themeDisplay.getPlid(),
13                                                                                p_p_id: 'aboutportlet_WAR_aboutportlet',
14                                                                                p_p_state: 'exclusive'                                                      
15                                                                                },
16                                                                        uri: themeDisplay.getPathMain() + '/portal/render_portlet'                                                                        
17                                                                    },
18                                                                 name: 'aboutUnderlay',
19                                                                 width: '400px'
20                                                             });
21                                                        //end instance.addUnderlay            
22                                                    }
23                                                    else {
24                                                        Liferay.Dockbar.aboutUnderlay.show();
25                                                    }                                                   
26                                                    Liferay.Dockbar.aboutUnderlay.focus();
27                                                });
28                                            //end event definition for aboutPortal.on()
29                                        }


I also know this js is good, as It loads and shows the "addApplication" portlet or the login portlet just fine if I change the p_P_id parameter to 87 or 58 respectively.

It seems there would be a way to configure a portlet plugin to be available to the render_portlet action WITHOUT having it added to a Layout somewhere within the portal.

Additional Notes:
-If I make the portlet a non-system portlet (<system>false</system>) and add it to a page, then call my js from that page, the portlet shows in the Underlay just fine.
-I have tried removing the p_l_id paramter from my AJAX call so that the render_portlet action does not look at a specific layout for the portlet, and it still does not work.
-I do receive the following JS error when the portlet has not been added to any page which I believe is the Underlay initialization blowing up due to a null portlet instance:

Error: uncaught exception: [Exception... "Component returned failure code: 0x80004003 (NS_ERROR_INVALID_POINTER)" nsresult: "0x80004003 (NS_ERROR_INVALID_POINTER)"

-My portlet plugin is a liferay MVCPortlet

-I have been able to debug and watch the RenderPortletAction fire and complete with no errors when I make the ajax call.
-Using Liferay 6.0.4

What am I missing? Thank you!
Barry Rowe
RE: Load Custom Portlet Plugin via AJAX from Dockbar
October 22, 2010 9:24 AM
Answer

Barry Rowe

Rank: New Member

Posts: 14

Join Date: October 22, 2010

Recent Posts

I now have this working. I found the answer in this thread thanks to the post by Jelmer Kuperas:

What I was missing:
1
2<%@page import="com.liferay.portlet.PortletURLFactoryUtil" %>

...
1
2PortletURL url = PortletURLFactoryUtil.create(request, "aboutportlet_WAR_aboutportlet", layout.getPlid(), PortletRequest.RENDER_PHASE);
3        url.setWindowState(LiferayWindowState.EXCLUSIVE);

...
1
2uri: '<%= url.toString()%>'


This works without having to add the portlet to a "hidden" page/community.
Barry Rowe
RE: Load Custom Portlet Plugin via AJAX from Dockbar
April 30, 2012 10:27 AM
Answer

Barry Rowe

Rank: New Member

Posts: 14

Join Date: October 22, 2010

Recent Posts

If you're using the AUI script to load the portlet in an Underlay, it will be displayed on the same page, much like the Layouts menu when you select "Page Layout" under Manage.

If you would like to open the portlet in a true popup/a new tab, you can use the "target" attribute of your anchor tag.

The PortletURL you build will be the same, you'll just need to manually add the parameters we add wihin the AUI script.

You'll need to manually add the following parameters to your PortletURL object:
1
2...
3p_l_id: themeDisplay.getPlid(),    //This is the layout id
4p_p_id: 'aboutportlet_WAR_aboutportlet',   //This is the portletId
5p_p_state: 'exclusive'     //This is the type of state that the View should render.
6...


Then you just set your PortletURL object as the href for an anchor tag like so:

1
2<a href="<%=url%>" target="_new">Open My Portlet</a>


I hope this helps!