none
Проверка с помощью JS при сохранении формы SharePoint 2013 RRS feed

  • Вопрос

  • Коллеги, в продолжение предыдущей темы. Есть задача ограничить добавление в список элементов по достижении определенного количества элементов.

    С помощью 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:20

Ответы

Все ответы

  • добрый день

    я реализовывал через REST  + синхронный запрос (ajax). 

    не сказал бы что это было идеальное решение, но оно решило задачу.

    (если четно не используется, проект не взлетел)


    мой блог Немного о SharePoint


    1 марта 2016 г. 11:01
    Модератор
  • что касается запроса то я могу дать ссылку на стратью, в ней есть пример запроса к списку.

    в функции getRest последним параметром можно передать тип запроса async (true/false если не передавать то true)

    единственно при работе с датами нужно учитывать тайм зону сайта, т.к. данные вернутся с часовым смещением 0 и хранятся так же.


    мой блог Немного о SharePoint




    1 марта 2016 г. 11:11
    Модератор
  • Добрый день!

    Предлагаю считать количество элементов списка не в функции PreSaveAction(), а раньше, например при открытии формы. А в PreSaveAction() выполнять только сравнение полученного ранее значения с максимальным.

    1 марта 2016 г. 13:42
  • Добрый день!

    Предлагаю считать количество элементов списка не в функции PreSaveAction(), а раньше, например при открытии формы. А в PreSaveAction() выполнять только сравнение полученного ранее значения с максимальным.

    а если пока форма была открыта были добавлены элементы?

    мой блог Немного о SharePoint

    1 марта 2016 г. 13:48
    Модератор
  • а если пока форма была открыта были добавлены элементы?
    В таком случае я бы выполнял проверку числа элементов списка именно при открытии NewForm, а не при выходе из неё. И если уже достигнут предел их количества, запрещал бы создание нового элемента. Это избавит пользователя от неприятного сюрприза - отказ в создании нового элемента после ввода всех данных, а программиста - от изощрений с PreSaveAction().

    1 марта 2016 г. 14:18