Cómo pasar parámetros a Upload Form en Sharepoint

Para subir documentos a las librerías de documentos de Sharepoint disponemos de la página Upload.aspx, esta página consiste en una Application page que se ocupa de cargar el documento en la librería indicada por parámetro para a continuación redireccionar a la página de edición (EditForm) de la librearía.

En ocasiones nos encontramos con librerías de documentos enlazadas a una lista mediante un campo Lookup, en la página DispForm querremos entonces mostrar los detalles de la lista y los documentos cuyo campo Lookup tenga el mismo valor que el elemento de la lista visualizando. Hasta ahí fácil, solo tenemos que conectar las listas. El problema viene cuando queremos que desde esa página Dispform se puedan subir documentos, pero que directamente en la página EditForm seleccione automáticamente el campo Lookup en lugar de tenerlo que seleccionar.

image

Para hacerlo modificaremos el menú de la librería de documentos en la página DispForm para que pase por parámetro a la página Upload el identificador del elemento seleccionado.

Para personalizar nuestra barra de herramientas podremos o bien customizar el botón de nuevo o cargar de la librería o personalizar el toolbar de la librearía en la página DispForm. En micaso he preferido personalizar el Toolbar de la página.

 

Desde el designer indicamos en las propiedades de la vista de datos la opción «Barra de harremiantas de Sharepoint», para a continuación editar por código nuestra toolbar.

image

A continuación eliminamos lo botones estándar que nos añade y añadimos el nuestro que redirija directamente a la página Upload

<SharePoint:FormToolBar ID=»FormToolBar1″ runat=»server» ControlMode=»Display» >
    <Template>
         <a href=»/_layouts/Upload.aspx?List={$ListID}&amp;IdElemento={string($IdElemento)}»>Subir</a>
    </Template>
</SharePoint:FormToolBar>

Fijaros en varias cosas:

Por un lado he indicado en la url la página «/_layouts/Upload.aspx» en lugar de «NombreDeLibrearíaDocumentos/Upload.aspx», esto es porque la página de nuestra librearía lo que hace es reenviar directamente a la página layput con los parámetros que necesite, pero si le pasamos un parámetro a la página upload de la librearía reenviará los parámetros directamente sin tener en cuenta los valores. Es decir que enviaría una cosa parecida a la siguiente imagen, por lo que tendríamos que leer el parámetros con el carácter «?» delante.

clip_image001[4]

 

Por otro lado, he utilizado he definido un parámetro IdElemento con el valor de la variable $IdElemento. Esta variable la he definido mediante un parámetro en la definición de la conexión entre los webparts.

clip_image001[6]

Esta opción la disponemos al crear la conexión desde la opción «Crear nuevo parámetro».

image 

 

Al seleccionar nuesta acción del ToolBar nos reenviará a la página Upload con nuestro id seleccionado. Además cuando subamos nuestro documento, la propia página Upload nos redireccionará a la página EditForm con los valores de nuestro parámetros de forma automática.

image

 

Ahora solo nos queda leer el parámetro en la página EditForm y completar el campo lookup. Para hacerlo he utilizado javascript editando la página EditForm:

 

