Marc
Marc

Reputation: 6771

Create edit link to document in sharepoint

I have a document library in sharepoint storing a word document.

If I click on the link to the document I get a dialog box with "you want to open this file in readonly or editmode etc" and can open it in edit mode, change it, save it directly in word an the changes are saved in the document library.

The link to the file in the document library looks like this:

<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>

How do I create this link in my own web part where I have the name of the file and document library? Without just copying the above code, that wouldn't be a good idea...

Is there some "official" method to achieve this?

Upvotes: 6

Views: 9602

Answers (5)

moonpatrol
moonpatrol

Reputation: 1202

DispEx does not work in Chrome unless the link is within a div that contains the document type in an attribute called app:

<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>

Either you need to wrap it in such a div, and be sure to insert the correct application that will open the file, or make your own list by looking at the file extension:

$('.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');
    }
});

Upvotes: 1

Peter Jacoby
Peter Jacoby

Reputation: 2416

Unfortunately it doesn't seem like there is a better option. But at least you can sort of figure out what the function definition is. The DispEx function is defined in the core.js file (but it's easier to read in the core.debug.js). Both are in 14\Templates\Layouts\1033 directory.

Here is the function definition:

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

Here is my guess on what they mean. Please feel free to add comments to correct any mistakes or omissions:

  • ele - [obj] the element
  • objEvent - [obj] the event object
  • fTransformServiceOn - [bool] (unknown functionality) defaults to True
  • fShouldTransformExtension - [bool] (unknown functionality) defaults to False
  • fTransformHandleUrl - [bool] (unknown functionality) defaults to False
  • strHtmlTrProgId - [string] name of the ActiveXControl to try to load defaults to SharePoint.OpenDocuments.3
  • iDefaultItemOpen - [int] indicator of default to Edit or Read defaults to 1
  • strProgId - [string] name of the ActiveX Control
  • strHtmlType [string] (unknown functionality) defaults to empty
  • strServerFileRedirect - [string] (unknown functionality)
  • strCheckoutUser [string] the ID of the user who has checked out the document
  • strCurrentUser - [string] the ID of the current user
  • strRequireCheckout - [string] indicator whether to force a checkout
  • strCheckedoutTolocal - [string] indicator of whether to use the Local Drafts folder
  • strPermmask - [string] permissions mask for the current user defaults to 0x7fffffffffffffff

There are clearly some inconsistencies in terms of using strings and integers to represent boolean values. It's also strange that your code has 17 parameters but I can only find a function definition with 15 parameters, so I'm not sure what those last two empty strings are for. Some of that is the nature of JavaScript, but it also just looks sloppy on the part of Microsoft.

This doesn't really answer the question, hopefully it helps you or someone else.

Upvotes: 12

Steven
Steven

Reputation: 21

Chad Schroeder made a blog post on how to construct the javascript function call in C#. Taking into account a couple of settings, like force checkout and open in browser or client for instance.

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

Upvotes: 2

Marc
Marc

Reputation: 6771

I end up with adding this code

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

to my link tag because I wasn't able to find a better solution.

If there is any, please let me know.

Upvotes: 1

Oleg Savelyev
Oleg Savelyev

Reputation: 968

I don't remember if there is an official ability to do it with JavaScript COM, but you can use the ASP.NET HyperLink control to generate the similar link. For instance put in layout

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

and in code-behind something like

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

just use the same values from OOTB link, but change

/test/DocLib2/wordtest.docx

to URL of your document.

Upvotes: 0

Related Questions