Utilizar otra base de datos

En ciertos casos es necesario conectarse a otra base de datos, y utilizar los servicios de Liferay para conectarse a la misma.

Este link muestra como hacerlo.

Publicado en General | Etiquetado | 2 comentarios

Nueva funcionalidad para el panel de control en LR 5.2.3

A partir de LR 5.2.3 podremos contar con:

Se podra modificar la configuración para subir archivos, aca podremos definir el tamaño maximo y los tipos de archivos permitidos tanto para Image Gallery, Document Library, Web Content Images y Shopping Cart Images.

También se podra modificar la configuración del servidor de mail a traves del Panel de control.

Fuente

http://www.liferay.com/web/bswaim/blog/-/blogs/configure-your-file-upload-settings-from-control-panel;jsessionid=2D1D5CD386D5137341F407137BDFBC6A

http://www.liferay.com/web/bswaim/blog/-/blogs/new-way-to-change-pop-smtp-settings

Publicado en General | Deja un comentario

Flex [off topic]

Dejo un link que me pasaron el otro día un compañero del trabajo, son unos cuantos videos de Flex.  Son muy interesantes, y es para arrancar desde cero.  También proponen unos ejercicios para resolver con su correspondiente corrección.

http://www.adobe.com/devnet/flex/videotraining

Espero que les sirva mucho.

Publicado en General | 1 comentario

Retomando el Blog

Hace tiempo que he dejado este blog colgado, después de unas buenas vacaciones que me tome en enero y ahora que acabo de terminar la facultad y me he recibido de Ingeniero en Sistemas; me gustaria continuar escribiendo en este blog, y tratare de hacerlo periodicamente.

Mi idea es tratar de migrar de WordPress a Liferay en los próximos días, y estoy buscando colaboradores que se sumen a esta iniciativa, que tengan las ganas de contribuir y escribir.

Publicado en General | Deja un comentario

Comprimir JS y CSS en el inicio del Tomcat

En el post Even MORE Performance fixes, me encontre con un nuevo feature muy interesante. Se trata de que cuando se inicia el TOMCAT se comprimen los javascript y css necesarios para obtener un mejor rendimiento de la carga del sitio en el cliente. ¿A que me refiero? A que genera los archivos ***_unpacked.css, ***_packed.css, ***_unpacked.js, ***_packed.js.  Si bien no es complicado generar estos archivos, esta nueva funcionalidad simplica más el trabajo del desarrollador y mantiene siempre los archivos comprimos actualizados.

Publicado en General | Etiquetado | 1 comentario

Aplicaciones web para el IPhone dentro de Liferay

Al leer el post Laverage IPhone web applications within Liferay, pense que cuando se accede a un sitio que tenga Liferay desde un IPhone el layout de la pagina se ajustaria a la pantalla del IPhone como pasa cuando se accede desde un celular mediante WAP.  El post simplemente habla de utilizar aplicaciones web de terceros como facebook, digg, twitter, entre otras; dentro de un iframe.  Considero que esto no aporta absolutamente nada de nuevo a Liferay.

¿Alguien accedio desde un IPhone a un sitio de Liferay? ¿Este sitio se muestra como si fuera WAP? ¿O se muestra en forma normal? Haciendo un analisis sin realizar una prueba (porque no tengo el IPhone) creo que se mostraria como una página normal, aunque considero que la página deberia ajustarse a la pantalla del IPhone como funcionan estas aplicaciones web que mencionamos anteriormente, esto serviria para una mejor navegación del sitio.

Publicado en General | Etiquetado | Deja un comentario

PortletURL en JavaScript

Una funcionalidad que acabo de descubrir en el Blog de Liferay es crear el PortletUrl en JavaScript.

Un ejemplo de PortletUrl es:

http://localhost:8080/web/guest/home?p_p_id=EDITAR_CUENTA&p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view&_EDITAR_CUENTA_struts_action=%2Feditar_cuenta%2Fview

