Mostrando entradas con la etiqueta gestor documental alfresco. Mostrar todas las entradas
Mostrando entradas con la etiqueta gestor documental alfresco. Mostrar todas las entradas

25 de junio de 2018

:: Alfresco. Crear página de login

La prueba de concepto que vamos a realizar consistirá en crear una página de login personalizada, para nuestro gestor documental Alfresco. En nuestro caso, para la versión: 5.2.


Los pasos a seguir son los descritos a continuación:

1.- En el fichero "share-config-custom.xml" ubicado en: "tomcat\shared\classes\alfresco\web-extension" añadimos las siguientes líneas


<alfresco-config>
    <config evaluator="string-compare" condition="WebFramework">
    <web-framework>
    <defaults>
    <page-type>
       <id>login</id>
       <page-instance-id>netic360-login</page-instance-id>
    </page-type>
    </defaults>
    </web-framework>
    </config>
 </alfresco-config>


2.- En la siguiente ubicación: "tomcat\shared\classes\alfresco\web-extension\site-data\pages" crearemos un fichero al que podemos llamar: "netic360-login.xml" con el siguiente contenido:


<page>
   <template-instance>netic360-login</template-instance>
   <authentication>none</authentication>
</page>


El nivel de autenticación de la página que hemos creado debe ser: "None" para que podamos acceder, ya que de lo contrario, se le solicitaría al usuario un login previo.

3.- En la siguiente ubicación: "tomcat\shared\classes\alfresco\web-extension\site-data\template-instances" crearemos un fichero al que denominaremos: "netic360-login.xml" con el siguiente contenido:


<template-instance>
   <template-type>netic360/netic360-login</template-type>
</template-instance>


4.- En la siguiente ubicación: "tomcat\shared\classes\alfresco\web-extension\templates\netic360" crearemos un fichero al que denominaremos: "netic360-login.ftl" con el siguiente contenido:


<html>
   <head>
      <title>NeTIC360 Login</title>
   </head>
   <body>
      <h2>NeTIC360 Login</h2>  
      <form id="loginform" accept-charset="UTF-8" method="post" action="${url.context}/page/dologin">
         Username: <input type="text" id="username" name="username"/><br>
         Password: <input type="password" id="password" name="password"/><br>
         <input type="submit" id="btn-login" />
      </form>
   </body>
</html>


Reiniciaremos el servicio de Alfresco y accederemos al gestor documental para comprobar el nuevo login.

20 de junio de 2018

:: Alfresco. Modificar el ancho de la columna "Mis ficheros"

Como prueba de concepto, necesitamos modificar el ancho de la columna de la izquierda donde aparece el menú, en el apartado: "Mis ficheros"


Para llevar a cabo este cambio (Alfresco 5.2), buscaremos el siguiente fichero:

"\tomcat\webapps\share\WEB-INF\classes\alfresco\templates\org\alfresco\myfiles.ftl"


<script type="text/javascript">//<![CDATA[</p>
<p>
new Alfresco.widget.Resizer("Repository").setOptions({</p>
<p>
initialWidth: 225  <= Valor a modificar</p>
<p>
});</p>
<p>
//]]></script>



De todas formas se podría sobrescribir este comportamiento con una nueva plantilla ".ftl" siguiendo las buenas prácticas (carpeta "\tomcat\shared").

10 de octubre de 2017

:: Alfresco. Número de elementos por página

El Alfresco 5.2, por defecto el número de elementos por página a la hora de listar documentos es 50.
Supongamos que en nuestro caso necesitásemos que el nº de elementos por página fuera 10. Para ello, seguiremos los siguientes pasos:

1.- Copiar el fichero: "documentlist-v2.get.js" to "{Alfresco}\tomcat\shared\classes\alfresco\web-extension\site-webscripts\org\alfresco\components\documentlibrary"

2.- En este fichero tenemos que añadir la siguiente línea:
model.widgets[1].options.pageSize = 10;

3.- Esta línea tendremos que añadirla al final del código de la función "widgets":

