ALFRESCO · Edición de metadatos durante la subida de archivos (de verdad)

Uno de los requisitos más habituales de las organizaciones que adoptan Alfresco es que los usuarios provean un conjunto mínimo de datos durante la creación de un nuevo documento en el sistema para permitir una catalogación adecuada de los contenidos.

Esta funcionalidad no es provista por Alfresco, aunque existe un add on comercial (Edit Meta-Data during upload) que proporciona una aproximación basada en el lanzamiento de un formulario de metadatos después de la subida del documento. El problema, bajo mi punto de vista, es que el usuario puede cerrar o cancelar este formulario posterior sin introducir los datos requeridos. De esta manera el documento habría sido dado de alta en el sistema sin actualizar la información requerida.

Una solución alternativa

  1. Creación de un modelo personalizado (el artículo Trabajando con tipos de contenido personalizados de Jeff Potts es un excelente punto de partida)
  2. Adaptación de las plantillas FTL para subida de documento que vayan a ser utilizadas (dnd-upload.get.html.ftl, flash-upload.get.html.ftl y html-upload.get.html.ftl)
    • Inclusión de controles HTML personalizados para la recogida de datos del usuario en función del modelo personalizado diseñado
  3. Adaptación del JS YUI de interfaz para incluir el tratamiento de los nuevos datos recogidos (dnd-upload.js, flash-upload.js y html-upload.js)
    • Gestión de los controles HTML incluidos en la plantilla FTL
    • Control de visibilidad de la sección que incluye estos controles HTML (en función de si son requeridos para la actualización del documento)
    • Desarrollo de un WebScript para la asignación de los valores introducidos por el usuario a los metadatos del tipo de contenido definido en el modelo (este paso podría realizarse también a través de un Behaviour asociado a la Policy de creación de nodo)

De esta manera, la nueva pantalla de subida de documentos a Alfresco presentaría un aspecto similar al mostrado a continuación.

alfresco-custom-upload-screen

Tratamiento del Drag & Drop

El comportamiento por defecto de Alfresco sube automáticamente cualquier documento que haya sido depositado en la ventana del navegador mediante Drag & Drop, esto es, arrastrándolo desde el escritorio o desde una carpeta local, sin requerir intervención del usuario. Esta mecánica, que resulta útil y rápida en muchos casos, es inadecuada en el entorno que estamos describiendo.

Para modificar el flujo de subida mediante Drag & Drop, es necesario realizar algunas modificaciones en el JS YUI de subida de documentos (dnd-upload.js).

      show: function DNDUpload_show(config)
      {
         // Create an alias for this (it is required for the listener functions declared later)
         var _this = this;

         // Merge the supplied config with default config and check mandatory properties
         this.suppliedConfig = config;
         this.showConfig = YAHOO.lang.merge(this.defaultShowConfig, config);
         if (!this.showConfig.uploadDirectory && !this.showConfig.updateNodeRef && !this.showConfig.destination && !this.showConfig.uploadURL)
         {
             throw new Error("An updateNodeRef, uploadDirectory, destination or uploadURL must be provided");
         }
         
         if (this.showConfig.uploadDirectory !== null && this.showConfig.uploadDirectory.length === 0)
         {
            this.showConfig.uploadDirectory = "/";
         }

         // Apply the config before it is shown
         this._resetGUI();

         // Apply the config before it is shown
         this._applyConfig();
         
         // If files is not defined then assume we need to select them...
         if (this.showConfig.files == null || this.showConfig.files.length == 0)
         {
            // Display the file select section of the dialog
            // Hide the file and progress information...
            Dom.removeClass(this.id + "-file-selection-controls", "hidden");
            Dom.addClass(this.id + "-filelist-table", "hidden");
            Dom.addClass(this.aggregateDataWrapper, "hidden");

            // Create a new file selection input element (to ensure old data is retained we will remove any old instance...
            if (this.fileSelectionInput && this.fileSelectionInput.parentNode)
            {
               this.fileSelectionInput.parentNode.removeChild(this.fileSelectionInput); // Remove the old node...
            }
            
            this.fileSelectionInput = document.createElement("input");
            Dom.setAttribute(this.fileSelectionInput, "type", "file");

            // Only set the multiple attribute on the input element if running in multi-file upload
            // (i.e. we don't want to allow multiple file selection when updating a file)
            if (this.suppliedConfig.mode !== this.MODE_SINGLE_UPDATE)
            {
               Dom.setAttribute(this.fileSelectionInput, "multiple", "");
            }
            Dom.setAttribute(this.fileSelectionInput, "name", "files[]");
            Dom.addClass(this.fileSelectionInput, "dnd-file-selection-button");
            Event.addListener(this.fileSelectionInput, "change", this.onFileSelection, this, true);
            this.widgets.fileSelectionOverlayButton._button.parentNode.appendChild(this.fileSelectionInput);
            
            // ADDED · Restore default message for upload button ("Select files for upload")
            this.widgets.fileSelectionOverlayButton._button.innerHTML = this.msg("button.selectFiles");
            // ADDED · Remove onClick listener from button overlay
            Event.removeListener(this.widgets.fileSelectionOverlayButton._button, "click", this.onUploadButtonClick);

            // Enable the Esc key listener
            this.widgets.escapeListener.enable();
            this.panel.setFirstLastFocusable();
            this.panel.show();
         }
         else
         {
             // MODIFIED · Drag & Drop behaviour
             Dom.addClass(this.id + "-filelist-table", "hidden");
             Dom.addClass(this.aggregateDataWrapper, "hidden");
             Dom.removeClass(this.id + "-file-selection-controls", "hidden");
             
             // Add new message for upload button ("Upload")
             this.widgets.fileSelectionOverlayButton._button.innerHTML = this.msg("button.upload");
             // Add new listener to button overlay
             Event.addListener(this.widgets.fileSelectionOverlayButton._button, "click", this.onUploadButtonClick, this, true);
             // Remove file input control (targeted file has been set by drag & drop)
             if (this.fileSelectionInput && this.fileSelectionInput.parentNode) {
                this.fileSelectionInput.parentNode.removeChild(this.fileSelectionInput); // Remove the old node...
             }

             // Other GUI adjustments
             this.widgets.escapeListener.enable();
             this.panel.setFirstLastFocusable();
             this.panel.focusFirst();
             this.panel.show();
         }
      },

Una vez realizadas estas modificaciones, la pantalla de introducción de datos será presentada al usuario y el botón “Seleccionar ficheros para subir” habrá sido modificado por un “Subir” que enviará el fichero adjuntado por Drag & Drop al navegador sin requerir una nueva selección por parte del usuario.

3 comentarios en “ALFRESCO · Edición de metadatos durante la subida de archivos (de verdad)

    • Si estás usando versión 4.2.x debes incluir tus metadatos en dnd-upload.js, flash-upload.js y html-upload.js. Fíjate en cómo trata YUI el resto de los controles y haz algo equivalente para los tuyos.

  1. Perdona pero me podrías facilitar unos ejemplos sobre dichos ficheros.estoy buscando información sobre el tema y encuentro poco y además soy novato.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s