Extendiendo la búsqueda avanzada de Alfresco Share

Enviado por admin el Jue, 25/04/2019 - 08:21

La aplicación Share de Alfresco nos permite la recuperación de archivos mediante una interfaz de búsqueda avanzada que en ocasiones puede resultar insuficiente. Por ejemplo, no nos permite buscar archivos por “Categorías” o “Etiquetas” o limitar la búsqueda en un determinado directorio, tarea que si podemos realizar con la herramienta “Explorer”.
A continuación explicamos las modificaciones necesarias en nuestro Alfresco que nos permitirán esta funcionalidad en Share.

Por un lado, para incluir los filtros de “Categorías” y “Etiquetas” no hay que programar nada, ya que son características de los archivos que ya vienen implementadas en Alfresco Share y lo único que tenemos que hacer es mostrarlas en la Búsqueda. Para ello modificamos el archivo
C:\Alfresco\tomcat\webapps\share\WEB-INF\classes\alfresco\share-form-config.xml y añadimos el siguiente código:

En la línea 322 deberá quedar

<!-- Search form -->

          <form id="search">

                <field-visibility>

                     <show id="cm:name" />

                      <show id="cm:title" force="true" />

                      <show id="cm:description" force="true" />

     <show id="cm:categories" force="true" />

     <show id="cm:taggable" force="true" />

                     <show id="mimetype" />

                     <show id="cm:modified" />

                     <show id="cm:modifier" />

                </field-visibility>

                <appearance>

<field id="cm:categories">

<control> <control-param name="compactMode">true</control-param>

</control>

</field>

<field id="cm:taggable">

      <control>

          <control-param name="compactMode">true</control-param>

           <control-param name="params">aspect=cm:taggable</control-param>

           <control-param name="createNewItemUri">/api/tag/workspace/SpacesStore</control-param>

           <control-param name="createNewItemIcon">tag</control-param> </control> </field>

Ahora bien, para incluir la búsqueda limitada en un directorio es muy distinto, al no tratarse de una característica propia de los archivos de Alfresco.
Lo primero que hacemos es modificar el formulario de búsqueda avanzada para incluir los campos necesarios. En C:\Alfresco\tomcat\webapps\share\WEB-INF\classes\alfresco\site-webscripts\org\alfresco\components\search\advsearch.get.html.ftl añadimos:

<#-- carpeta entry box -->

     <div class="carpeta-box">

           <div>${msg("Buscar en carpeta")}:</div>

           <input type="text" class="terms" name="${el}-search-text" id="${el}carpeta" value="${(page.url.args["st"]!"")?html}" maxlength="1024" />

  <#-- subcarpetas check box -->

      <div>

      <INPUT TYPE=CHECKBOX name="${el}-subcarpetas" id="${el}subcarpetas"> Incluir subcarpetas<P>

     </div>

  <#-- folder button -->

           <div class="yui-u align-right">

                <span id="${el}-folder-button-1" class="yui-button yui-push-button search-icon">

                     <span class="first-child">

                          <button type="button">${msg('Seleccionar carpeta')}</button>

                     </span>

                </span>

           </div>

      </div>

Y modificamos la hoja de estilos para conservar la misma apariencia, en C:\Alfresco\tomcat\webapps\share\components\search\search.css añadimos:

.search .carpeta-box {

     background-color: #F5FFF2;

     margin-left: 1.5em;

     border: 1px solid #C2C2C2;

     padding: 1em; width: 800px;

}

.search .carpeta-box .terms {

     width: 60em;

}

Para elegir el directorio en el que vamos a realizar la búsqueda vamos a usar un “Picker” o “Selector” que ya está implementado en el Share y que realiza la misma funcionalidad que estamos buscando. Para poder utilizarlo y modificarlo a nuestro antojo lo que hacemos es copiarnos los archivos que implementan el “Selector” en los directorios de búsqueda avanzada.
Copiamos los archivos global-folder.js, global-folder-min.js y global-folder.css de C:\Alfresco\tomcat\webapps\share\modules\documentlibrary a
C:\Alfresco\tomcat\webapps\share\components\search

