Wednesday, July 25, 2012

liferay-ui:discussion with custom portlet (MVCPortlet)

liferay-ui:discussion with custom portlet(MVCPortlet / Liferay 6.1)

Add the below code in view.jsp


<%

 WindowState windowState = null;
 PortletMode portletMode = null;
 PortletURL currentURLObj = null;
 if (renderRequest != null) {
          windowState = renderRequest.getWindowState();
          portletMode = renderRequest.getPortletMode();
          currentURLObj = PortletURLUtil.getCurrent(renderRequest, renderResponse);
} else if (resourceRequest != null) {
         windowState = resourceRequest.getWindowState();
          portletMode = resourceRequest.getPortletMode();
          currentURLObj = PortletURLUtil.getCurrent(resourceRequest, resourceResponse);
 }

String currentURL = currentURLObj.toString();

 %>


Add the below invokeTaglibDiscussion method in YourPortletClass. java

public void invokeTaglibDiscussion(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception {

PortletConfig portletConfig = getPortletConfig();

 PortalClassInvoker .invoke(true, "com.liferay.portlet.messageboards.action.EditDiscussionAction",       
                  "processAction", new String[] {
                                  "org.apache.struts.action.ActionMapping",
                                  "org.apache.struts.action.ActionForm",
                                  PortletConfig.class.getName(),
                                  ActionRequest.class.getName(),
                                 ActionResponse.class.getName()
                  }, null, null, portletConfig, actionRequest, actionResponse);
}

Monday, February 14, 2011

jQuery ajax with liferay 6.0.5

jQuery ajax with liferay 6.0.5



<portlet:actionURL var="ajaxURL" name="add" windowState="< %= LiferayWindowState.EXCLUSIVE.toString()%>" />


<form action="" name="fm" id="fm" method="post">
    <a href="#" onclick="submitForm();">confirm < /a>
</form>


<script type="text/javascript" >
    function submitForm(){
        jQuery.ajax({
          type: 'POST',
          url: '<%= ajaxURL % >',
          success: function(data){
              jQuery('#p_p_id<portlet:namespace/ > .portlet-content').html(data);
          }
        });
    }
</script >

Alloy UI with Ajax

<portlet:actionURL var="ajaxURL" name="add" windowState="< %= LiferayWindowState.EXCLUSIVE.toString()%>" />


<form action="" name="fm" id="fm" method="post">
    <a href="#" onclick="submitForm();">confirm < /a>
</form>

<aui:script use="aui-io-request,aui-node" >
    Liferay.provide(
            window,
            'submitForm',
            function() {
               var A = AUI();
            A.io.request('<%= ajaxURL % >', {
              on: {
               success: function() {
                       A.one('#p_p_id<portlet:namespace/ >.portlet-content').html(this.get('responseData'));
               }
              }
            });
        });
</aui:script >
 Liferay Portal 5.2 Systems Development

Monday, January 31, 2011

Custom Sql in Liferay Plugin Portlet

Create a Custom Query in Plugin Portlet for Liferay Models(Liferay 6.0.x).

Step 1 :- Creating a library portlet
===========================

In the $PLUGINS_SDK/portlets(Windows)

create library-portlet "Library"

Step 2 :-

in portlet.xml

< portlet-class > com.liferay.util.bridges.mvc.MVCPortlet < /portlet-class >
replace with
< portlet-class > com.mpower.action.LibraryPortlet < /portlet-class >


Step 3 :-


Create service.xml under docroot/WEB-INF


< ?xml version="1.0" encoding="UTF-8"? >
<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 6.0.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_6_0_0.dtd" >
< service-builder package-path="com.mpower" >
< author > Arun Kumar < /author >
< namespace > library < /namespace >
< entity name="Book" local-service="true" remote-service="false" >
< column name="bookId" type="long" primary="true" / >
< column name="name" type="String" / >
< column name="author" type="String" / >
< order by="asc" >
< order-column name="name" case-sensitive="false" / >
< /order >
< /entity >
< /service-builder >



Step 4 :-

a. Create a folder custom-sql under src

b. Create a file default.xml under src/custom-sql

< ?xml version="1.0"? >
< custom-sql >
< sql file="custom-sql/book.xml" / >
< /custom-sql >

c. Create a file book.xml, under src/custom-sql

< ?xml version="1.0"? >
< custom-sql >
< sql id="findBooks" >
< ![CDATA[
SELECT
*
FROM
library_book
WHERE
(library_book.name like ?)
]] >
< /sql>
< /custom-sql >

Step 5 :-

Create the file "BookFinderImpl.java" under service/persistence

public class BookFinderImpl extends BasePersistenceImpl implements
BookFinder {

}


Do ant build-service to generate necessary files.



Step 6 :-

Now write the logic to access the custom sql


public List findBooks(String name) throws SystemException {
Session session = null;
try {
session = openSession();
String sql = CustomSQLUtil.get(FIND_BOOKS);
SQLQuery query = session.createSQLQuery(sql);
query.addEntity("Book", BookImpl.class);
QueryPos qPos = QueryPos.getInstance(query);
qPos.add(name);
return (List)query.list();
}catch (Exception e) {
}
return null;
}

public static String FIND_BOOKS = "findBooks";



*** Make the necessary imports.


import java.util.List;

import com.liferay.portal.kernel.dao.orm.QueryPos;
import com.liferay.portal.kernel.dao.orm.SQLQuery;
import com.liferay.portal.kernel.dao.orm.Session;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.service.persistence.impl.BasePersistenceImpl;
import com.liferay.util.dao.orm.CustomSQLUtil;


Step 7 :-

Now write the method in BookLocalServiceImpl.java


public class BookLocalServiceImpl extends BookLocalServiceBaseImpl {

public List findBook(String name) throws PortalException,
SystemException, RemoteException {

return BookFinderUtil.findBooks("%" + name + "%");
}


run ant build-service , this will update the corresponding api with new method defined.

Step 8 :-

a. Create init.jsp under docroot and add the below content


< %@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" % >
< %@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" % >
< portlet:defineObjects / >
< %@ page import="com.mpower.service.BookLocalServiceUtil" % >
< %@ page import="com.mpower.model.Book" % >
< %@ page import="java.util.*" % >

b. Create result.jsp under docroot/


< %@page import="com.liferay.portal.kernel.util.Validator"% >
< %@ include file="init.jsp" % >

<% List books = (List) request.getAttribute("result");
if(Validator.isNull(books))books = new ArrayList();

%>

< liferay-ui:search-container delta="10" emptyResultsMessage="no-books-were-found" >
< liferay-ui:search-container-results
results="< %= books % >"
total="< %= books.size( )% >"
/>

< liferay-ui:search-container-row className="com.mpower.model.Book" modelVar="book" >

< liferay-ui:search-container-column-text
name="Book Title"
property="name"
/ >

< liferay-ui:search-container-column-text
name="Author"
property="author"
/ >

< /liferay-ui:search-container-row >

< liferay-ui:search-iterator / >

< /liferay-ui:search-container >


C. Update the view.jsp

< %@ include file="init.jsp" % >
< portlet:actionURL var="findURL" name="findBooks" / >

< form action="< %= findURL.toString() % >" name="fm" method="post" >


< label > Book Title < /label > < input name="title" value=""/ > < input type="submit" value="Search"/ >

< /form >


d. Create the portlet class LibraryPortlet.java under src/com/mpower/action


package com.mpower.action;

import java.io.IOException;
import java.util.List;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;
import com.mpower.model.Book;
import com.mpower.service.BookLocalServiceUtil;

public class LibraryPortlet extends MVCPortlet{

public void findBooks(ActionRequest actionRequest,
ActionResponse actionResponse) throws IOException, PortletException {

String name = ParamUtil.getString(actionRequest, "title");

try {
List books = BookLocalServiceUtil.findBook(name);
actionRequest.setAttribute("result", books);
actionResponse.setRenderParameter("jspPage", "/result.jsp");
} catch (PortalException e) {
e.printStackTrace();
} catch (SystemException e) {
e.printStackTrace();
}


}
}




run "ant deploy" and check the search functionality in Library portlet.






Thursday, January 20, 2011

portlet render url

 1. In JSP
<portlet:renderURL var="sampleURL">
<portlet:param name="jspPage" value="jsp file path"/>
</portlet:renderURL>



 2. In Java
PortletURL sampleURL = renderResponse.createRenderURL();
sampleURL .setParameter("jspPage", " jsp file path ");






Portlets in Action

Wednesday, January 12, 2011

Jasper Report with Liferay integration

JASPER REPORT
===============
1) step-1
~~~~~~~~~~~

package com.ext.portlet.<some>.service.impl;

public class <some>LocalServiceImpl extends <some>LocalServiceBaseImpl {

public void downloadReport() throws SystemException, PortalException{


UserLocalService service = UserLocalServiceUtil.getService();

DetachedCriteria dCriteria = DetachedCriteria.forClass(User.class);

dCriteria.add(Restrictions.eq("active", true));

DynamicQuery dynamicQuery = new DynamicQueryImpl(dCriteria);

List<user> userList = (List)service.dynamicQuery(dynamicQuery);
List<userandcontactinfo> userandContactInfoList = new ArrayList<userandcontactinfo>();
for(int i=0; i<userlist.size(); classloader="" contact);="" contact="" i++){="" user="" userandcontactinfo(user,="" userandcontactinfo="" userandcontactinfolist.add(userandcontactinfo);="" }="">LocalServiceImpl.class.getClassLoader();
JasperDesign jasperDesign;
JasperReport jasperReport;
JasperPrint jasperPrint;
try {

InputStream inputStream = classloader.getResourceAsStream("profiles.jrxml");

jasperDesign = JRXmlLoader.load(inputStream);


jasperReport = JasperCompileManager.compileReport(jasperDesign);
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(
userandContactInfoList);
jasperPrint = JasperFillManager.fillReport(
jasperReport, null, ds);

String dest ;
File file = new File("");
dest = file.getAbsolutePath();

JasperExportManager.exportReportToPdfFile(jasperPrint, dest+"/profiles.pdf");

} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

------------------------------------------------------------------------------------

step-2
~~~~~~~~~~

package com.ext.portlet.<some>.action;

import java.io.Serializable;
import java.util.Date;

import com.ext.portlet.<some>.model.UserInfo;
import com.liferay.portal.model.Contact;
import com.liferay.portal.model.User;


public class UserandContactInfo implements Serializable {

/**
*
*/
private static final long serialVersionUID = 1L;
public UserandContactInfo(User user, Contact contact){

this.screenName = user.getScreenName();
this.firstName = user.getFirstName();
this.lastName = user.getLastName();
this.dob = user.getBirthday();
this.gender = (contact.getMale()?"Male":"Female");
this.emailAddress = user.getEmailAddress();
}


public String getEmailAddress() {
return emailAddress;
}
public String getFullName() {
return fullName;
}
public String getScreenName() {
return screenName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}

private String emailAddress;
private String fullName;
private String screenName;
private String firstName;
private String lastName;


}

---------------------------------------------------------------------------------------------------------------------

step-3
~~~~~~~~~~~~


package com.ext.portlet.<some>.action;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.ext.portlet.<some>.service.<some>LocalServiceUtil;
import com.liferay.portal.struts.PortletAction;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.servlet.ServletResponseUtil;

public class DownloadPdf extends PortletAction {

public ActionForward strutsExecute(
ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response)
throws Exception {

try {
<some>ServiceUtil.downloadReport();
InputStream is = new BufferedInputStream(
new FileInputStream("profiles.pdf"));

ServletResponseUtil.sendFile(response, "Profiles.pdf", is, "application/pdf");

return null;
}
catch (Exception e) {
PortalUtil.sendError(e, request, response);
return null;
}
}
}

--------------------------------------------------------------------------------------------------------------------

step-4
~~~~~~~~~~
jrxml file should be >>>>>>>>> ext-impl/src/profiles.jrxml
==============

<jasperreport bottommargin="20" columncount="1" columnspacing="0" columnwidth="535" issummarynewpage="false" istitlenewpage="false" leftmargin="30" name="profiles" orientation="Portrait" pageheight="842" pagewidth="595" printorder="Vertical" rightmargin="30" topmargin="20" whennodatatype="NoPages">
<property name="ireport.scriptlethandling" value="0">
<property name="ireport.encoding" value="UTF-8">
<import value="java.util.*">
<import value="net.sf.jasperreports.engine.*">
<import value="net.sf.jasperreports.engine.data.*">


<field class="java.lang.String" name="emailAddress">
<field class="java.lang.String" name="fullName">
<field class="java.lang.String" name="screenName">
<field class="java.lang.String" name="firstName">
<field class="java.lang.String" name="lastName">


<background>
<band height="0" issplitallowed="true">
</band>
</background>
< title > <br /> <band height="12" isSplitAllowed="true" ><br /> </band><br />
<pageheader>
<band height="19" issplitallowed="true">
<textfield evaluationtime="Now" hyperlinktarget="Self" hyperlinktype="None" isblankwhennull="false" isstretchwithoverflow="false">
<reportelement forecolor="red" height="18" key="textField" width="100" x="404" y="1">
<box></box>
<textelement>

</textelement>
<textfieldexpression class="java.lang.Integer"></textfieldexpression>
</reportelement>

</textfield>
</band>
<columnheader>
<band height="0" issplitallowed="true">
</band>
</columnheader>
<detail>
<band height="783" issplitallowed="true">
<textfield evaluationtime="Now" hyperlinktarget="Self" hyperlinktype="None" isblankwhennull="false" isstretchwithoverflow="false">
<reportelement height="18" key="textField" width="205" x="133" y="136">
<box></box>
<textelement>

</textelement>
<textfieldexpression class="java.lang.String"></textfieldexpression>
</reportelement>
<textfield evaluationtime="Now" hyperlinktarget="Self" hyperlinktype="None" isblankwhennull="false" isstretchwithoverflow="false">
<reportelement height="18" key="textField" width="271" x="133" y="37">
<box></box>
<textelement>

</textelement>
<textfieldexpression class="java.lang.String"></textfieldexpression></reportelement>
-------------
-----------
------------
---------
</textfield>
</textfield>
<columnfooter>
<band height="0" issplitallowed="true">
</band>
</columnfooter>
<pagefooter>
<band height="0" issplitallowed="true">
</band>
</pagefooter>
<lastpagefooter>
<band height="16" issplitallowed="true">
</band>
</lastpagefooter>
<summary>
<band height="15" issplitallowed="true">
</band>
</summary>
</band>

--------------------------------------------------------------------------------------------------------------------


step-5
~~~~~~~~~

Required jars


a) jasperreports-3.0.0.jar >>>>>>>>tomcat/webapps/ROOT/WEB-INF/lib
b) itext-1.3.1.jar >>>>>>> tomcat/webapps/ROOT/WEB-INF/lib

JasperReports 3.5 for Java Developers

Liferay Alloy Popup

In Liferay's previous versions, we are using Liferay.Popup for popup window using jQuery.

As Liferay is moved to Alloy UI , Here is the code for Alloy Popup:


To Display some Html content in Alloy Popup:


< aui:script >

function callPopup(){

AUI().ready('aui-dialog', 'aui-overlay-manager', 'dd-constrain', function(A) {

var dialog = new A.Dialog({

title: 'DISPLAY CONTENT',

centered: true,

modal: true,

width: 500,

height: 400,

bodyContent: "This is testing content inside the popup"

}).render();

});

}

</aui:script >




Passing URL : Passing URL into Alloy Popup

<aui:script>

Liferay.provide(window,'<portlet:namespace />callPopup',

function(url1) {

var A = AUI();

var data = {};

var dialog = new A.Dialog(

{

centered: true,

destroyOnClose: true,

modal: true,

title: Liferay.Language.get('Display-Content'),

width: 600

}

).render();

dialog.plug(

A.Plugin.IO,

{

data: data,

uri: url1

}

);

},

['aui-dialog', 'aui-io']

);

</aui:script >

Liferay in Action: The Official Guide to Liferay Portal Development

Friday, August 6, 2010

Inter Portlet Communication (IPC) for Portlets on Different Page

Use the below code for Inter Portlet Communication (IPC) for Portlets on Different Page:-

String plidName = "Sample_WAR_Sampleportlet";
long plidForward = getPortletId(plidName);
PortletURL url = new PortletURLImpl(request,plidName, plidForward, PortletRequest.ACTION_PHASE);

---------------------------------------------------------------------------------

public static long getPortletId(String portletId) {

PortletPreferences prfs = null;
try {
DetachedCriteria dCriteria = DetachedCriteria
.forClass(PortletPreferences.class);
dCriteria.add(Restrictions.eq("portletId", portletId));
DynamicQuery dynamicQuery = new DynamicQueryImpl(dCriteria);

List list = PortletPreferencesLocalServiceUtil.dynamicQuery(dynamicQuery);

if (!list.isEmpty()) {
prfs = (PortletPreferences) list.get(0);
}

} catch (Exception e) {
e.printStackTrace();
}
return prfs.getPlid();
}

Friday, July 30, 2010

Liferay Service Builder

Liferay has very good service builder
utility. We can specify our domain model in
a service.xml file and run an ant task. The
utility will create Java files, Hibernate files,
Service Builder
and service classes

• Service Builder is a RAD tool, we may
choose to use our own service framework
and layer instead

Liferay supports Web Services

Liferay supports Web Services :-

• JSON
• Hessian
• Burlap
• REST
• RMI
• Spring HTTP
• WSRP
• WebDAV