function widgets()
{
   var useTitle = "true";
   var docLibConfig = config.scoped["DocumentLibrary"];
   if (docLibConfig != null)
   {
      var tmp = docLibConfig["use-title"];
      useTitle = tmp != null ? tmp : "true";
   }

   var docListToolbar = {
      id: "DocListToolbar",
      name: "Alfresco.DocListToolbar",
      assignTo: "docListToolbar",
      options: {
         siteId: (page.url.templateArgs.site != null) ? page.url.templateArgs.site : "",
         rootNode: toolbar.rootNode != null ? toolbar.rootNode : "",
         repositoryRoot: toolbar.rootNode,
         hideNavBar: Boolean(toolbar.preferences.hideNavBar),
         repositoryBrowsing: toolbar.rootNode != null,
         useTitle: (useTitle == "true"),
         syncMode: toolbar.syncMode != null ? toolbar.syncMode : "",
         createContentByTemplateEnabled: model.createContentByTemplateEnabled,
         createContentActions: model.createContent
      }
   };
 
   var documentList = {
      id : "DocumentList",
      name : "Alfresco.DocumentList",
      options : {
         syncMode : model.syncMode != null ? model.syncMode : "",      
         siteId : (page.url.templateArgs.site != null) ? page.url.templateArgs.site : "",
         containerId : template.properties.container != null ? template.properties.container : "documentLibrary",
         rootNode : model.rootNode != null ? model.rootNode : "null",
         repositoryRoot : model.rootNode,
         usePagination : (args.pagination == "true"),
         sortAscending : (model.preferences.sortAscending != null ? model.preferences.sortAscending : true),
         sortField : model.preferences.sortField != null ? model.preferences.sortField : "cm:name",
         showFolders : (model.preferences.showFolders != null ? model.preferences.showFolders : true),
         hideNavBar: (model.preferences.hideNavBar != null ? model.preferences.hideNavBar : false),
         simpleView : model.preferences.simpleView != null ? model.preferences.simpleView : "null",
         viewRenderers: model.viewRenderers,
         viewRendererName : model.preferences.viewRendererName != null ? model.preferences.viewRendererName : "detailed",
         viewRendererNames : model.viewRendererNames != null ? model.viewRendererNames : ["simple", "detailed", "gallery", "filmstrip"],
         highlightFile : page.url.args["file"] != null ? page.url.args["file"] : "",
         replicationUrlMapping : model.replicationUrlMapping != null ? model.replicationUrlMapping : "{}",
         repositoryBrowsing : model.rootNode != null,
         useTitle : (model.useTitle != null ? model.useTitle == "true" : true),
         userIsSiteManager : model.userIsSiteManager,
         associatedToolbar: { _alfValue: "docListToolbar", _alfType: "REFERENCE" },
         commonComponentStyle : model.commonComponentStyle,
         suppressComponent : model.suppressComponent,
         filmstripImageLazyLoading: model.filmstripImageLazyLoading == "true"
      }
   };
   if (model.repositoryUrl != null)
   {
      documentList.options.repositoryUrl = model.repositoryUrl;
   }

   model.widgets = [docListToolbar, documentList];
   model.widgets[1].options.pageSize = 10;
}

4.- En este caso, como se puede ver, hemos establecido el valor a 10 elementos por página

5.- Reiniciaremos el servicio de Alfresco y tras esto la nueva configuración estará disponible, mostrando 10 elementos por página



17 de abril de 2017

:: Alfresco. Importar usuarios desde un CSV

A la hora de crear varios usuarios en Alfresco, podemos hacerlo por medio de un fichero CSV, el cual debe seguir un formato específico.

Esta tarea es útil -por ejemplo- cuando tenemos que crear una relación extensa de usuarios, estableciendo cuotas de disco, o simplemente creando credenciales de acceso al gestor documental.

  • La información que puede contener es la siguiente:
  • User Name,First Name,Last Name,E-mail Address,,Password,Company,Job Title,Location,Telephone,Mobile, Skype,IM,Google User Name,Address,Address Line 2,Address Line 3,Post Code,Telephone,Fax,Email
  • Debe estar en UTF-8, ya que de lo contrario tendremos problemas con caracteres extraños
  • El separador debe ser el caracter "," (coma)

