Hoy explicaré cómo localizar nuestras entidades creadas con el Service Builder de Liferay. Para hacer esto tendremos que modificar el archivo service.xml para la entidad que queramos localizar:
<entity name="Entidad" local-service="true" remote-service="true"
uuid="true">
<!-- PK fields -->
<column name="entidadId" type="long" primary="true" />
...
<column name="nombre" type="String" localized="true" />
</entity> …
Asi cuando agamos la acción build service, en vez de generarnos un campo nombre como un objeto String, serà un objeto Map<Locale,String>.
Ahora, tendremos que tener en cuenta que tenemos que tratar siempre un objeto Map des de la vista, pasando por el controlador hasta la persistencia. Por ejemplo, el campo nombre se guardará como un xml en base de datos, por lo tanto crear un finder en el service.xml por la columna nombre no sería viable, se debería crear una custom sql que parseará el xml por locale.
Des de la vista tendremos la etiqueta liferay-ui:input-localized que nos servirá para añadir campos localizados:
<label class="aui-field-label" for="<portlet:namespace />nombre"><liferay-ui:message key="name" /></label>
<liferay-ui:input-localized *xml="" name="nombre" />
* el campo xml es dónde podemos introducir los valores del input, en formato xml.
Los idiomas disponibles son los especificados en el site (Configurarlo en Site Administration). En la acción podremos recoger el dato de la siguiente manera:
Map<Locale,String> nombre = LocalizationUtil.getLocalizationMap(actionRequest, "nombre");
Y finalmente, nos faltará modificar los servicios para añadir nuevos objetos localizados:
public Entidad addEntidad(Map<Locale,String> nombre, ….) throws SystemException, PortalException { Entidad entidad = null; long entidadId = counterLocalService.increment(Entidad.class.getName()); entidad = entidadPersistence.create(entidadId); entidad.setCreateDate(DateUtil.newDate()); entidad.setUserId(userId); entidad.setUserName(userName); entidad.setNombreMap(nombre); … entidad = entidadPersistence.update(entidad); }
Y ya tendríamos la entidad localizada. Tened en cuenta que para cualquier cosa que hagáis con esta entidad, por ejemplo un search container, ahora tendréis un xml.
¡Espero que os sea útil!