sábado, 10 de noviembre de 2012

How to ... Como personalizar listas de datos en Alfresco

Hace unas semanas tuvimos que hacer una personalización de una lista de datos para hacerle una demo a un cliente y menos mal que lo teníamos documentado de otras veces que no tuvimos que empezar desde cero. Lo anoto ahora aquí por si le sirve a otras personas.

Para personalizar una lista de datos se tienen que modificar tres archivos:

El  1º de ellos el datalistModel.xml se encuentra en: /opt/alfresco-3.4.d/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/model
El 2º archivo a modificar es share-datalist-form-config.xml que se encuentra en: /opt/alfresco-3.4.d/tomcat/webapps/share/WEB-INF/classes/alfresco
Y por último se tiene que modificar data-list-model_es.properties que se encuentra en: /opt/alfresco-3.4.d/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/messages

Vayamos ahora con que contiene cada uno de estos archivos y como se tienen que modificar. 
En el archivo datalistModel.xml se definen los campos de la lista de datos que queremos usar, es decir, las columnas que va a tener nuestra lista. Aquí se pueden hacer maravillas, solamente pongo algunos ejemplos de como hacer un desplegable, como seleccionarlo en un checkBox y como escoger un documento de toda la documentLibrary de este sitio.

<type name="dl:enlaces">
   <title>Enlaces</title>
   <parent>dl:dataListItem</parent>
   <properties>
    <property name="dl:enlacesNombre">
          <title>Nombre</title>
          <type>d:text</type>
       <mandatory>true</mandatory>
     </property>
     <property name="dl:enlacesFechaInicio">
<title>Fecha Inicio</title>
<type>d:date</type>
<mandatory>false</mandatory>
     </property>
    <property name="dl:enlacesFechaFin">
<title>Fecha Fin</title>
<type>d:date</type>
<mandatory>false</mandatory>
     </property>
    <property name="dl:enlacesEnlaceFuente" >
<title>Enlace a fuente</title>
<type>d:text</type>
<mandatory>false</mandatory>
     <property name="dl:enlaceSectores">
        <title>Sector</title>
        <type>d:text</type>
        <default>Periódico</default>
        <constraints>
            <constraint ref="dl:enlacesSector" />
         </constraints>
      </property>
<property name="dl:enlacesPublicado" >
       <title>Publicado</title>
<type>d:boolean</type>
<mandatory>false</mandatory>
      </property>
  </properties>  
 <associations>
<association name="dl:enlacesPublicacion">
         <title>Publicado en revista</title>
          <source>
             <mandatory>false</mandatory>
             <many>true</many>
           </source>
           <target>
               <class>cm:cmobject</class>
               <mandatory>false</mandatory>
               <many>true</many>
           </target>
       </association>
    </associations>
 </type>

Lo que tenemos con cada uno de las property es una columna dentro de la lista de datos, es decir, con:

<property name="dl:enlacesNombre">
    <title>Nombre</title> 
    <type>d:text</type> 
    <mandatory>true</mandatory>
</property>

Estamos añadiento una columna llamada enlacesNombre con tittle Nombre, de tipo text y estamos diciendo que es obligatorio introducirla cuando añadamos un registro. Algunas cosas a tener en cuenta es que si queremos, por ejemplo, tener un checkbox tenemos que declararnos nuestra propiedad del tipo d:boolean. Otro detalle, si queremos usar un desplegable, tenemos que usar  una constraint como podemos ver en la propertiy enlacesSectores:

<constraints>
      <constraint ref="dl:enlacesSector" />
</constraints>

Pero previamente tenemos que definirnos nuestra lista con:

<constraint name="dl:enlacesSector" type="LIST">
     <parameter name="allowedValues">
       <list>
          <value>Periódico</value>
          <value>Revista</value>
<value>Monografía</value>
<value>Boletín</value>
<value>Otro valor</value>
        </list>
     </parameter>
</constraint>

Otro detalle que nos puede interesar a la hora de hacer una lista, es que uno de nuestras columnas sea, por ejemplo, un documento del documentlibrary. Esto se puede conseguir mediante una association como os muestro un poco más abajo. Mediante la propiedad cm:object haremos que lo que se muestre sea el campo de selección de un documento, si usamos cm:person, lo que veremos será el campo de selección de las personas que tenemos dadas de alta en Alfresco. 

<associations>
<association name="dl:enlacesPublicacion">
       <title>Publicado en revista</title>
           <source>
              <mandatory>false</mandatory>
              <many>true</many>
           </source>
           <target>
              <class>cm:cmobject</class>
              <mandatory>false</mandatory>
              <many>true</many>
          </target>
     </association>
</associations>

Y con esto ya tenemos configurada nuestra lista de datos, ahora nos quedan dos cosas, como vamos a representar los campos, de eso se encarga share-datalist-form-config.xml y el properties con la descripción de cada uno de ellos. Sigamos pues con la explicación del archivo share-datalist-form-config.xml. El contenido sería algo como mostramos a continuación:

<!-- dl:contact type create form config-->
<config evaluator="model-type" condition="dl:enlaces">
   <forms>
      <!-- Create item form -->
      <form>
         <field-visibility>
            <!-- dl:contact type -->
