2012-02-08 35 views
5

Supongamos que el portlet X se ha implementado en Liferay y tiene una URL amigable asignada. Supongamos que un usuario ingresa al portal Liferay a través de la URL asignada, pero el portlet no está presente en el portal; se implementa pero no se agrega a la página.Usuario de alerta de Liferay cuando el portlet no está presente

Mi problema es que cuando el usuario utiliza la URL asignada no ocurre nada - el portal no da ningún comentario visual, que el portlet objetivo no está presente.

¿Cómo puedo cambiar eso? Necesito algún tipo de alerta/aviso al usuario ...

- editar -

no necesita utilizar un segundo portlet para comprobar la presencia de otro portlet.

Los atentamente,

Respuesta

4

yo sepa, no hay manera natual para que esto suceda. Un portlet no necesita siempre debe instalarse en una página. Entonces, el comportamiento es bastante normal.

Una vez solución hacky lo que podía pensar:

  1. controlar la ThemeDisplay objeto en una JSP mediante <liferay-theme:defineObjects /> lo que expondría el objeto implícito themeDisplay en el ámbito JSP.

  2. controlar la cadena de configuración del tipo usando:

    String typeSettings = themeDisplay.getLayout().getTypeSettings(); 
    
  3. valores de Tipo tendrán valores como el siguiente:

    layout-template-id=foobar_2column 
    sitemap-include=1 
    column-1=foo_WAR_barportlet,abc_WAR_barportlet,56_INSTANCE_K4Vv, 
    column-2=baz_WAR_xyzportlet, 
    sitemap-changefreq=daily 
    
  4. Así que si usted tiene un portlet no instanceable con ID foo dentro de WAR archivo bar, la ID única del portlet en el diseño será foo_WAR_barportlet.

  5. Una vez que conoce la ID del portlet que espera estar presente, es solo cuestión de que la cadena contenga cheque.

    <% if(!typeSettings.contains("foo_WAR_barportlet")) { %> 
        <h3 style="color: red">Alert! Portlet foo_WAR_barportlet not installed.</h3> 
    <% } %> 
    

Usted puede hacer los pasos anteriores incluso dentro de un tema, pero tendrás que hacerlo en la velocidad en lugar de Java a continuación. Espero que ayude.

EDITAR

Puede añadir esta línea dentro de su portal_normal.vm

#if(!$layout.getTypeSettings().contains("foo_WAR_barportlet")) 
    <h3 style="color: red">Alert! Portlet foo_WAR_barportlet not installed.</h3> 
#end 
+0

¿dónde debería agregar este código? – Queequeg

+0

Puede agregar esto al tema, pero luego tendrá que modificarlo ligeramente a medida que los temas se escriben en Velocity. – adarshr

+0

@Queequeg ver mi actualización – adarshr

1

Sí se puede lograr que el uso de la comunicación entre portlets, para notificar al usuario si el portlet se añade a la página o no. necesita crear otro portlet (vamos a llamarlo ListenerPortlet) que por defecto se encuentra en la página.

puede agregar el portlet Listener al tema, por lo que se agrega de forma predeterminada a cada página.

Ahora, cuando agrega su portlet a su página, su portlet debe desencadenar un evento de javascript en el lado del cliente y notificar a su portlet de escucha que su portlet se agrega a su página.

Desde su llamada de portlets,

Liferay.trigger(eventName, data) 

y vincular a su portlets Listener al evento

Liferay.bind(eventName, function, [scope]) //make the scope as page 

De esta manera su portlets oyente sabrá si se añade el portlet a la página o no. y puede mostrar un mensaje al usuario si el portlet no se agrega.

Para más cheque de la referencia del IPC

y más específicamente client-side Inter portlet communicaton

+0

Gracias por la respuesta. Lo que pasa es que no quiero otro portlet; puede apagarse tan fácil como el primer portlet. Necesito una alerta universal mostrada más bien por Liferay Portal que un portlet por separado. – Queequeg

+0

No existe un método directo proporcionado por liferay que diga si un portlet se agrega a una página o no. –

0

Sería mejor si tratamos esto,

ThemeDisplay themeDisplay = request.getAttribute(WebKeys.THEME_DISPLAY); 

Layout layout = LayoutLocalServiceUtil.getLayout(themeDisplay.getLayout().getPlid()); 
LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType(); 

List allPortletIds = layoutTypePortlet.getPortletIds(); 

Si la lista está vacía, entonces el imposible de la página contiene los portlets .

Gettings el LayoutTypePortlet asegura que la página a la que se redirigió al usuario es portlet de tipo de diseño.

+0

donde podría agregar este código? – Queequeg

+0

@sharanbm, eso es una buena idea, pero aún así este código irá a un portlet, que debe agregarse a una página. –

+0

@Queequeg necesita crear un MVCPortlet y poner este código dentro de eso, y ese portlet debería agregarse a la página. –

Cuestiones relacionadas