Aca le estoy pasando el portlet id, el estado del portlet, la fase del ciclo de vida, la acción de struts a ejecutar y 1 parametro (podrian ser muchos más).  Anteriormente la manipulación de esta url era medio complicada, ya que solo se podia generar a traves de JAVA o mediante una concatenación kilometrica de varios strings.  Con esta funcion nos proporciona mayor flexibilidad a la hora de programar.

<script type="text/javascript">
var portletURL = new Liferay.PortletURL(_PHASE);
portletURL.setParameter("key1", "value");
portletURL.setParameter("key2", "value");
portletURL.setPortletId(_PORTLET_ID);
</script>
 
<a href="javascript: portletURL.toString()">Go to</a>

Los valores que puede tomar _PHASE son:

  • ACTION_PHASE
  • RENDER_PHASE
  • RESOURCE_PHASE

También existen los siguientes métodos que permiten crear el PortletUrl según _PHASE:

  • Liferay.PortletURL.createActionURL();
  • Liferay.PortletURL.createRenderURL();
  • Liferay.PortletURL.createResourceURL();

Estos son los métodos restantes de la clase Liferay.PortletURL:

  • setCopyCurrentRenderParameters: function(copyCurrentRenderParameters);
  • setDoAsUserId: function(doAsUserId);
  • setEncrypt: function(encrypt);
  • setEscapeXML: function(escapeXML);
  • setLifecycle: function(lifecycle);
  • setName: function(name);
  • setParameter: function(key, value);
  • setPlid: function(plid);
  • setPortletConfiguration: function(portletConfiguration);
  • setPortletId: function(portletId);
  • setPortletMode: function(portletMode);
  • setResourceId: function(resourceId);
  • setSecure: function(secure);
  • setWindowState: function(windowState);
  • toString: function();
Publicado en desarrollo, General | Etiquetado , | 1 comentario

Crear una comunidad

A continuación esta el codigo que nos permite crear una comunidad a partir de una comunidad existente,

Obtener comunidad template

Group templateGroup = GroupLocalServiceUtil.getGroupByFriendlyUrl("/template");

Crear una comunidad

String name = ParamUtil.getString(actionRequest, "name");
String description = ParamUtil.getString(actionRequest, "description");
String friendlyURL = ParamUtil.getString(actionRequest, "friendlyURL");
Group newGroup = GroupServiceUtil.addGroup(name, description,
GroupImpl.TYPE_COMMUNITY_PRIVATE, StringPool.BLANK, true);

Copiar la configuración del LayoutSet

LayoutSet publicLayoutSet = LayoutSetLocalServiceUtil.getLayoutSet(templateGroup.getGroupId(), false);
LayoutSetServiceUtil.updateLookAndFeel(newGroup.getGroupId(),
false, publicLayoutSet.getThemeId(), publicLayoutSet
.getColorSchemeId(), publicLayoutSet.getCss(),
false);
LayoutSetServiceUtil.updateLookAndFeel(newGroup.getGroupId(),
false, publicLayoutSet.getWapThemeId(), publicLayoutSet
.getWapColorSchemeId(), StringPool.BLANK, true);
 
LayoutSet privateLayoutSet = LayoutSetLocalServiceUtil.getLayoutSet(templateGroup.getGroupId(), false);
LayoutSetServiceUtil.updateLookAndFeel(newGroup.getGroupId(),
false, privateLayoutSet.getThemeId(), privateLayoutSet
.getColorSchemeId(), privateLayoutSet.getCss(),
false);
LayoutSetServiceUtil.updateLookAndFeel(newGroup.getGroupId(),
false, privateLayoutSet.getWapThemeId(), privateLayoutSet
.getWapColorSchemeId(), StringPool.BLANK, true);

Definir que copiar

