Problemas con JSF usando el Dialog Framework+Primefaces+Liferay

18-02-2014
 

JSF+PrimeFaces+Liferay Screen

JSF+PrimeFaces+Liferay Screen


Hoy he pasado un infierno intentando hacer funcionar los ‘Dialogs’ de JSF(JavaServer Faces)+Primefaces en Liferay. El motivo es que al insertar un ‘iFrame’ en la ventana hace una petición devolviendo todo el portal(El portlet de Liferay no hacía la petición con el estado ‘POP_UP’ que indica al portal que no debe devolver todo el portal sino simplemente el portlet ).

No se si existe una manera mas elegante de solventar el problema, si alguien la sabe y me la deja en los comentarios será super bienvenido.

Mi solución ha sido crearme una classe mapeadora que cuando encuentra el parámetro ‘popup’ injecte el parámetro p_p_state=pop_up.

portlet-liferay.xml

<icon>/icon.png</icon>
<friendly-url-mapper-class>com.lostsys.miaplicacion.URLMapper</friendly-url-mapper-class>
<instanceable>false</instanceable>

URLMapper.java

...
	public String buildPath(LiferayPortletURL portletURL) {
		String popup = GetterUtil.getString( portletURL.getParameter("_popup") );
		
		if ( popup!=null ) {
				portletURL.addParameterIncludedInPath("p_p_state");
			
				return "/"+_mapping+"/popup";
				}
		
		return null;
		}

	public void populateParams(java.lang.String friendlyURLPath, java.util.Map<java.lang.String,java.lang.String[]> params,java.util.Map<java.lang.String,java.lang.Object> requestContext) {
		String[] s=friendlyURLPath.split("/");
		
		if ( s[2].equals("popup") ) {
			params.put( "p_p_state",new String[] { LiferayWindowState.POP_UP.toString() });
			}
		}
...

Ahora con la clase mapeadora funcionando podemos abrir diálogos de la siguiente manera:

	Map<String,List<String>> params=new HashMap<String,List<String>>();
	Vector<String> v=new Vector<String>();
	v.add("1");
		
	params.put("_popup", (List<String>) v );
  	
	Map<String,Object> options = new HashMap<String, Object>();  
	options.put("modal", true);  
	options.put("draggable", false);  
	options.put("resizable", false);  
	options.put("contentWidth", 920);  
	options.put("contentHeight", 600);  

	RequestContext.getCurrentInstance().openDialog("/views/edit.xhtml", options, params);

Comments

6 Responses to “Problemas con JSF usando el Dialog Framework+Primefaces+Liferay”
  1. David Quiñones says:

    Hola Albet, me estoy encontrando con el mismo problema con el frameword dialog de primefaces, y estoy sigiendo tu solución, me puedes indicar el valor que tiene mapping, gracias.

    if ( popup!=null ) {
    portletURL.addParameterIncludedInPath(“p_p_state”);

    return “/”+_mapping+”/popup”;
    }

  2. Hola David,

    En mapping puedes ponerle cualquier valor, por ejemplo ‘miportletjsf’. Va a ser como identificará liferay tu URL de la de otro portlet.

    Saludos,

  3. Juan Rellano says:

    Hola Albert,

    Me estoy encontrando con el mismo problema y he adoptado tu solución. El caso es que cuando configuro el mapper no me aparece el popup. No sé que estoy haciendo mal, pero por ejemplo, nunca me pasa por el método populateParams.

    ¿Sabes que podría estar haciendo mal?

  4. Hola Juan,

    No te sabría decir. Te genera bien las nuevas URLs? Creo que la respuesta a tu problema esta en el PrimeFaces, has probado a abrir otro tipo de diálogos?

    Saludos,

  5. Juan G. says:

    Hola Alberto, me alegra decirte que se ha arreglado este problema para conseguir abrir una ventana en modo “pop_up”. Echa un vistazo a este post para ver más detalles y que a partir de ahora será mucho más sencillo:

    https://www.liferay.com/community/forums/-/message_boards/view_message/50274119

  6. Hola Juan,

    Fantástico! Le echaré un vistazo. Tiene muy buena pinta, con esto ya simplemente añadiendo el parámetro ‘p_p_state’ ya funciona.

    Un abrazo,

Leave a Reply

© Albert Coronado Calzada