Archive for the ‘Liferay’ Category

URL de portlet en theme

Posted on octubre 10th, 2011 in Liferay | 142 Comments »

Podemos añadir cualquier portlet en un fichero de un theme de la siguiente manera.

Creamos la url del portlet usando el objeto portletURLFactory, al que le pasamos el siguiente valor, dependiendo de nuestras necesidades:

#*
  P_ID = El ID del portlet.
  PHASE = RENDER_PHASE/ACTION_PHASE
*#
#set ($portlet_url = $portletURLFactory.create($request, "P_ID", $page.getPlid(), "PHASE"))

Una vez tenemos esto, añadimos el estado de la ventana, el modo y los parámetros:

$portlet_url.setWindowState("maximized")
$portlet_url.setPortletMode("view")
$portlet_url.setParameter("struts_action", "message/edit")

Y, por último, usamos la url:

<a href="$portlet_url.toString()">link a mi portlet</a>

Enjoy adding portlet url in liferay theme files !

Acceder a valores del portal desde un portlet

Posted on septiembre 20th, 2011 in Liferay | 171 Comments »

Estos días, estoy trabajando en un portlet que, por diversas razones, necesita saber en qué página aparece del portal. Aunque parezca una estupidez, he pasado bastante tiempo mirando cómo obtener esta información, ya que parece, esto no está contemplado por el estandar de construcción de Portlet.

Finalmente, he logrado la respuesta para Liferay y, de nuevo, era mucho más simple de lo que parecía, por eso lo de estúpido. De todos modos, ahí va, por si alguien se puede evitar perder tiempo con algo como esto.

En el request tenemos un atributo que contiene el objeto ThemeDisplay. Este lo podemos obtener de la siguiente manera:

ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute (
     com.liferay.portal.kernel.util.WebKeys.THEME_DISPLAY);


Si lo usamos dentro de un jsp, no es necesario obtenerlo, ya que Liferay lo hace por nosotros, con lo que sólo tendremos que acceder al objeto themeDisplay:

<%
    long currentGroup = themeDisplay.getParentGroupId();
    long currentLayout = themeDisplay.getLayout().getLayoutId();
%>


Variables personalizadas en Velocity

Posted on septiembre 15th, 2011 in Liferay | 131 Comments »

A veces nos encontramos creando o modificando un Theme de Liferay y necesitamos usar nuestras propias variables que, por supuesto, no vienen definidas en Liferay.

Para ello, debemos usar un hook. En él, crearemos una clase que extenderá com.liferay.portal.kernel.events.Action y en la que sobreescribiremos el método run(). Será en este donde añadamos nuestras variables.

public void run(final HttpServletRequest req,
        final HttpServletResponse res) throws ActionException {

    Map<Object, Object> vmVariables = new HashMap<Object, Object>();
    vmVariables.put("mimensaje", "este mensaje podría ser recuperado en el theme");
    req.setAttribute(WebKeys.VM_VARIABLES, vmVariables);
}

Una vez tenemos la clase, sólo tenemos que declararla en el fichero portal.properties del hook:

servlet.service.events.pre=com.ejemplo.CustomVelocityVariablesAction

Con esto, desplegamos y ya podemos usarla en nuestros themes.

Liferay pop up con Alloy

Posted on septiembre 1st, 2011 in Liferay | No Comments »

En versiones anteriores de Liferay se usaba Liferay.Popup para hacer popups usando jQuery. Ahora, con la nueva versión, deberemos usar Alloy UI.

Mostrar contenido html en un 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>

Pasar una URL al 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>

Mostrar el formulario de login en un pop-up

Posted on agosto 25th, 2011 in Liferay | 116 Comments »

Antes de nada, debemos obtener la URL del portlet de login. En este caso es la siguiente:

/web/guest/home?p_p_id=58&p_p_lifecycle=0&p_p_state=pop_up&p_p_mode=view&saveLastPath=0&_58_struts_action=%2Flogin%2Flogin

Una vez la tenemos, debemos modificar el fichero portal_normal.vm de nuestro theme. Ahí crearemos el JavaScript que va a lanzar el pop up:

function showLogin() {
	AUI().use('aui-dialog', 'aui-overlay-manager', 'dd-constrain', function(A) {
		var dialog = new A.Dialog({
			title: 'Login',
			centered: true,
			modal: true,
			width: 500,
			height: 250
		}).plug(A.Plugin.IO, {
uri: '/web/guest/home?p_p_id=58&p_p_lifecycle=0&p_p_state=pop_up&p_p_mode=view&saveLastPath=0&_58_struts_action=%2Flogin%2Flogin'}).render();
		dialog.show();
	});
}

Finalmente, sólo nos queda crear el link que lanzará esta función:

<a href="javascript:void(0)" onclick="showLogin();">Login</a>

Evitar el mensaje “La operación ha sido realizada correctamente.”

Posted on agosto 24th, 2011 in Liferay | 145 Comments »

Cuando creamos un portlet para Liferay implementando us MVCPortlet, acostumbra a salir este mensaje cuando nos movemos de una página a otra. Hay dos maneras de evitarlo.

1. Hacer que no salgan nunca, para lo que habría que añadir lo siguiente en portlet.xml:

<init-param>
      <name>add-process-action-success-action</name>
      <value></value>
</init-param>

2. Sobreescribir en el portlet el método addSuccessMessage:

protected void addSuccessMessage(
    ActionRequest actionRequest, ActionResponse actionResponse) {
        if (!addProcessActionSuccessMessage) {
            return;
        }
        String successMessage = ParamUtil.getString(
            actionRequest, "successMessage");
        SessionMessages.add(actionRequest, "request_processed", successMessage);
    }

Liferay – Cambiar el Theme por defecto

Posted on agosto 23rd, 2011 in Liferay | 140 Comments »

Un theme de liferay tiene un id y un nombre que se puede ver en el fichero liferay-look-and-feel.xml que se encuentra en el directorio WEB-INF del theme. Algo como esto:

Para que “cool” sea el theme por defecto, se añade la siguiente línea en portal-ext.properties:

default.regular.theme.id=cool_WAR_cooltheme

Y aquí viene lo divetido, no se usa únicamente el id del theme, si no también el nombre de contexto del war que lo incluye, omitiendo guiones, espacios, barras, etc. Esto es para Liferay 6, en versiones anteriores era suficiente con el id.

Si tienes algún problema averiguando el nombre exacto que hay que poner en la configuración, se puede obtener de la siguiente manera:

1. Añade el theme a una página
2. Consulta la base de datos con: Select themeId from Layout;

Aquí, obtén el theme id que coincide con el nombre de tu theme.

Una vez añadida la línea a portal-ext.properties, reiniciar Liferay.

Más información sobre la identificación de themes en http://www.liferay.com/community/wiki/-/wiki/Main/Theme+Id+or+Portlet+Id+references+in+portal-ext.properties.

Ocultar un portlet para el que no se tienen permisos

Posted on agosto 9th, 2011 in Liferay | 115 Comments »

A veces ocurre en Liferay que un portlet debe ser visible sólo para un tipo de usuarios. Esto se consigue configurando la visibilidad por roles. Una vez configuramos esto, por defecto, para aquellos usuarios que no tiene permiso de visibilidad, Liferay mostrará el siguiente mensaje:

Lo siento, no tiene los roles necesarios para acceder a este portlet

Para evitar que ocurra esto, debemos modificar el fichero portal-ext.properties y añadir la siguiente línea:

layout.show.portlet.access.denied=false

Esto hará que el portlet no aparezca cuando no tengamos permisos para verlo.