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 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...