Si se ha especificado una dirección de correo electrónico para cada cuenta de usuario a crear, estos recibirán un mail con los datos de acceso (siempre y cuando las notificaciones se encuentren habilitadas).

Un ejemplo de fichero CSV para crear varios usuarios en Alfresco podría ser el siguiente:
import_usr01,Usuario 1, Apellidos 1,usr1@netic360.es,,import_usr01,netic360,Desarrollador web,Madrid,123456789
import_usr02,Usuario 2, Apellidos 2,usr2@netic360.es,,import_usr02,netic360,Desarrollador Liferay,Madrid,123456789
import_usr03,Usuario 3 , Apelllidos 3,usr3@netic360.es,,import_usr03,netic360,Desarrollador Liferay,Madrid,123456789
import_usr04,Usuario 4, Apellidos 4,usr4@netic360.es,,import_usr04,netic360,Desarrollador .NET,Madrid,123456789

Dentro de  nuestro Alfresco seleccionaremos "Administración" > "Usuarios"


Tras la pulsación del botón "Subir fichero CSV de usuarios", este fichero se subirá a nuestro Alfresco y será procesado, obteniendo los resultados de la operación.






11 de abril de 2017

:: CMIS. Conexión con Alfresco

Describiremos a continuación una prueba de concepto de conexión desde una aplicación desarrollada en C# con Alfresco, a través de CMIS.



¿Qué es CMIS?


De acuerdo a la definición que aparece en la Wikipedia, Content Management Interoperability Services (CMIS) o Servicios de Interoperabilidad de Gestión de Contenidos es un estándar abierto que permite a diferentes sistemas de gestión de contenidos interoperar a través de Internet. En concreto, CMIS define una capa de abstracción para el control de diversos sistemas de gestión de documentos y repositorios, que utilicen protocolos web.

¿Cómo nos conectamos con Alfresco a través de CMIS?

Para llevar a cabo la conexión, tendremos un Alfresco (por ejemplo instalado en local en el puerto 8282) y necesitaremos una función a la que le pasaremos 3 parámetros:

  • Ruta: Indica la ruta CMIS (http://localhost:8282/alfresco/api/-default-/public/cmis/versions/1.0/atom)
  • Usuario: usuario definido en Alfresco
  • Clave: clave de acceso a Alfresco


Estos dos últimos parámetros constituyen las credenciales de acceso a nuestro Alfresco.



Tras pulsar sobre el botón de login, se llamará a la siguiente función, que realizará la conexión a Alfresco a través de CMIS

/* * Conexión con Alfresco */
private static ISession ConexionAlfresco(String ruta, String usuario, String clave)
{
if (System.Diagnostics.Debugger.IsAttached)
  Console.WriteLine("Estableciendo conexión con Alfresco...");
try {
 Dictionary parameters = new Dictionary(); 
 parameters[DotCMIS.SessionParameter.BindingType] = BindingType.AtomPub; //Parámetros de  conexión 
 parameters[DotCMIS.SessionParameter.AtomPubUrl] = ruta;  parameters[DotCMIS.SessionParameter.User] = usuario;  parameters[DotCMIS.SessionParameter.Password] = clave; 
 SessionFactory factory = SessionFactory.NewInstance(); 
 IList repos = factory.GetRepositories(parameters); 
 ISession session = repos.ElementAt(0).CreateSession(); 
  return session; 
 } catch (Exception ex) { 
 Console.WriteLine("ERROR :: No se ha podido establecer la conexión con Alfresco"); 
 return null; 
 } 
}


Puesto que hemos llevado a cabo la conexión con Alfresco utilizando el estándar CMIS desde una aplicación C#, utilizaremos "DotCMIS".


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.

:: Liferay. Obtener los usuarios activos desde Groovy

Una solución rápida para obtener la relación de usuarios activos en Liferay 7.4 es por medio de un script en Groovy. Para ello accederemos a...