Y todos los global-folder.get* de C:\Alfresco\tomcat\webapps\share\WEB-INF\classes\alfresco\site-webscripts\org\alfresco\modules\documentlibrary a
C:\Alfresco\tomcat\webapps\share\WEB-INF\classes\alfresco\site-webscripts\org\alfresco\components\search

Por último para poder usar el “Selector” añadimos en C:\Alfresco\tomcat\webapps\share\WEB-INF\classes\alfresco\site-webscripts\org\alfresco\components\search\advsearch.get.head.ftl el siguiente código

<@script type="text/javascript" src="${page.url.context}/res/components/search/global-folder.js"></@script> <@link rel="stylesheet" type="text/css" href="${page.url.context}/res/components/search/global-folder.css" />

Ahora nos queda implementar la funcionalidad que buscamos en los correspondientes “Javascripts”. Comenzamos por el script C:\Alfresco\tomcat\webapps\share\components\search\advsearch.js
En la línea 38 hacemos la declaración

/**

* Alfresco Slingshot aliases

*/

var $html = Alfresco.util.encodeHTML,

$hasEventInterest = Alfresco.util.hasEventInterest;

Registramos el nuevo botón que hemos añadido, en la línea 135 ha de aparecer

// search YUI button and menus this.widgets.searchButton1 = Alfresco.util.createYUIButton(this, "search-button-1", this.onSearchClick); this.widgets.searchButton2 = Alfresco.util.createYUIButton(this, "search-button-2", this.onSearchClick); this.widgets.folderButton1 = Alfresco.util.createYUIButton(this, "folder-button-1", this.onFolderClick);


Debemos modificar la función onSearchClick para la inclusión de los nuevos parámetros en la consulta de búsqueda, para ello la función quedará así

/** * Event handler that gets fired when user clicks the Search button.

*

* @method onSearchClick

* @param e {object} DomEvent

* @param obj {object} Object passed back from addListener method

*/

onSearchClick: function ADVSearch_onSearchClick(e, obj)

{

// retrieve form data structure directly from the runtime

var formData = this.currentForm.runtime.getFormData();

// add DD type to form data structure

formData.datatype = this.currentForm.type;

var valor="inicial";

//cogemos el nombre de la carpeta

valor = Dom.get(this.id + "carpeta").value;

//miramos el checkbox de las subcarpetas

var check=Dom.get(this.id + "subcarpetas").checked;

if(check==true){ valor+="/"; }

// build and execute url for search page

var cadena=YAHOO.lang.JSON.stringify(formData);

//le quitamos la } del final

var cadena2=cadena.substring(0,cadena.length-1);

//le metemos el campo carpeta y la }

cadena2=cadena2+",\"carpeta_\":\""+valor+"\"}";

var url = YAHOO.lang.substitute(Alfresco.constants.URL_PAGECONTEXT + "{site}search?t={terms}&q={query}",

{

site: (this.options.siteId.length !== 0 ? ("site/" + this.options.siteId + "/") : ""),

terms: encodeURIComponent(Dom.get(this.id + "-search-text").value),

query: encodeURIComponent(cadena2)

}); window.location.href = url;

},

Creamos la función que se debe ejecutar cuando se produzca el evento del botón “Seleccionar carpeta” , tenemos que añadir

/**

* Event handler that gets fired when user clicks the Folder button.

*

* @method onFolderClick

* @param e {object} DomEvent

* @param obj {object} Object passed back from addListener method

*/

onFolderClick: function ADVSearch_onFolderClick(e, obj)

{

if (!this.widgets.destinationDialog)

{

this.widgets.destinationDialog = new Alfresco.module.DoclibGlobalFolder(this.id + "-destinationDialog");

this.widgets.destinationDialog.setOptions(

{

title: this.msg("Seleccione una carpeta")

});

} var pathNodeRef ;

this.widgets.destinationDialog.setOptions(

{ pathNodeRef: pathNodeRef ? new Alfresco.util.NodeRef(pathNodeRef) : null

});

this.widgets.destinationDialog.showDialog();

},

