Recorrer recursivamente un espacio con Freemarker

cancel
Showing results for 
Search instead for 
Did you mean: 
cristinamr
Advanced

Recorrer recursivamente un espacio con Freemarker

Buenas.

Llevo varios días haciendo un desarrollo con Freemarker para una vista personalizada (custom view) y la verdad es que he tenido bastantes problemas a la hora de ver cómo podía recorrer un espacio recursivamente con Freemarker y que te contara el número de documentos que tiene ese espacio y sus hijos, así como el tamaño total de los mismos.
A simple vista es bastante sencillo según explico lo que quiero hacer en el desarrollo, pero todo es ponerse y darse cuenta de que para nada es sencillo, sobre todo si no estás familiarizado con el lenguaje de freemarker, no sabes muy bien como enfocarlo y apenas tener ejemplos en internet sobre esto (lo típico de buscar algo y no encontrarlo por ningun lado, vamos Smiley Tongue).

Estuve mirando en foros, google, y demás y nada así que aquí dejo mi granito de arena por si a alguien le sirve en un futuro (al menos que lo tenga un poco más fácil Smiley Wink ):


<#assign contador  = 0 >
<#assign tamanio  = 0 >
<#list space.childrenByXPath[".//*"]  as child>
   <#if child.isDocument>
      <#assign contador  = contador+1 >
     <#assign tamanio  = tamanio + child.size>
   </#if>
</#list>
<#assign tamanio = (tamanio/1024)/>
<#assign tamanio = (tamanio/1024)/>
<table border="0" celpadding="0" cellspacing="0">
<tr><td>Numero de docs en el espacio: ${contador}</td></tr>
<tr><td>Tamaño de los documentos: ${tamanio}</td></tr>
</table>

La idea es que metas el código en un ftl y lo ejecutes desde el mismo espacio en el que quieras ver el custom view Smiley Wink
Por cierto un apunte: Divido el tamaño dos veces entre 1024 para que te lo escale a megas sino da demasiadas cifras Smiley Frustrated

Un saludooo!! ^^
--
VenziaIT: helping companies since 2005! Our ECM products: AQuA & Seidoc
22 Replies
venzia
Senior Member

Re: Recorrer recursivamente un espacio con Freemarker

Esta muy bien Cristina! .. y lo que dices .. para llegar a esas 12 lineas .. seguro habras necesitado probar otras 1000 de aprendizaje! .. yo también he lidiado con freemarker y se de lo que hablas :twisted:.
Gracias por el aporte! .. ayer nos solicitaba un cliente la posibilidad de esto mismo (asi que .. cambiando de x horas estimadas a 1 minuto! .. te debo una .. y nuestro cliente dos o tres!! jeje).
Saludos,
cristinamr
Advanced

Re: Recorrer recursivamente un espacio con Freemarker

Buff y que lo digas… ¿Y lo bien que vendría un cookbook solo con ejemplos para estos casos? xD Buenos a ver si compartiendo código entre todos nos echamos un cable Smiley Very Happy

Un saludo ^^
--
VenziaIT: helping companies since 2005! Our ECM products: AQuA & Seidoc
baskeyfield
Member II

Re: Recorrer recursivamente un espacio con Freemarker

Gracias por el aporte Cristina,

En la wiki de Alfresco hay algo parecido aunque con unas cuantas lineas más:

http://wiki.alfresco.com/wiki/Example_Recursive_Template


<table>
<#macro recurse_macro node depth>
  <#if node.isContainer>
    <tr>
   <td align='left'>(${depth})
      <#if (depth>0) >
       <#list 1..depth as i>.</#list>
      </#if>
      <img src="/alfresco${node.icon16}"> <a href="/alfresco${node.url}">${node.properties.name}</a>
   </td>
  </tr>

   <#list node.children as child>
   <#if child.isContainer && node.children?size != 0 >
       <@recurse_macro node=child depth=depth+1/>
   </#if>
   </#list>
  </#if>
</#macro>

<b>Recursive Listing of Spaces:</b>
<table border="1" celpadding="1" cellspacing="1">
<tr><th> Name Space </th></tr>
<@recurse_macro node=companyhome depth=0/>
</table>
cristinamr
Advanced

Re: Recorrer recursivamente un espacio con Freemarker

Lo creas o no, no es lo mismo. No sé si has observado que en el código lo que tiene hecho es una macro que se llama a sí misma (es recursiva) por lo que si declaras un contador se estaría "machacando" (inicializandose a 0) a cada vuelta que diera… Créeme, es lo primero que probé  Smiley Wink
--
VenziaIT: helping companies since 2005! Our ECM products: AQuA & Seidoc
cristinamr
Advanced

Re: Recorrer recursivamente un espacio con Freemarker

Hoy me he dado cuenta de que había un pequeño fallo, y es que si quieres que realmente te muestre "megas" hay que dividir dos veces entre 1024, curioso porque he probado a dividir entre 2048 y da diferentes resultados Smiley Frustrated

En fin, que para que de correctamente hay que dividirlo dos veces entre 1024 para que lo escale correctamente (ya lo he corregido arriba).

Un saludo! ^^
--
VenziaIT: helping companies since 2005! Our ECM products: AQuA & Seidoc
manume
Member II

Re: Recorrer recursivamente un espacio con Freemarker

Pues a mi no me funcionó Smiley Sad

