Saturday 15 April 2017

Метод SetUrlKeyValue и его JQuery аналог

Недавно, работая над очередным решением для фермы SharePoint 2013, я использовал метод JavaScript - SetUrlKeyValue для редактирования параметра в строке запроса. 

SetUrlKeyValue (KEYNAME, KeyValue, bEncode, URL)

Устанавливает значение ключа в URL. Третий параметр указывает - необходимо ли значение кодировать.

Определение метода я нашел в файле INPLVIEW.debug.js

function SetUrlKeyValue(keyName, keyValue, bEncode, url) {
    if (url == null)
        url = window.location.href + "";
    var val = keyValue;
    var uri = new URI(url, {
        disableEncodingDecodingForLegacyCode: true
    });
 
    url = uri.getQuery();
    if (bEncode)
        val = escapeProperly(val);
    if (url.indexOf(keyName + "=") < 0) {
        if (url.length > 1)
            url += "&";
        else if (url.length == 0)
            url += "?";
        url += keyName + "=" + val;
    }
    else {
        var re = new RegExp(keyName + "=[^&]*");
 
        url = url.replace(re, keyName + "=" + val);
    }
    uri.setQuery(url);
    return uri.getString();
}

И все было прекрасно, метод великолепно выполнял свое назначение, и я был доволен. 
Тем не менее, изначально, я не учел очень важную особенность работы метода SetUrlKeyValue - он выполняется в среде, запущенной от имени пользователей, обладающих, как минимум, правами для совместной работы с текущим контентом.
Меня это не устраивало, так как метод должен выполняться и для пользователей с правами только для чтения текущей страницы. И таких пользователей, как правило, должно быть большинство. Не давать же в конце концов им всем права на совместное пользование сайтом SharePoint☺.

Вот фрагмент моей функции, который изначально мною использовался:
$("a[title='zamena']").each(function () {
        var url = $(this).attr("href");
        var _BZnaniyId_ = url.indexOf('BZnaniyId=');
        if (_BZnaniyId_ > 0) {
            var BZnaniyId = parseInt(GetUrlKeyValue("BZnaniyId"));
            if (BZnaniyId > 1) {
                try{
                    var url1 = SP.Utilities.UrlBuilder.removeQueryString(url, "BZnaniyId");
                    if (typeof url1 != "undefined") {
                        var url2 = SetUrlKeyValue("BZnaniyId", BZnaniyId, false, url1);
                        if (typeof url2 != "undefined") {
                            $(this).attr("href", url2);
                        }
                    }
                }
                catch (e)
                {
                    console.log('Ошибка: ' + e);
                }
            }
        } 
    });
Присваивание значения переменной  url2 вызывало исключение. После некоторых экспериментов я решил поменять способ инициализации переменной. И это стало выглядеть следующим образом:
$("a[title='zamena']").each(function () {
        var url = $(this).attr("href");
        var _BZnaniyId_ = url.indexOf('BZnaniyId=');
        if (_BZnaniyId_ > 0) {
            var BZnaniyId = parseInt(GetUrlKeyValue("BZnaniyId"));
            if (BZnaniyId > 1) {
                try{
                    var url1 = SP.Utilities.UrlBuilder.removeQueryString(url, "BZnaniyId");
                    if (typeof url1 != "undefined") {
                        var url2 = updateQueryStringParameter("BZnaniyId", BZnaniyId, url1);
                        if (typeof url2 != "undefined") {
                            $(this).attr("href", url2);
                        }
                    }
                }
                catch (e)
                {
                    console.log('Ошибка: ' + e);
                }
            }
        }
    });

Для инициализации переменной url2 я использовал другой метод чтения и редактирования строки запроса.

Реализация этого метода выглядит следующим образом:
function updateQueryStringParameter(key, value, uri) {
    var re = new RegExp("([?&])" + key + "=.*?(&|$)""i");
    var separator = uri.indexOf('?') !== -1 ? "&" : "?";
    if (uri.match(re)) {
        return uri.replace(re, '$1' + key + "=" + value + '$2');
    }
    else {
        return uri + separator + key + "=" + value;
    }
}

В моем случае все прекрасно работает. 
Публикую здесь информацию в надежде на то, что кому-нибудь информация будет полезной.

No comments:

Post a Comment