Лучший отвечающий
Проверка с помощью JS при сохранении формы SharePoint 2013

Вопрос
-
Коллеги, в продолжение предыдущей темы. Есть задача ограничить добавление в список элементов по достижении определенного количества элементов.
С помощью C# я знаю как это реализовать, но для каждого списка писать новый проект, потом его деплоить - как-то не хорошо.
Подумал, а можно ли с помощью JS решить данный вопрос?
Есть замечательная функция PreSaveAction(), которой логично было бы воспользоваться. Но я столкнулся с такой проблемой: указанная функция должна вернуть либо true, либо false. А мне в скрипте, чтобы получить количество элементов, приходится выполнить асинхронный запрос. Из функции, которая выполняется при успешном запросе, я не могу вернуть true или false в основную функцию PreSaveAction(), чтобы она завершилась должным образом (а мне нужно вернуть что-то!).
Может быть у кого-нибудь появятся какие-либо идеи?
P.S. приведенный скрипт неверный, но я предлагаю его взять за основу :)
<script type="text/javascript"> var items; var itemCount = 0; function PreSaveAction() { var date = $("[id^='Date'] :selected").text(); var diapazon = $("[id^='Diapazon'] :selected").text(); var clientContext = new SP.ClientContext.get_current(); var oWebsite = clientContext.get_web(); this.collList = oWebsite.get_lists(); list = collList.getByTitle('Анатомия'); var camlQuery = new SP.CamlQuery(); camlQuery.set_viewXml('<View><Query><Where><And><Eq><FieldRef Name=\'Date\' />'+ '<Value Type=\'Choice\'>'+date+'</Value></Eq><Eq><FieldRef Name=\'Diapazon\' />'+ '<Value Type=\'Choice\'>'+diapazon+'</Value></Eq></And></Where></Query></View>'); items = list.getItems(camlQuery); clientContext.load(items); clientContext.executeQueryAsync(Function.createDelegate(this, this.Success), Function.createDelegate(this, this.Failed)); if(itemCount < 10) return true; else { alert('На выбранную дату и диапазон уже записано 10 человек!'); return false; } } function Success(sender, args) { itemCount = items.get_count(); } function Failed(sender, args) { alert('request failed ' + args.get_message() + 'n' + args.get_stackTrace()); } </script>
- Изменено Колтышев Евгений 1 марта 2016 г. 9:23
1 марта 2016 г. 9:20
Ответы
-
что касается запроса то я могу дать ссылку на стратью, в ней есть пример запроса к списку.
в функции getRest последним параметром можно передать тип запроса async (true/false если не передавать то true)
единственно при работе с датами нужно учитывать тайм зону сайта, т.к. данные вернутся с часовым смещением 0 и хранятся так же.
мой блог Немного о SharePoint
- Изменено Kaplin VladimirModerator 1 марта 2016 г. 11:24
- Предложено в качестве ответа Mikhail Zhuikov 1 марта 2016 г. 19:51
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 4 марта 2016 г. 7:20
1 марта 2016 г. 11:11Модератор -
добрый день
я реализовывал через REST + синхронный запрос (ajax).
не сказал бы что это было идеальное решение, но оно решило задачу.
(если четно не используется, проект не взлетел)
мой блог Немного о SharePoint
- Изменено Kaplin VladimirModerator 1 марта 2016 г. 11:03
- Предложено в качестве ответа Mikhail Zhuikov 1 марта 2016 г. 19:51
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 4 марта 2016 г. 7:20
1 марта 2016 г. 11:01Модератор
Все ответы
-
добрый день
я реализовывал через REST + синхронный запрос (ajax).
не сказал бы что это было идеальное решение, но оно решило задачу.
(если четно не используется, проект не взлетел)
мой блог Немного о SharePoint
- Изменено Kaplin VladimirModerator 1 марта 2016 г. 11:03
- Предложено в качестве ответа Mikhail Zhuikov 1 марта 2016 г. 19:51
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 4 марта 2016 г. 7:20
1 марта 2016 г. 11:01Модератор -
что касается запроса то я могу дать ссылку на стратью, в ней есть пример запроса к списку.
в функции getRest последним параметром можно передать тип запроса async (true/false если не передавать то true)
единственно при работе с датами нужно учитывать тайм зону сайта, т.к. данные вернутся с часовым смещением 0 и хранятся так же.
мой блог Немного о SharePoint
- Изменено Kaplin VladimirModerator 1 марта 2016 г. 11:24
- Предложено в качестве ответа Mikhail Zhuikov 1 марта 2016 г. 19:51
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 4 марта 2016 г. 7:20
1 марта 2016 г. 11:11Модератор -
Добрый день!
Предлагаю считать количество элементов списка не в функции PreSaveAction(), а раньше, например при открытии формы. А в PreSaveAction() выполнять только сравнение полученного ранее значения с максимальным.
1 марта 2016 г. 13:42 -
Добрый день!
Предлагаю считать количество элементов списка не в функции PreSaveAction(), а раньше, например при открытии формы. А в PreSaveAction() выполнять только сравнение полученного ранее значения с максимальным.
мой блог Немного о SharePoint
1 марта 2016 г. 13:48Модератор -
а если пока форма была открыта были добавлены элементы?
В таком случае я бы выполнял проверку числа элементов списка именно при открытии NewForm, а не при выходе из неё. И если уже достигнут предел их количества, запрещал бы создание нового элемента. Это избавит пользователя от неприятного сюрприза - отказ в создании нового элемента после ввода всех данных, а программиста - от изощрений с PreSaveAction().
- Изменено Григорич 2 марта 2016 г. 4:10
1 марта 2016 г. 14:18