В сегодняшней статье я расскажу, как можно добавить options group в поле подстановка.
К примеру у нас есть список Phones, который содержит два
поля Title и Brand (поле типа «выбор»)
Хорошо бы сгруппировать по полю Brand… Тут на помощь нам придет jQuery и Rest запрос.
Немного расскажу о работе скрипта:
1. Обращаемся в список и получаем требуемые элементы.
2. Если вернувшийся массив не пуст, то запоминаем ранее
выбранный элемент (удобно в форме EditForm.aspx)
3. Чистим все значения в поле.
4. Добавляем группы и options
5. Возвращаем выбранное значение.
Теперь сам скрипт
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | <script src= "/Style%20Library/Js/jquery-1.11.1.min.js" type= "text/javascript" ></script> <script type= "text/javascript" > _spBodyOnLoadFunctionNames.push( "postRender" ); function postRender() { optionGroup() } function optionGroup() { var fieldId = "Phone" // Id Loocup поля var listTitle = "Phones" ; // название списка var selectFields = [ "ID" , "Title" , "Brand" ]; // возвращаемые поля var expandFields = []; var filter = "" var orderBy = "Brand,Title" //сортировка значений query = getRest(listTitle, "" ,filter, selectFields.join() , expandFields.join(), orderBy); query.done( function (data, status, xhr) { if (data.d.results.length > 0) { var targetSelect = jQuery( "select[id^='" + fieldId + "_']" ); var items = data.d.results; var selectedVal = targetSelect.val(); // очистка селекта removeSelectOptions(fieldId + "_" ) var optionGroup = {}; var idGrop = 0; for ( var i = 0; i < items.length ; i++) { var item = items[i]; var value = item.Id; var text = item.Title; // заменить на требуемое var groupBy = item.Brand; // заменить на требуемое поле var o = new Option(); o.value = value; o.text = text; if (!optionGroup[groupBy]) { idGrop ++ optionGroup[groupBy] = idGrop; targetSelect.append( '<optgroup id="OptionGroup' + optionGroup[groupBy] + '" label="' + groupBy + '"></optgroup>' ); }; jQuery( "#OptionGroup" + optionGroup[groupBy]).append(o); } // возваращаем выбранное значение targetSelect.val(selectedVal); } else { console.log( "элементы не найдены" ); } }); query.fail( function (){console.log( 'Ошибка при получении ' + listTitle ); }); } function getRest(listTitle,itemId,filter,select,expand,orderby,asyncVal) { orderby = orderby ? orderby : "" ; var webUrl = _spPageContextInfo.webAbsoluteUrl; var listItemUri = webUrl + "/_api/web/lists/GetByTitle('" + listTitle + "')/Items(" +itemId+ ")?$filter=" +filter+ "&$select=" +select+ "&$expand=" + expand+ "&$orderby=" + orderby; listItemUri = encodeURI(listItemUri); console.log(decodeURI(listItemUri)); //console.log("asyncVal", asyncVal); asyncVal = ( "" ) ? false : true ; queryAjax = jQuery.ajax({ async: asyncVal, url: listItemUri, type: "GET" , headers: { "accept" : "application/json;odata=verbose" } }); queryAjax.done( function (data){ console.log( 'данные REST полученны' )}); queryAjax.fail( function (){console.log( 'Ошибка при вылнении запроса REST' )}); return queryAjax; } function removeSelectOptions(fieldID) { jQuery( "select[id^='" + fieldID + "']" ).find( "option" ).each( function () { if (jQuery( this ).val() != 0) { jQuery( this ).remove(); } }); } </script> |
как пользоваться:
нужно заменить Id Loocup поля, название списка откуда будут получаться данные, получаемые поля. так же заменить "item.Brand" на "item. Internal Name " поля по которому будет группировка.
так же можно добавить фильтр, и тем самым поле будет содержать часть значений (Cascade Dropdowns),
Скрипт можно скачать тут
Комментариев нет:
Отправить комментарий