6 de junio de 2016

:: Noty. Librería javascript para mostrar notificaciones

Noty es un plugin jQuery que permite mostrar de manera sencilla mensajes de alerta, operaciones realizadas correctamente, error, avisos, información, confirmación,... con la posibilidad de añadir estas notificaciones a una cola.

Además, estas notificaciones pueden visualizarse en distintas partes de la página, dispone de distintos layouts,..., y la forma de integrarla en nuestros desarrollos es muy sencilla y viene perfectamente explicada en la página de la librería.

Más información: http://ned.im/noty

1 de junio de 2016

:: El PageRank "público" de Google ya no existe

Como todos recordamos, hace años y -aunque este era un tema controvertido respecto al SEO- intentábamos lograr un PageRank aceptable.

En marzo de  2016 Google anunció que descontinuaba el PageRank público y a  partir de ahora todas las páginas mostrarán un valor 0, así que para todos aquellos que no conocían la noticia, que no se asusten al ver que el PageRank de sus páginas ahora muestran el valor mínimo.



Si por ejemplo consultamos el PageRank de la propia página de Google, el valor devuelto es cero.
Aunque esta decisión pueda parecernos algo chocante, Google ha descontinuado el PageRank público, pero internamente seguirá utilizando la autoridad de nuestra página basándose en este valor, la diferencia es que este no será accesible por los usuarios.

Por este motivo, a partir de ahora tendremos que hacer uso de otras métricas: DMoz, Majestic, ... para conocer la autoridad de nuestras páginas en términos de posicionamiento web.


30 de mayo de 2016

:: Blisk. Un navegador específico para desarrolladores



Debido a la variedad de tamaños y resoluciones de pantalla manejados en la actualidad, los desarrolladores deben asegurarse de la correcta visualización en distintos dispositivos. 
De esta manera, Blisk es una herramienta muy útil, especialmente orientada a los desarrolladores web.
Este navegador cuenta con una serie de herramientas para la emulación de dispositivos móviles (teléfonos, tabletas,...) lo que será de gran ayuda a la hora de validar sus desarrollos, aunque permite su uso en distintas fases del proyecto:
  • Prototipado
  • Desarrollo
  • Pruebas
  • Detección de errores

Más información y descargas: https://blisk.io/

25 de mayo de 2016

:: Alfresco. Búsqueda simple de tipos de datos personalizados

Alfresco en la versión 5 implementa como mejora el denominado "live search" de forma que desde el buscador de Alfresco nos muestra un listado de los resultados que cumplen con los criterios especificados, por este motivo, en el caso de utilizar tipos de datos personalizados tendremos que modificar varios ficheros.

En las búsquedas simples, los valores utilizados por defecto por ambos procesos son:

Live search
cm:name, cm:title, cm:description,  TEXT, and TAG
Simple search
cm:name, cm:title, cm:description,ia:whatEvent, ia:descriptionEvent, lnk:title, lnk:description, TEXT, and TAG

Para configurar estas búsquedas tenemos que añadir una serie de línea a los ficheros siguientes:
live-search-docs.get.config.xml
search.get.config.xml

En la versión 5 de Alfresco, estos no aparecen directamente en el sistema de ficheros, por lo que podemos extraerlos del .JAR ubicado en:
tomcat/webapps/alfresco/WEB-INF/lib/alfresco-remote-api-5.0.2.1.jar (el número de versión puede variar según la que tengamos instalada)

Una vez extraídos los ficheros (por ejemplo con winrar), veremos que la ruta de los mismos es: alfresco/templates/webscripts/org/alfresco/slingshot/search/

Si tenemos dos tipos de datos personalizados, por ejemplo "facturas" y "contratos", y queremos realizar búsquedas sobre uno de los campos:
fact:nfactura
con:ncontrato

Llevaremos a cabo las siguientes modificaciones en los ficheros indicados anteriormente:
live-search-docs.get.config.xml
<search>
<default-operator>AND</default-operator>
<default-query-template>%(cm:name cm:title cm:description fact:nfactura con:ncontrato TEXT TAG)</default-query-template>
</search>

search.get.config.xml

<search> <default-operator>AND</default-operator> <default-query-template>%(cm:name cm:title cm:description fact:nfactura con:ncontrato ia:whatEvent ia:descriptionEvent lnk:title lnk:description TEXT TAG)</default-query-template> </search>

Estos ficheros deberemos ubicarlos en la siguiente ruta de nuestro Alfresco:
shared/classes/alfresco/extension/templates/webscripts/org/alfresco/slingshot/search