An error occurred in one of the dashlets.

    * 08030003 Error during processing of the template 'Expression space is undefined on line 3, column 8 in alfresco/templates/manu-recorrer.html.ftl.'. Please contact your system administrator.
cristinamr
Advanced

Re: Recorrer recursivamente un espacio con Freemarker

Buenas ManuME.

Acabo de copiar el código que puse en el post primero para comprobar a ver si metí algo raro. He ido dentro de un alfresco 2.1 SP 7 a la carpeta Diccionario de datos/Modelos de Contenidos y le he dado a "Crear" y he pinchado en Crear Contenido. He llamado el fichero recorre.ftl, he pinchado en siguiente y a continuación he pegado el código que puse ahí arriba.

Una vez hecho eso, me he ido a una carpeta que tengo en el company home (empresa) y me he ido a "ver detalles". Arriba del todo he pinchado en "Custom view" y he seleccionado recorre.ftl, a continuación he aceptado y he pinchado en la flechita del "Custom view" para desplegarlo, y me ha mostrado lo siguiente:

Numero de docs en el espacio: 50
Tamaño de los documentos: 7,123

O sea, que a mi ese código en una 2.1. SP 7 me funciona.

Si te parece y para echarte una mano más facilmente, pega aquí el código que tengas tú, y dime sobre qué alfresco lo has echado a andar, así podré ejecutarlo y ver donde puede estar el problema Smiley Wink

Un saludo!!
--
VenziaIT: helping companies since 2005! Our ECM products: AQuA & Seidoc
berenicestr69
Member II

Re: Recorrer recursivamente un espacio con Freemarker

Hola Cristina, Yo he intentado recorrer un espacio con WebScript, y volcar el resultado en un freemaker.

Lo que tengo que realizar es recorrer una carpeta y sus subcarpetas recursivamente, y obtener los documentos de dichas carpetas.

En el js, solo consigo recorrer la carpeta de un nivel, pero el resto no me funciona, no sé como crear una subcarpeta en webscritp,  te muestro el código para ver si me podrías comentar como tirar:

Alguien me puede ayudar???





He intentado hacer esto, me recorre la carpeta que le paso como ruta y me añade los docs, pero si hay carpetas hijas no me las recorre, añado el código a ver si encuentran el error:

var carpeta = args.carpeta;

var resultados = new Array();

var espacio = roothome.childByNamePath(carpeta);

var i=0;
for(var j=0; j<espacio.children.length; j++){
var hijo = espacio.children[j];

if(hijo.isDocument){
resultados[i]=hijo;
i++;
}
// A partir de aquí no me entra  , no sé como acceder a un asubcarpeta en webscript
if(hijo.isContainer){
var espacio2 = roothome.childByNamePath(carpeta+"/"+hijo.name);
for(var x=0; x<espacio2.children.length; x++){
var hijo2=espacio2.childen[x];


if(hijo2.isDocument){
resultados[i]=hijo2;
i++;
}
}
}
}

model.resultados=resultados;

Muchas gracias
cristinamr
Advanced

Re: Recorrer recursivamente un espacio con Freemarker

Buenas berenicestr69.

No comprendo qué quieres hacer exactamente Smiley Frustrated Y mira que lo he leído varias veces… Independientemente del código ese: ¿Qué quieres conseguir hacer?

Explícame un poco y te oriento Smiley Wink



He vuelto a leerte, edito mi mensaje:

… Lo que tengo que realizar es recorrer una carpeta y sus subcarpetas recursivamente, y obtener los documentos de dichas carpetas.

En el js, solo consigo recorrer la carpeta de un nivel, pero el resto no me funciona, no sé como crear una subcarpeta en webscritp,  te muestro el código para ver si me podrías comentar como tirar:

Uhmmm, mira hagamos una cosa: Por aquí tengo un js muy sencillito que lo lanzas en una carpeta y recorre los hijos, y te muestra en un txt (muestraRuta.txt) un listado con la ruta de los archivos.

Mira:
function muestraRutas(node)
{   
   for each(n in node.children)
   {
         if ( n.isDocument )
               salida+="Ruta de los archivos: "+n.displayPath+"/"+n.name+"\n\r";
         
         for ( var i = 0; i < n.children.length; i++ ) {
            if ( n.children[i].isContainer == true )
               muestraRutas( n.children[i] );
         }
   }
}

// Objetos modificables

var nodo_raiz = "" ;
var salida = "";

var logFile = script.parent.childByNamePath( "muestraRutas.txt" );
// Precondiciones
if ( logFile == null )
logFile = script.parent.createFile( "muestraRutas.txt" );


if ( nodo_raiz == "" )
{
var space = companyhome;
}
else{
var space = companyhome.childByNamePath( nodo_raiz );
}

if (space != null) {
   muestraRutas( space );
}
else{
   salida += "Error al localizar el espacio raiz: " + nodo_raiz + "\n\r";
   if (logger.isLoggingEnabled())
   {                  
      logger.log("Error al localizar el espacio raiz: " + nodo_raiz );
   }      
}

logFile.content = salida;
logFile.save();
logFile.content;



Copialo, y lanzalo como cualquier JS y ya verás los resultados. Te recomiendo que empieces por ahí. Una vez te funcione, solo es cuestión de ir modificando =)

Prueba y me comentas los resultados. Smiley Wink
--
VenziaIT: helping companies since 2005! Our ECM products: AQuA & Seidoc