Y por último recoger el directorio seleccionado por el usuario

 

/**

* Folder selected in destination dialog *

* @method onDestinationSelected

* @param layer

* {object} Event fired

* @param args

* {array} Event parameters (depends on event type)

*/

onDestinationSelected: function ACJC_onDestinationSelected(layer, args)

{

// Check the event is directed towards this instance

if ($hasEventInterest(this.widgets.destinationDialog, args))

{

var selectedFolder = args[1].selectedFolder;

if (selectedFolder !== null)

{

var path=selectedFolder.path;

if(path.charAt(0)=='/'){

path=path.substring(1,path.lenght);

}

Dom.get(this.id + "carpeta").value=path;

}

}

},

Una vez hemos terminado de editar el script advseacrh.js tenemos que comprimirlo usando algún compressor de Javascript y de esta forma obtener el advseacrh-min.js que es el que realmente se ejecuta en el cliente.
Por ultimo sólo nos queda modificar la consulta que se envía a “Lucene” para incorporarle los nuevos parámetros. Para ello modificamos el script C:\Alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\templates\webscripts\org\alfresco\slingshot\search\search.lib.js de la siguiente forma:

En la línea 718 añadimos

else if (p.indexOf("carpeta_") === 0){ nombre_carpeta = propValue; }

 

En la línea 759 realizamos el procesamiento de los nuevos parámetros

 

if(nombre_carpeta!=""){

 /*************tratamiento del path*********************/

//comprobamos si quremos buscar en subcarpetas

var sub=0;

if(nombre_carpeta.charAt(nombre_carpeta.length-1)=="/"){

sub=1;

nombre_carpeta=nombre_carpeta.substring(0,nombre_carpeta.length-1);

}

var array=nombre_carpeta.split("/");

var ncarpetas=array.length;

var path2="";

if(ncarpetas==1){

if(nombre_carpeta=="Sitios"||nombre_carpeta=="sitios")

path2="app:company_home//st:sites";

else if(nombre_carpeta=="Espacios personales de usuario")

path2="app:company_home//app:user_homes";

else if(nombre_carpeta=="Diccionario de datos")

path2="app:company_home//app:dictionary";

else if(nombre_carpeta=="Espacio de invitado")

path2="app:company_home//app:guest_home";

else {

//quitamos los espacios y los sustituimos por _x0020_

var tam=nombre_carpeta.length;

for(i=0;i<tam;i++){

if(nombre_carpeta.charAt(i)==" "){

var aux=nombre_carpeta.substring(0,i);

aux+="_x0020_";

aux+=nombre_carpeta.substring(i+1,tam);

nombre_carpeta=aux;

tam=nombre_carpeta.length;

}

}

//document.write(nombre_carpeta);

path2="app:company_home//cm:"+nombre_carpeta;

}

path=path2;

}

else{

var aux="";

for(i=0;i<ncarpetas;i=i+1){

if(array[i]=="Sitios" || array[i]=="sitios"){

aux+="/st:sites";

}

else if(array[i]=="Espacios personales de usuario"){

aux+="/app:user_homes";

}

else if(array[i]=="Diccionario de datos"){

aux+="/app:dictionary";

}

else if(array[i]=="Espacio de invitado"){

aux+="/app:guest_home";

}

else{

//quitamos los espacios y los sustituimos por _x0020_

var tam=array[i].length;

for(j=0;j<tam;j++){

if(array[i].charAt(j)==" "){

var aux2=array[i].substring(0,j);

aux2+="_x0020_";

aux2+=array[i].substring(j+1,tam);

array[i]=aux2;

tam=array[i].length;

}

}

aux+="/cm:"+array[i];

}

}

path="app:company_home"+aux;

}

if(sub==1){ path+="/";

}

}

Si guardamos todos los cambios, reiniciamos el servicio y borramos las caches de nuestro navegador la Búsqueda avanzada nos habrá quedado con este aspecto:.

 

Categoría