Tras reiniciar el servicio de Alfresco ya nos funcionarán las búsquedas "Simple search" y "Live search".

:: Alfresco. Paquetes de idiomas

Es habitual que en nuestros proyectos sobre el gestor documental Alfresco nos soliciten que este se muestre en un determinado idioma. Normalmente en función del que esté configurado en el equipo de cliente, a nivel de sistema operativo o navegador, debería detectarlo, pero previamente debemos instalar el idioma requerido en el servidor.

Por ejemplo, si nuestro caso es que Alfresco debería aparecer en catalán, los pasos a seguir serían los siguientes:

.- Acceder a la siguiente url para descargar los paquetes de idiomas disponibles:
http://alf-trans.ossportal.org/

.- En nuestro caso, descargaremos los ficheros "alfresco-ca.jar" y "share-ca.jar"

.- Copiaremos los ficheros en la carpeta "${alfresco}/tomcat/shared/lib", siendo ${alfresco} la ruta donde lo tengamos instalado

.- Reiniciaremos el servicio de Alfresco para que los cambios sean efectivos

Podemos comprobar el correcto funcionamiento si configuramos nuestro navegador (en el caso de que no lo tengamos) al idioma catalán.


22 de mayo de 2016

:: Alfresco. Creación de tipos de datos personalizados

Es habitual tener que crear tipos personalizados o extender el modelo de datos de Alfresco.

Para llevar a cabo la definición de estos tipos de datos, los pasos a seguir son los siguientes:

.- Definición de un tipo datos al que llamaremos "factura". Crearemos el fichero "facturaModel.xml" en la siguiente ubicación: "${alfresco}/tomcat/shared/classes/alfresco/extension/" o bien podemos crear una carpeta más "myModel" dentro de la que ubicaremos este fichero.
<?xml version="1.0" encoding="UTF-8"?>
<model name="fact:FacturaModel"
       xmlns="http://www.alfresco.org/model/dictionary/1.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <description>Facturas Compra Model</description>
    <author>neTIC360</author>
    <version>1.0</version>

    <imports>
        <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
        <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>
    </imports>

    <!-- Definicion del namespace del modelo -->
    <namespaces>
        <namespace uri="fact.model" prefix="fact"/>
    </namespaces>

    <types>
    <!-- Definicion del nuevo tipo documental -->
        <type name="fact:factura">
            <title>Factura</title>
            <parent>cm:content</parent>

<!-- Definicion de las propiedades -->
            <properties>
                <property name="fact:nfactura">
                    <title>Nº factura</title>
                    <type>d:text</type>
                    <mandatory>true</mandatory>
<index enabled="true">
<atomic>true</atomic>
<stored>true</stored>
<tokenised>true</tokenised>
</index>
                </property>
                <property name="fact:anio">
                    <title>Año</title>
                    <type>d:int</type>
                    <mandatory>true</mandatory>
                </property>
<property name="fact:fecha">
                    <title>Fecha</title>
                    <type>d:datetime</type>
                    <mandatory>false</mandatory>
                </property>
<property name="fact:nif">
                    <title>NIF</title>
                    <type>d:text</type>
                    <mandatory>false</mandatory>
                </property>
<property name="fact:nproveedor">
                    <title>Proveedor</title>
                    <type>d:text</type>
                    <mandatory>false</mandatory>
                </property>
<property name="fact:concepto">
                    <title>Concepto</title>
                    <type>d:mltext</type>
                    <mandatory>false</mandatory>
                </property>
            </properties>
        </type>
    </types>
</model>

De forma similar crearemos otro tipo de datos "Contrato" para lo que crearemos un fichero: "contratoModel.xml" con una estructura similar a la anterior

.- Definimos el contexto para el modelo que acabamos de crear. Para ello creamos el fichero: "model-context.xml" o lo editamos en el caso de que ya exista, ubicado en: "${alfresco}tomcat/shared/classes/alfresco/extension/" o podemos crear uno nuevo nombrándolo como "${alfresco}tomcat/shared/classes/alfresco/extension/netic360-model-context.xml"
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
    <bean id="netic360-extension.dictionaryBootstrap" parent="dictionaryModelBootstrap" depends-on="dictionaryBootstrap">
        <property name="models">
        <!-- Referencia a los modelos que hayamos creado-->
            <list>    
<value>alfresco/extension/contratoModel.xml</value>
<value>alfresco/extension/facturaModel.xml</value>
            </list>
        </property>
    </bean>
</beans>