Map<String, String[]>; parameterMap = new HashMap<String, String[]>();
parameterMap.put(PortletDataHandlerKeys.PERMISSIONS,
new String[] { Boolean.TRUE.toString() });
parameterMap.put(PortletDataHandlerKeys.USER_PERMISSIONS,
new String[] { Boolean.TRUE.toString() });
parameterMap.put(PortletDataHandlerKeys.PORTLET_DATA,
new String[] { Boolean.TRUE.toString() });
parameterMap.put(PortletDataHandlerKeys.PORTLET_SETUP,
new String[] { Boolean.TRUE.toString() });
parameterMap.put(PortletDataHandlerKeys.PORTLET_ARCHIVED_SETUPS,
new String[] { Boolean.TRUE.toString() });
parameterMap.put(PortletDataHandlerKeys.PORTLET_USER_PREFERENCES,
new String[] { Boolean.TRUE.toString() });
parameterMap.put(PortletDataHandlerKeys.THEME,
new String[] { Boolean.TRUE.toString() });

Exportar datos de la comunidad template

byte[] publicOriginalGroup = LayoutServiceUtil.exportLayouts(
templateGroupId, false, parameterMap, null, null);
byte[] privateOriginalGroup = LayoutServiceUtil.exportLayouts(
templateGroupId, true, parameterMap, null, null);

Importar datos a la nueva comunidad

LayoutServiceUtil.importLayouts(newGroup.getGroupId(), false,
parameterMap, publicOriginalGroup);
LayoutServiceUtil.importLayouts(newGroup.getGroupId(), true,
parameterMap, privateOriginalGroup);
Publicado en desarrollo, General | Etiquetado , | Deja un comentario

Portlet de sistema

En varias ocasiones tuve el requerimiento de no mostrar algunos portlets en la lista de portlets disponibles para ser agregados a una página, y este ocultamiento no se podia hacer mediante permisos porque el usuario tenia que usar el portlet y no debia tirar el error de que el portlet no estaba disponibles.  Entonces me di cuenta de que algunos portlets del core de Liferay no estaban disponibles para ser agregados a una página, por ejemplo el portlet de Look and Feel, el My Account o el del Page Setting.  Para esto hay que declarar al portlet como portlet de sistema en liferay-portlet.xml.

liferay-portlet.xml

<portlet>
   <portlet-name>MIPORTLET</portlet-name>
    ...
    <system>;rue</system<
</portlet>

Desde otro portlet vamos a llamar a MIPORTLET

<%
 
PortletURL miPortletURL = new PortletURLImpl(
request, "MIPORTLET", plid, PortletRequest.ACTION_PHASE);
miPortletURL.setWindowState(WindowState.MAXIMIZED);
miPortletURL.setPortletMode(PortletMode.VIEW);
miPortletURL.setParameter("struts_action", "/miportlet/view");
 
%>
 
<a href="<%= miPortletURL %>"<IR A MI PORTLET</a>
Publicado en configuracion, desarrollo, General | Etiquetado , , | Deja un comentario

Mostrar un portlet en un PopUp

Armo la URL

<portlet:renderURL windowState="<%= LiferayWindowState.EXCLUSIVE.toString() %>" var="url">
   <portlet:param name="struts_action" value="/miportlet/popupview" />
</portlet:actionURL>

Llamo al POPUP

<script type="text/javascript">
   function mostrar_popup() {
      var _dialog = Liferay.Popup( 	{
      width: 700,
      modal: true,
      message: '<div class="loading-animation" />',
      position: ['center', 100],
      title: <liferay-ui:message key"popup-title"/>,
      resizable: false,
      draggable: false,
      onClose: function() {
         // se ejecuta cuando el portle se cierra
      }
   });
 
   jQuery.ajax( {
      url: "<%= url %>",
      success: function(message) {
         _dialog.html(message);
      }
   });
}
</script>
 
<a href="javascript:mostrar_popup();">mostrar popup</a>

Al definir el estado de la ventana como exclusivo, el resultado de la respuesta solamente va a ser el contenido del portlet al cual se invoca.

Ejemplo:


Publicado en desarrollo | Etiquetado , , , | 3 comentarios