sábado, 14 de diciembre de 2013

PERSONALIZAR RESULTADOS DE BÚSQUEDA DE ALFRESCO SHARE


(versión alfresco-community-4.2.e)

Para poder personalizar la forma en la que se muestra los resultados de búsqueda hay que modificar los siguientes ficheros:

Search.lib.js
search.get.json.ftl

Situados en:

C:\Alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\templates\webscripts\org\alfresco\slingshot\search\

Y el fichero Search-min.js, en la carpeta:

C:\Alfresco\tomcat\webapps\share\components\search


En el fichero searchi-lib.js tenemos que buscar la función getDocumentItem


function getDocumentItem(siteId, containerId, pathParts, node, populate)
{
   // PENDING: how to handle comments? the document should
   //          be returned instead
   
   // check whether this is a valid folder or a file
   var item = t = null;
   if (node.qnamePath.indexOf(COMMENT_QNAMEPATH) == -1 &&
       !(node.qnamePath.match(DISCUSSION_QNAMEPATH+"$") == DISCUSSION_QNAMEPATH))
   {
      if (node.isContainer || node.isDocument)
      {
         if (!populate) return {};
         item =
         {
            site: getSiteData(siteId),
            container: containerId,
            nodeRef: node.nodeRef.toString(),
            tags: ((t = node.tags) !== null) ? t : [],
            name: node.name,
            displayName: node.name,
            title: node.properties["cm:title"],
            description:  node.properties["cm:description"] + node.properties["ej:authorisedBy"] + "siempre aprendiendo algo nuevo",
            modifiedOn: node.properties["cm:modified"],
            modifiedByUser: node.properties["cm:modifier"],
            createdOn: node.properties["cm:created"],
            createdByUser: node.properties["cm:creator"],
            mimetype: node.mimetype,
            path: pathParts.join("/"),
            
         };
         item.modifiedBy = getPersonDisplayName(item.modifiedByUser);
         item.createdBy = getPersonDisplayName(item.createdByUser);
      }
      if (node.isContainer)
      {
         item.type = "folder";
         item.size = -1;
      }
      else if (node.isDocument)
      {
         item.type = "document";
         item.size = node.size;
      }
   }
   
   return item;
}



En esta función, se cargan todos los datos de los objetos que se han encontrado para devolverlo en una lista de ítems y crear posteriormente el mensaje JSON. Yo por ejemplo, he añadido al campo descripción una propiedad ["ej:authorisedBy"] de un tipo que yo mismo me he definido y un poco de texto al estilo “Hola mundo”.

description:  node.properties["cm:description"] + node.properties["ej:authorisedBy"] + "Siempre aprendiendo algo nuevo",


Esta información se pasa al fichero search.get.json.ftl donde se codifica el mensaje JSON

<#escape x as jsonUtils.encodeJSONString(x)>
{
 "totalRecords": ${data.paging.totalRecords?c},
 "totalRecordsUpper": ${data.paging.totalRecordsUpper?c},
 "startIndex": ${data.paging.startIndex?c},
 "items":
 [
  <#list data.items as item>
  {
   "nodeRef": "${item.nodeRef}",
   "type": "${item.type}",
   "name": "${item.name!''}",
   "displayName": "${item.displayName!''}",
   <#if item.title??>
   "title": "${item.title}",
   
   "description": "${item.description!''}",
   "modifiedOn": "${xmldate(item.modifiedOn)}",
   "modifiedByUser": "${item.modifiedByUser}",
   "modifiedBy": "${item.modifiedBy}",
   "size": ${item.size?c},
   "mimetype": "${item.mimetype!''}",
   <#if item.site??>
   "site":
   {
    "shortName": "${item.site.shortName}",
    "title": "${item.site.title}"
   },
   "container": "${item.container}",
   
   <#if item.path??>
   "path": "${item.path}",
      
   "tags": [<#list item.tags as tag>"${tag}"<#if tag_has_next>,]
  }<#if item_has_next>,
  
 ]
}


Como solo he añadido más información dentro de la propiedad descripción de cada item, no me hace falta modificar el archivo search.get.json.ftl, pero si queréis añadir más propiedades a los items tendréis que modificarlo.

Finalmente, en el script search-min.js, está la función que se va encargar de recoger la lista de ítems y plasmar toda su información en el HTML. Esta función es renderCellDescription.

renderCellDescription = function v(L, O, H, C) {
c.addClass(L.parentNode, "description");
var A = O.getData("site");
var B = y._getBrowseUrlForRecord(O);
var K = O.getData("displayName");
var G = '

' + p(K) + ""; var J = O.getData("title"); if (J && J !== K) { G += '(' + p(J) + ")" } G += "

"; var F = O.getData("description"); if (F) { G += '
' + p(F) + "
" } …

El fichero search-min.js es una versión “comprimida” de search.js y un poco ininteligible por lo que puede ser buena idea leer el fichero search.js antes de ponerse a hacer algún cambio. Al final, el fichero que se ejecuta es search-min.js.

Nota:Para ver los cambios, hay que reiniciar Alfresco

0 comentarios:

Publicar un comentario