.- En el fichero "share-config-custom.xml" ubicado en "${alfresco}tomcat/shared/classes/alfresco/web-extension/" buscamos el siguiente código y añadimos la línea correspondiente a  nuestro tipo de datos:
< !--
         Used by the "Change Type" action

         Define valid subtypes using the following example:
           
               
           

         Remember to also add the relevant i18n string(s):
            cm_mysubtype=My SubType
      -- >
      < types >
         < type name="cm:content " >
< subtype name="fact:factura" />
         < /type >

         < type name="cm:folder" >
         < /type >

         < type name="trx:transferTarget" >
            < subtype name="trx:fileTransferTarget" />
         < /type >
      < /types >

.- Para comprobar que el tipo de datos es correcto, reiniciamos el servicio de Alfresco y comprobamos si la acción "Cambiar tipo" funciona correctamente con nuestro tipo de datos definido

.- Si el cambio de tipo es correcto accedemos a las propiedades del documento de este nuevo tipo y podremos ver que tiene los campos correspondientes a los metadatos que hemos definido en nuestro modelo

.- La siguiente prueba sería definir una carpeta y una regla sobre esta, de forma que todo documento que entre en esta, sea especializado a nuestro tipo de datos definido

.- Para poder crear un contenido del nuevo tipo definido, buscaremos en el siguiente fichero: "share-config-custom.xml" el siguiente literal: " < config evaluator="string-compare" condition="DocumentLibrary" replace="true" >"

Tras el código que indicamos en puntos anteriores, insertamos el código siguiente:
< create-content >
< content id="fact_factura" mimetype="text/plain" label="Facturas" itemid="fact:factura" icon="" / >
< content id="con_contrato" mimetype="text/plain" label="Contrato" itemid="con:contrato" icon="" / >
< /create-content >

IMPORTANTE: Para que nos aparezcan no sólo los nuevos tipos de datos a crear , sino también los existentes, en la anterior línea debemos cambiar el valor del atributo "replace" y ponerlo a false. De esta manera, la linea quedaría como sigue:
< config evaluator="string-compare" condition="DocumentLibrary" replace="false" >"

.- Nos faltarían los literales de traducción correspondientes a nuestro modelo, para lo que crearemos un fichero denominado: "netic360lingshot.properties"ubicado en: "${alfresco}tomcat/shared/classes/alfresco/web-extension/messages/"
De la misma manera buscamos el fichero "slingshot.properties" ubicado en: "${alfresco}\tomcat\webapps\share\WEB-INF\classes\alfresco\messages" y lo copiamos en la misma ruta que el anterior.

.- Para que estos literales sean encontrados por Alfresco Share debemos localizar el fichero "custom-slingshot-application-context.xml.sample" ubicado en: "${alfresco}tomcat/shared/classes/alfresco/web-extension/" y lo renombraremos como "custom-slingshot-application-context.xml".
< bean id="netic360slingshot.resources" class="org.alfresco.i18n.ResourceBundleBootstrapComponent" >
        < property name="resourceBundles" >
            < list >
< value>alfresco.web.extension.messages.slingshot< /value >
< value >alfresco.web-extension.messages.netic360slingshot< /value >
            < /list >
        < /property >
    < /bean >


De esta manera tendríamos definido un nuevo tipo de datos, pero serán necesarias otras configuraciones para la interfaz de Alfresco Share.

18 de mayo de 2016

:: Liferay. Modificar los términos de uso

Cuando un usuario accede por primera vez con sus credenciales al CMS Liferay, en uno de los pasos debe aceptar los términos o condiciones de uso (si esta opción no se ha deshabilitado).

Este texto tipo aparece en inglés y, en ocasiones puede ser necesaria una adaptación o personalización de las condiciones de uso que deben mostrarse al usuario. Para ello, deberemos seguir los pasos siguientes:

.- Crearemos un nuevo contenido (puede ser global) con la descripción de los términos de uso que debe aceptar el usuario


.- Configuramos las siguientes líneas en el fichero: portal-ext.properties
terms.of.use.journal.article.group.id=xxxx
terms.of.use.journal.article.id=yyyy

Donde "xxxx" es el identificador del grupo e "yyyy" es el identificador del propio contenido que acabamos de crear.

.- Reiniciaremos el servicio de Liferay y a partir de este momento se mostrarán los nuevos términos de uso a todos los usuarios que accedan al portal

NOTA: Son necesarias las dos líneas y que ambas tengan el valor correcto

:: Liferay DXP 2026. Habilitar RSS

En la versión Liferay DXP 2026 para habilitar las fuentes de datos RSS debemos seguir los pasos siguientes: 1.- Accederemos a la Configuraci...