2012-08-16 24 views
5

Tengo una biblioteca de documentos en sharepoint que almacena un documento de Word.Crear enlace de edición para documentar en sharepoint

Si hago clic en el enlace del documento, aparece un cuadro de diálogo con "desea abrir este archivo en modo readonly o edit, etc." y puede abrirlo en modo edición, cambiarlo, guardarlo directamente en word y los cambios se guardan en la biblioteca de documentos.

El enlace al archivo en la biblioteca de documentos tiene el siguiente aspecto:

<a onfocus="OnLink(this)" 
    href="/test/DocLib2/wordtest.docx" 
    onmousedown="return VerifyHref(this,event,'1','SharePoint.OpenDocuments','')"  
    onclick="return DispEx(this,event,'TRUE','FALSE','FALSE', 
      'SharePoint.OpenDocuments.3','1', 'SharePoint.OpenDocuments', 
      '','','','1','0','0','0x7fffffffffffffff','','')" 
>wordtest</a> 

¿Cómo se crea este enlace en mi propia pieza de la tela en la que tengo el nombre de la biblioteca y archivo de documentos? Sin solo copiar el código anterior, no sería una buena idea ...

¿Hay algún método "oficial" para lograr esto?

+0

¿Quién votó en contra de esto? ¿Por qué? – Marc

Respuesta

10

Desafortunadamente, no parece que haya una mejor opción. Pero al menos se puede averiguar cuál es la definición de la función. La función DispEx se define en el archivo core.js (pero es más fácil de leer en core.debug.js). Ambos están en el directorio 14 \ Templates \ Layouts \ 1033.

Aquí es la definición de función:

function DispEx(ele, objEvent, fTransformServiceOn, fShouldTransformExtension, 
    fTransformHandleUrl, strHtmlTrProgId, iDefaultItemOpen, strProgId, strHtmlType, 
    strServerFileRedirect, strCheckoutUser, strCurrentUser, strRequireCheckout, 
    strCheckedoutTolocal, strPermmask) 

Aquí está mi suposición sobre lo que significan. Siéntase libre de añadir comentarios a corregir cualquier error u omisión:

  • ele - [obj] el elemento
  • objEvent - objeto [obj] caso
  • fTransformServiceOn - [bool] (funcionalidad desconocida) valores por defecto True
  • fShouldTransformExtension - [BOOL] (funcionalidad desconocida) por defecto es falso
  • fTransformHandleUrl - por defecto [BOOL] (funcionalidad desconocida) a
  • strHtmlTrProgId Falso
  • - nombre [cadena] del ActiveX Control para tratar de cargar los valores predeterminados a SharePoint.OpenDocuments.3
  • iDefaultItemOpen - [int] indicador de defecto para editar o Leer los valores predeterminados a 1
  • strProgId - [string] nombre del control ActiveX
  • strHtmlType [string] (funcionalidad desconocida) valores predeterminados para vaciar
  • strServerFileRedirect - [cadena] (funcionalidad desconocida)
  • strCheckoutUser [cadena] el ID del usuario que ha desprotegido el documento
  • strCurrentUser - [cadena] el ID del usuario actual
  • strRequireCheckout - [cadena] Indic Ator si se debe forzar una salida más
  • strCheckedoutTolocal - indicador [cadena] de si se debe utilizar la carpeta de borradores locales
  • strPermmask - [cadena] Máscara de permisos para los valores predeterminados de usuario actuales a 0x7fffffffffffffff

está claro que hay algunos incoherencias en términos de usar cadenas y enteros para representar valores booleanos. También es extraño que el código tenga 17 parámetros, pero solo puedo encontrar una definición de función con 15 parámetros, por lo que no estoy seguro de para qué sirven esas dos últimas cadenas vacías. Algo de eso es la naturaleza de JavaScript, pero también parece descuidado por parte de Microsoft.

Esto realmente no responde la pregunta, con suerte lo ayudará a usted u otra persona.

+0

+1 y muchas gracias, establecí su respuesta como aceptada ya que es mejor que la mía. Mientras nadie responda * real *; – Marc

+0

gracias por la explicación de los argumentos de la función –

0

No recuerdo si hay una capacidad oficial para hacerlo con JavaScript COM, pero puede usar el control ASP.NET HyperLink para generar el enlace similar. Por ejemplo poner en la disposición

<asp:HyperLink ID="EditHl" runat="server" Text="Edit document"/> 

y en el código subyacente algo así como

EditHl.Attributes["attribute name"] = "attribute value"; 

sólo tiene que utilizar los mismos valores de enlace OOTB, pero el cambio

/test/DocLib2/WordTest. docx

a la URL de su documento.

