Получение элементов из текущего представления / фильтра в Sharepoint 2010 - с использованием клиентской объектной модели

Как я могу получить только элементы в текущем представлении / фильтре пользователя? Использование клиентской объектной модели Sharepoint 2010 (например, Javascript / ECMAScript).

Пользователь мог выбрать представление, которое показывает подмножество элементов, доступных в библиотеке или списке, и затем применить фильтр к одному или нескольким столбцам. Я хочу получить чистый результат всей этой фильтрации. Я хочу, чтобы все элементы были видны пользователю на всех страницах.

Я видел много примеров кода, которые зависят от знания текущего представления для построения запроса - в данном случае это не очень помогает. Я уже знаю, как получить только выбранные предметы, например

SP.ListOperation.Selection.getSelectedItems(SP.ClientContext.get_current());

Однако при этом выбираются только элементы на текущей странице.

Спасибо!


person Chalky    schedule 08.10.2012    source источник
comment
На самом деле подойдет любой метод - я упомянул клиентскую объектную модель, так как в настоящее время использую ее для получения только выбранных элементов. Хотя, похоже, не получается получить представление.   -  person Chalky    schedule 13.10.2012


Ответы (2)


Предпочтительный ответ Sibirman вернет только необработанный запрос для представления. Пользовательские фильтры фактически добавляются к URL-адресу (как часть строки InplviewHash), когда пользователь применяет действие фильтра.

например # InplviewHashf16272c0-c177-42d7-9638-35fd75c90348 = WebPartID% 3D% 7BF16272C0 - C177-42D7-9638-35FD75C90348% 7D- FilterField1% 3DProjectRef- FilterValue1 % 3DProject% 25201- FilterField2% 3DAddress- FilterValue2% 3DPilbara

В INPLVIEW.js и других файлах SP JavaScript в / _layouts есть функции, которые включают функции для декодирования этого и повторной инициализации представления, но я не смог все это расшифровать.

DecodeHashAsQueryString и InitGridFromView - хорошее место для начала.

Я закончил писать свой собственный код для проверки хеш-строки, а затем вырезал пары ключ / значение.

var uri = window.location.href;
var hashIndex = uri.search("#");

var filter = false;
if (hashIndex == -1) {
  // Wasn't found
  alert('No filters applied!');
  // ...go with default query.
} else {
  // # found. Get hashstring
  var hashStr = uri.substring(hashIndex);
  newStr = DecodeHashAsQueryString(hashStr);

  var trStr = newStr.substring(newStr.indexOf("FilterField"));
  var retStr = trStr.replace(/%3D|&/g,",").replace(/%2520/g," ");
  retStr = retStr.replace(/FilterField[0-9]+,|FilterValue[0-9]+,/g,"")
  var filtArray = retStr.split(','); // "MyField1","MyValue1",...

И применяю их к моему собственному запросу, который не включает ограничения, поэтому возвращаются все элементы, соответствующие критериям фильтра.

Если вы хотите обрабатывать поля, отличные от выбора текста opr, вам нужно сделать еще один шаг и получить тип поля, чтобы вы могли изменить тип значения запроса для каждого поля по мере необходимости.

person Panoone    schedule 17.08.2014

Сделать это можно двумя запросами:

function getItemsFromView(listTitle, viewTitle)
{

    var context = new SP.ClientContext.get_current();
    var list = context.get_web().get_lists().getByTitle(listTitle);
    var view = list.get_views().getByTitle(viewTitle);
    context.load(view);

    context.executeQueryAsync(
        function(sender, args) {getItemsFromList(listTitle, "<View><Query>" + view.get_viewQuery() + "</Query></View>")},
        function(sender, args) {alert("error: " + args.get_message());}
    );
}

function getItemsFromList(listTitle, queryText) 
{
    var context = new SP.ClientContext.get_current();
    var list = context.get_web().get_lists().getByTitle(listTitle);

    var query = new SP.CamlQuery();
    query.set_viewXml(queryText);

    var items = list.getItems(query);

    context.load(items);
    context.executeQueryAsync(
        function()
        {
            var listEnumerator = items.getEnumerator();
            var i = 0;
            while (listEnumerator.moveNext())
            {
                i++;
            }
            alert("items retrieved: " + i);
        },
        function(sender, args) {alert("error in inner request: " + args.get_message());}
   );

}
person Sibirman    schedule 16.01.2013
comment
Привет, извините, вас не было, спасибо за ответ - я думаю, ваша первая функция не будет работать, так как для этого требуется представление, которого у меня нет. Для вашей второй функции требуется текст запроса - я тоже не знаю, доступен ли он. Как бы вы назвали эту вторую функцию? Спасибо. - person Chalky; 11.02.2013