lunes, 29 de agosto de 2011

Alfresco - Combinando WebScripts con Acciones (parte 3)

Y por ultimo, os dejo unas capturas de los pasos realizados...

1. Creamos un contenido de tipo Documento



2. Le asociamos uno o varios documentos






3. Una vez tenemos los documentos asociados, nos sale la opción para poder verlos



4. Hacemos click y nos muestra una nueva pantalla con la lista de asociados


Y esto ha sido todo por esta vez... espero que os resulte útil!

Alfresco - Combinando WebScripts con Acciones (parte 2)

Ya tenemos creado el webscript, el siguiente paso será crear la acción que lo ejecutará. Además, vamos a necesitar una pantalla de diálogo donde se mostrarán los documentos asociados.

Para empezar modificaremos el fichero web-client-config-custom.xml:

Primero mostramos las asociaciones en las propiedades del documento.

  
         
          
            
         
       
    
        
                 
        
       

    
          
              
         
    

Definimos la acción:

  
    

            
            es.pruebas.evaluator.DocumentosAsociadosEvaluator
           /images/icons/search.gif          
            #{VerDocsAsociadosDialog.setupAction}
            dialog:verDocsAsociadosDialog          
            
                
/sample/docsAsociados
                
Mostrar documentos asociados
                
#{actionContext.nodeRef}
            
        
    
            
       
        
           
        
         
           
         



las funciones de las distintas etiquetas son:

<evaluator> define una clase Evaluator que controla cuando mostrar la acción
<image> icono que se mostrará para la acción
<action-listener>, <action> definimos que es lo que se ejecutará
<params> parámetros que necesitamos en nuestra acción (en nuestro caso la clase diálogo)

Definimos el diálogo:

 
        
           
           
       
    
  


Y por último, registramos el diálogo en alfresco\WEB-INF\faces-config-custom.xml

      
         
            VerDocsAsociadosDialog
            es.pruebas.dialogs.VerDocsAsociadosDialog
           session
        
    


Las dos clases que hemos utilizado son:

VerDocsAsociadosDialog.java

  public class VerDocsAsociadosDialog extends BaseDialogBean {

    /**
     *
     */
    private static final long serialVersionUID = -653745991045332155L;
    private String url;
    private String title;
    private String webscriptUrl;

    private static Log log = LogFactory.getLog(VerDocsAsociadosDialog.class);

    @Override
    protected String finishImpl(FacesContext arg0, String arg1) throws Throwable {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void setupAction(ActionEvent event) {
        UIActionLink link = (UIActionLink) event.getComponent();
        Map params = link.getParameterMap();
     
        NodeRef nodo = new NodeRef(params.get("nodeRef"));      
        String url2 = params.get("webscript-url");     
        String title2 = params.get("title");
     
        if (!"".equals(url2)) {
            this.url = url2 + "?q="+ nodo.toString();
            this.title = title2;       
        }
    }

    @Override
    public String getContainerTitle(){
        return this.title;
    }

    @Override
    public String getCancelButtonLabel(){
        return "Cerrar";
    }
  
    @Override
    public String cancel() {      
        
        return getDefaultCancelOutcome();
    }

    public String getWebscriptUrl() {     
      
        return "/wcservice" + url;
    }

}
 DocumentosAsociadosEvaluator.java

   public class DocumentosAsociadosEvaluator implements ActionEvaluator{
       
        private static Log log = LogFactory.getLog(DocumentosAsociadosEvaluator.class);
        public static final QName ASOCIACION_DOC = QName.createQName("custom.model", "docsAsociados");

        public boolean evaluate(Node node) {

            NodeRef ref = new NodeRef(Repository.getStoreRef(), node.getId());
            FacesContext context = FacesContext.getCurrentInstance();
                   NodeService nodeSvc = Repository.getServiceRegistry(context).getNodeService();

            boolean result = false;      

           List asocs = (List)node.getAssociations().get(ASOCIACION_DOC);


            if(asocs != null && asocs.size() > 0) {
                        return true;
             }

            return result;

        }

        public boolean evaluate(Object arg0) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    } 


y la jsp que mostrará los resultados verDocsAsociados.jsp

  <%@ taglib uri="/WEB-INF/repo.tld" prefix="r" >
    

    

Alfresco - Combinando WebScripts con Acciones (parte 1)

Hola de nuevo!
Tenia un poco olvidado el blog y he decidido retomarlo con este tutorial. La idea es combinar diferentes aspectos de Alfresco, como son las acciones, dialogos, webscripts, evaluadores...
Vamos a empezar creando un webscript muy sencillo, su función será mostrarnos los documentos que tiene asociados un documento en concreto. Para ello, primero debemos definir nuestro customModel.xml:
      
         
	Custom Model       
	      
	1.0 
	             
		 
		 
		
	    
	    
		
	           
		    
			     
				Documento      
				cm:content         
				  
					     
					Documentos Asociados          
					        
						false       
						true      
											
					               
						cm:content    
						false       
						true          
					         
					         
				   
			      
		  	

Un webscript se puede componer de varios ficheros:
  • Documento descriptivo
  • Script de control (opcional)
  • Una o varias plantillas
  • Documento de configuración (opcional)
  • Fichero de propiedades (opcional)

En nuestro caso, crearemos tres ficheros en la ruta:
/Company Home/Data Dictionary/Web Scripts/org/alfresco/sample

1. docsAsociados.get.desc.xml (documento descriptivo):
  

     Documentos Asociados  
     /sample/docsAsociados?q={searchTerm}   
	 extension  
	 user  
	 required  
 
2. docsAsociados.get.html.ftl (plantilla de salida)

<html>
  <body>     
    <br>
    <table>
	<tr><td colspan="2"><b><u>Documentos Asociados</u></b></td></tr>
		<tr></tr>
		<tr></tr>
		<tr style='background-color: #C6D8EB'>
			<td></td>
			<td align="center"><b>Nombre<b></td>				
		</tr>
     <tr>
		<#list resultset as node>		
			<td align="center"><img src="${url.context}${node.icon16}"/></td>
			<td align="center"><a href="/alfresco${node.url}" target="_blank">${node.name}</a></td>		
			<td></td>		
			<#if node.assocs["custom:docsAsociados"]?exists>
				<#list node.assocs["custom:docsAsociados"] as doc>				  				
					<td><a href="/alfresco${doc.url}" target="_blank">Documento</a></td>
					<td></td>
					<td align="center">${doc.name}</td>
					<td></td>							
				</#list>
			</#if>     
			<tr><td colspan="6">--------------------------------------------------------------------------------------</td></tr>
		</#list>
	</tr>
    </table>
  </body>
</html>

3. docsAsociados.get.js (script de control)
 
 if (args.q == undefined || args.q.length == 0){ 
	status.code = 400;  
	status.message = "Search term has not been provided.";  	
	status.redirect = true;
}	else{
    var node = search.findNode(args.q);  
	var asociaciones = node.assocs["custom:docsAsociados"]; 
	model.resultset = asociaciones;
}
Para información más completa y detallada acerca de los webscripts, aquí encontrareis todo lo necesario.