(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}", #if> "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> <#if item.path??> "path": "${item.path}", #if> "tags": [<#list item.tags as tag>"${tag}"<#if tag_has_next>,#if>#list>] }<#if item_has_next>,#if> #list> ] } #escape>
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 += ' " } …
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