<show id="dl:enlacesNombre" />
<show id="dl:enlacesFechaInicio" />
<show id="dl:enlacesFechaFin" />
<show id="dl:linkSectores" />
<show id="dl:enlacesEnlaceFuente" />
<show id="dl:enlaceSectores" />
<show id="dl:enlacesPublicacion" />
<show id="dl:enlacesPublicado" />
          </field-visibility>
          <create-form template="../data-lists/forms/dataitem.ftl" />
          <appearance>
          <field id="dl:enlacesPublicacion">
             <control>
                <control-param name="startLocation">{doclib}</control-param>
             </control>
          </field>
          <field id="dl:contactNotes">
               <control template="/org/alfresco/components/form/controls/textarea.ftl" />
          </field>
          <field id="dl:enlacesPublicado">
              <control template="/org/alfresco/components/form/controls/checkbox.ftl" />
          </field>
          </appearance>
         </form>
      </forms>
   </config>
   
   <config evaluator="node-type" condition="dl:enlaces">
      <forms>
      <!-- Data List pop-up edit form -->
         <form>
            <field-visibility>
               <!-- dl:contact type -->
<show id="dl:enlacesNombre" />
<show id="dl:enlacesFechaInicio" />
  <show id="dl:enlacesFechaFin" />
<show id="dl:linkSectores" />
<show id="dl:enlacesEnlaceFuente" />
<show id="dl:enlaceSectores" />
<show id="dl:enlacesPublicacion" />
  <show id="dl:enlacesPublicado" />
</field-visibility>
        <create-form template="../data-lists/forms/dataitem.ftl" />
          <appearance>
    <field id="dl:enlacesPublicacion">
         <control>
             <control-param name="startLocation">{doclib}</control-param>
          </control>
          </field>
          <field id="dl:contactNotes">
              <control template="/org/alfresco/components/form/controls/textarea.ftl" />
          </field>
        <field id="dl:enlacesPublicado">
            <control template="/org/alfresco/components/form/controls/checkbox.ftl" />
        </field>
       </appearance>
    </form>
  </forms>
</config>

Vamos con la explicación de cada uno de los campos. Vemos que se repite nuestra descripción y que tenemos dos descripciones, una es <config evaluator="node-type" condition="dl:enlaces"> y la otra <config evaluator="model-type" condition="dl:enlaces">. Esto es porque Alfresco permite mostrar un formulario distinto en la creación de un elemento de la lista de datos y otro formulario distinto en la edición de un elemento. Con node-type configuramos el formulario en la edición de un elemento y con model-type el formulario en la creación de cada elemento.
Luego indicamos los campos que queremos que se muestren con la propiedad <field-visibility> y por últmo configuramos como queremos que se muestren cada uno de ellos. Para el campo Pulicación usamos:

<field id="dl:enlacesPublicacion">
      <control>
         <control-param name="startLocation">{doclib}</control-param>
      </control>
</field>

Lo que estamos haciendo es configurar el campo de selección de documentos para que empiece en el documentLibrary del sitio en donde establecemos la lista de datos y no en la raiz de Alfresco. Si usamos

<field id="dl:contactNotes">
       <control template="/org/alfresco/components/form/controls/textarea.ftl" />
 </field>

estamos cambiando un el campo de introducción de texto normal por un campo de introducción de texto un poco más amplio. Y si quieremos usar el checkbox, tenemos que usar la propiedad:

<field id="dl:enlacesPublicado">
   <control template="/org/alfresco/components/form/controls/checkbox.ftl" />
</field>

Para profundizar un poco más sobre que componentes podemos usar, recomiendo mirar la documentación de Alfresco en http://wiki.alfresco.com/wiki/3.4_Forms#Configuring_Controls
Y ya por último solamente nos queda ponerle unas etiquetas descriptivas para que los usuarios sepan los que están haciendo de forma intuitiva. Simplemente añadimos en el archivo data-list-model_es.properties lo siguiente:

#Enlaces
dl_datalistmodel.property.dl_enlaces.title=Enlaces
dl_datalistmodel.property.dl_enlaces.description=Lista para gestionar los enlaces 
dl_datalistmodel.property.dl_enlacesNombre.title=Nombre
dl_datalistmodel.property.dl_enlaces.description=Lista para gestionar los enlaces 
dl_datalistmodel.property.dl_enlacesFechaInicio.title=Fecha de Inicio
dl_datalistmodel.property.dl_enlacesFechaFin.title=Fecha de Fin
dl_datalistmodel.property.dl_linkSectores.title=Enlace
dl_datalistmodel.property.dl_enlacesEnlaceFuente.title=Fuente
dl_datalistmodel.property.dl_enlaceSectores.title=Sector
dl_datalistmodel.property.dl_enlacesPublicado.title=Publicar en web

Ya podemos irnos a cualquiera de nuestros Sitios y a listas de datos, cuando vayamos a añadir una veremos algo así:

Donde podemos ver nuestra lista de datos que nos hemos creado. Y cuando vayamos a añadirnos un registro, veremos un formulario como este:


Y funcionando, ya tenemos nuestra lista de datos puesta en marcha y funcionando.
Y como es de bien nacido ser agradecido, estaré siempre agradecido a Jose Ramón Belando, a Javi Martínez Rojo y a toda la peña del foro de Alfresco que tantas veces me han ayudado. 

1 comentario :

  1. Buenas, excelente blog. Amigo una consulta, he probado este código en la versión más reciente de Alfresco la 4-2.f y me esta presentado error al intentar de crear una lista personalizada. También he probado otros métodos y me vuelve a presentar el mismo problema. Es posible que para esta nueva versión se tenga que configurar adicional mente otros archivos? Saludos

    ResponderEliminar