+0

Gracias por su respuesta, pero sé cómo usar un control HyperLink y agregar algunos atributos. Pero de eso no se trataba la pregunta porque ** no quiero ** copiar el horrible 'return DispEx (this, event, 'TRUE', 'FALSE', 'FALSE', 'SharePoint.OpenDocuments.3', '1', 'SharePoint.OpenDocuments', '', '', '1', '0', '0', '0x7fffffffffffffff', '', '') 'código ya que no tengo idea de qué parámetro hace qué y sería mejor si algún método SP lo genera. – Marc

1

termino con la adición de este código

return DispEx(this,event,'TRUE','FALSE','FALSE', 
'SharePoint.OpenDocuments.3','1', 'SharePoint.OpenDocuments','','','', 
'1','0','0','0x7fffffffffffffff','','') 

a mi etiqueta de enlace porque no era capaz de encontrar una solución mejor.

Si hay alguno, por favor avíseme.

+0

Por favor, vote mi respuesta al menos porque hizo lo mismo que sugerí. –

1

Chad Schroeder hizo una publicación de blog sobre cómo construir la llamada a la función javascript en C#. Teniendo en cuenta un par de configuraciones, como forzar el pago y abrir en el navegador o cliente, por ejemplo.

private string GetFileViewScript(SPFile file) 
    { 
     string text = SPUtility.MapToControl(SPContext.Current.Web, file.Name, string.Empty); 
     string text2 = (file.Item.ParentList.DefaultItemOpen == DefaultItemOpen.Browser) ? "1" : "0"; 
     SPFieldLookupValue sPFieldLookupValue = file.Item["CheckedOutUserId"] as SPFieldLookupValue; 
     string scriptLiteralToEncode = (sPFieldLookupValue == null) ? string.Empty : sPFieldLookupValue.LookupValue; 
     string text3 = (SPContext.Current.Web.CurrentUser != null) ? SPContext.Current.Web.CurrentUser.ID.ToString(CultureInfo.InvariantCulture) : string.Empty; 
     string text4 = file.Item.ParentList.ForceCheckout ? "1" : "0"; 

     return string.Format(CultureInfo.InvariantCulture, "return DispEx(this,event,'{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}')", new object[] 
     { 
      "TRUE", 
      "FALSE", 
      "FALSE", 
      text, 
      text2, 
      text, 
      string.Empty, 
      string.Empty, 
      SPHttpUtility.EcmaScriptStringLiteralEncode(scriptLiteralToEncode), 
      text3, 
      text4, 
      (string)file.Item["IsCheckedoutToLocal"], 
      (string)file.Item["PermMask"] 
     }); 
    } 

Using DispEx in a link to a SharePoint document

0

Dispex no funciona en Chrome a menos que el enlace está dentro de un div que contiene el tipo de documento en un atributo llamado aplicación:

<div class="ms-vb itx" ctxname="ctx19" id="2" app="ms-word"> 
    <a onfocus="OnLink(this)" 
     href="/test/DocLib2/wordtest.docx" 
     onmousedown="return VerifyHref(this,event,'1','SharePoint.OpenDocuments','')"  
     onclick="return DispEx(this,event,'TRUE','FALSE','FALSE', 
      'SharePoint.OpenDocuments.3','1', 'SharePoint.OpenDocuments', 
      '','','','1','0','0','0x7fffffffffffffff','','')">wordtest</a> 
    <span class="ms-newdocument-iconouter"> 
     <img class="ms-newdocument-icon" src="/_layouts/15/images/spcommon.png?rev=23" alt="new" title="new"> 
    </span>   
</div> 

O se necesita para envolverlo en tal div, y asegúrese de insertar la aplicación correcta que abrirá el archivo, o haga su propia lista mirando la extensión del archivo:

$('.test_links').click(function(e) { 
    e.preventDefault(); 
    if (!!window.chrome) { 
     var extenstion = this.href.substr(this.href.lastIndexOf('.') + 1); 
     var prefix = ''; 
     switch (extenstion) { 
      case 'doc': 
      case 'docx': 
       prefix = 'ms-word:ofv|u|'; 
       break; 
      case 'xls': 
      case 'xlsx': 
       prefix = 'ms-excel:ofv|u|'; 
       break; 
     } 
     window.location.href = prefix + this.href; 
    } else { 
     DispEx(this, e, 'TRUE', 'FALSE', 'FALSE', 'SharePoint.OpenDocuments.3', '0', 'SharePoint.OpenDocuments', '', '', '', _spPageContextInfo.userId + '', '0', '0', '0x7fffffffffffffff'); 
    } 
}); 
Cuestiones relacionadas