<script type=»text/javascript»>

    // This javascript sets the default value of a lookup field identified

    // by <<FIELD DISPLAY NAME>> to the value stored in the querysting variable

    // identified by <<QUERYSTRING VARIABLE NAME>>

    // Customize this javascript by replacing <<FIELD DISPLAY NAME>> and

    // <<QUERYSTRING VARIABLE NAME>> with appropriate values.

    // Then just paste it into NewForm.aspx inside PlaceHolderMain

    _spBodyOnLoadFunctionNames.push(«fillDefaultValues»);

    function fillDefaultValues() {

      var qs = location.search.substring(1, location.search.length);

      var args = qs.split(«&»);

      var vals = new Object();

      for (var i=0; i < args.length; i++) {

        var nameVal = args[i].split(«=»);

        var temp = unescape(nameVal[1]).split(‘+’);

        nameVal[1] = temp.join(‘ ‘);

        vals[nameVal[0]] = nameVal[1];

      }

      setLookupFromFieldName(«lista1», vals[«IdElemento»]);

    }

    function setLookupFromFieldName(fieldName, value) {

      if (value == undefined) return;

      var theSelect = getTagFromIdentifierAndTitle(«select»,»Lookup»,fieldName);

    // if theSelect is null, it means that the target list has more than

    // 20 items, and the Lookup is being rendered with an input element

      if (theSelect == null) {
alert(«null»);
        var theInput = getTagFromIdentifierAndTitle(«input»,»»,fieldName);

        ShowDropdown(theInput.id); //this function is provided by SharePoint

        var opt=document.getElementById(theInput.opt);

        setSelectedOption(opt, value);

        OptLoseFocus(opt); //this function is provided by SharePoint

      } else {

        setSelectedOption(theSelect, value);

      }

    }

    function setSelectedOption(select, value) {
    alert(«Paso1»);

      var opts = select.options;

      var l = opts.length;

      if (select == null) return;

      for (var i=0; i < l; i++) {

        if (opts[i].value == value) {

          select.selectedIndex = i;

          return true;

        }

      }

      return false;

    }

    function getTagFromIdentifierAndTitle(tagName, identifier, title) {

      var len = identifier.length;

      var tags = document.getElementsByTagName(tagName);

      for (var i=0; i < tags.length; i++) {

        var tempString = tags[i].id;

        if (tags[i].title == title && (identifier == «» || tempString.indexOf(identifier) == tempString.length – len)) {

          return tags[i];

        }

      }

      return null;

    }

    </script>

 

Mediante el script _spBodyOnLoadFunctionNames.push(«fillDefaultValues»); indico que se ejecute la función  fillDefaultValues al cargarse la página. A continuación se leen los parámetros proporcionados por la querystring, se selecciona el valor del parámetro IdElemento en el control «list1» (que corresponde con mi campo lookup) mediante el script setLookupFromFieldName(«lista1», vals[«IdElemento»]);

 

image

 

Espero que os haya servido. Ale a currar que ya es hora!!

Publicado por

Mario Cortés

Mario Cortés Flores es MVP en Office 365, trabaja en Plain Concepts como Team Lead y escribe habitualmente en geeks.ms/blogs/mcortes y en Twitter @mariocortesf. Podréis encontrarlo colaborando activamente con la comunidad de MadPoint y SUGES

6 comentarios sobre “Cómo pasar parámetros a Upload Form en Sharepoint”

  1. No me ha funcionado el código que colocaste, no sale error ni nada… le estoy enviando los valores que son en la URL, pero aún así no hace nada. Alguna idea con el código de Javascript?

  2. en la url que le llega al formulario EditForm le llega el valor del título o el ID del elemento?, en función del campo que le pases luego tendrás que filtrar por ese campo

  3. Hola, gracias por responder. Pues en la página donde se carga el documento si me alcanza a llegar el ID del elemento, pero incluí el código javascript en «EditForm.aspx» y a esta no alcanza a llegar el ID. Que será???, la URL de la página Upload es:
    http://server/Projects/_layouts/Upload.aspx?List={2C7D562C-9A38-457A-94C3-009046EDCE9D}&ID=1
    La URL de la página EditForm es:
    http://server/Projects/Docs/Forms/EditForm-bck.aspx?Mode=Upload&CheckInComment=&ID=43&RootFolder=%2FProjects%2FDocs&ContentTypeId=0x0101007303E3055F0CAD4C86909ADA1F89C08D
    Por tanto no alcanza a hacer nada. El código lo he revisado varias veces y pienso que se encuentra correcto. Será que en la página «EditForm.aspx» hay necesidad de convertirla a XSL?? o manteniendo el webpart también funciona???.

    No sé si sea claro, mil y mil gracias.

  4. Si funciona, lo que sucedía es que estaba utilizando el parámetro con nombre «ID», el cual era reservado de SP, así que lo cambié por otro nombre y me funcionó. Gran utilidad y realmente sencilla. Gran blog.

  5. Me queda la duda, para q muestre en el campo el nombre y no el valor del ID. Como en tu ejemplo y viendo los screenshot el parámetro «IdElemento» es 1, pero en el campo del EditForm «Lista1» se visualiza «uno». Es algún mapeo?? Gracias de antemano.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *