none
Изменение заполнения формы списка SP в зависимости от выбора типа списка RRS feed

  • Вопрос

  • Подскажите пожалуйста ответ на тривиальный вопрос.

    Есть список с 5 типами контента в каждом типе присутствует столбец сайта "Тип списка" по типу выбор, который характеризует эти пять типов контента, в каждом типе контента есть одинаковые столбцы сайта, но скрытые по-разному  в зависимости от значения "Типа списка". Второй день не могу понять какое условие должно выполняться чтобы при заполнении формы списка при выборе  какого-то значения из "Тип списка" менялась и форма заполнения элемента списка то есть появлялись определенные графы соответствующие этому типу. Получается, что форма заполнения элемента списка соответствует типу контента "по-умолчанию" и не меняется при изменении "Тип списка"

    Как-то раньше это все было по дефолту, а теперь не могу найти, где (( 

    5 октября 2016 г. 9:05

Ответы

  • Сергей, скорее всего при изменении элемента у вас появляется стандартный drop down "тип контента", а при создании нового такого drop down нет. Я и предлагаю вам через js link рисовать на форме новый drop down и повесить на изменение значения замену url.

    Я использовал такой скрипт:

    (function () {
    	(window.jQuery || document.write('<script src="Адрес jQuery"><\/script>'));
    	
        function fillDropDown(){
            if (location.pathname.toLowerCase().endsWith("newform.aspx")) {
                // Форимруем html drop down
                var htmlAppender = '<tbody><tr><td nowrap="true" valign="top" class="ms-formlabel"><h3 class="ms-standardheader"><nobr>Тип контента</nobr></h3></td><td valign="top" class="ms-formbody">'+
                '<span dir="none"><select id="My_CT_DropDown" title="Тип контента"><option value="0" selected="selected">Тип контента 1</option><option value="1">Тип контента 2</option>'+
                '<option value="1">Тип контента 3</option></select><br></span></td></tr></tbody>';
                // Добавляем drop down на страницу
                $(".ms-formtable > tbody").before(htmlAppender);
                // Проверяем какой тип контента в адресе и выставляем текущую строчку для drop down
                if (location.search.split('ContentTypeId=').length > 1) {
                        var ctId = location.search.split('ContentTypeId=')[1].split('&')[0];
                        switch (ctId) {
                            case "0x0100 ... ...":
                                $("#My_CT_DropDown").val(0);
                                break;
                            case "0x0100 ... ...":
                                $("#My_CT_DropDown").val(1);
                                break;
    						case "0x0100 ... ...":
                                $("#My_CT_DropDown").val(2);
                                break;
                            default:
                                $("#My_CT_DropDown").val(0);
                                break;
                        }
                    }
                // Если в адресе нет типа контента - значит тип контента по умолчанию
                else {
                    $("#My_CT_DropDown").val(0);
                }
                // Вешаем обработчик изенения значения drop down
                $("#My_CT_DropDown").change(function() {
                        var val = $("#My_CT_DropDown").val();
                        switch (val) {
                            case "0":
                                location.search = location.search.split('&ContentTypeId=')[0]+"&ContentTypeId=0x0100 ... ...";
                                break;
                            case "1":
                                location.search = location.search.split('&ContentTypeId=')[0]+"&ContentTypeId=0x0100 ... ...";
                                break;
    						case "2":
                                location.search = location.search.split('&ContentTypeId=')[0]+"&ContentTypeId=0x0100 ... ...";
                                break;
                            default:
                                location.search = location.search.split('&ContentTypeId=')[0]+"&ContentTypeId=0x0100 ... ...";
                                break;
                        };
                });
            }
        }
    
        ExecuteOrDelayUntilScriptLoaded(fillDropDown, 'core.js');
    })();
    Когда будете вставлять его на страницу - не забудьте поменять id типов контента на ваши, адрес jQuery и свои варианты для drop down.


    • Изменено Dmitrii Ermakov 5 октября 2016 г. 14:22
    • Помечено в качестве ответа Sergey Koshkin 6 октября 2016 г. 6:23
    5 октября 2016 г. 14:20

Все ответы

  • Предлагаю написать скрипт, который на изменение Drop Down "Тип списка" будет менять url. В url написан текущий тип контента при создании элемента. Проблема будет только если пользователь уже заполнил форму и решил сменить тип контента - пользователь потеряет все заполненные поля. Скрипт прикручивается к форме через js link веб-части. Для этого откройте форму в режиме редактирования - допишите в адресной строке ?PageView=Shared&ToolPaneView=2

    Например

    http://sp/Lists/MyList/NewForm.aspx?PageView=Shared&ToolPaneView=2

    5 октября 2016 г. 13:19
  • Дмитрий, спасибо, за предложенное решение. При изменении элемента списка появляется форма, в которой можно помимо "Тип списка" выбрать и тип контента, соответственно при выборе другого типа контента меняется и форма заполнения элемента. А вот при создании элемента нет выбора "Тип контента", а при изменении "Тип списка" ничего не меняется. Мне по-началу казалось, что я перемудрил с настройкой веб-части формы создания по умолчанию. Но там давно стоят параметры по дефолту, да и список уже новый. Думал, что этот функционал возможен в SP изначально (вроде раньше в списках так и было), но теперь запутался окончательно )

    Спасибо за уделенное время.

     
    5 октября 2016 г. 13:42
  • Сергей, скорее всего при изменении элемента у вас появляется стандартный drop down "тип контента", а при создании нового такого drop down нет. Я и предлагаю вам через js link рисовать на форме новый drop down и повесить на изменение значения замену url.

    Я использовал такой скрипт:

    (function () {
    	(window.jQuery || document.write('<script src="Адрес jQuery"><\/script>'));
    	
        function fillDropDown(){
            if (location.pathname.toLowerCase().endsWith("newform.aspx")) {
                // Форимруем html drop down
                var htmlAppender = '<tbody><tr><td nowrap="true" valign="top" class="ms-formlabel"><h3 class="ms-standardheader"><nobr>Тип контента</nobr></h3></td><td valign="top" class="ms-formbody">'+
                '<span dir="none"><select id="My_CT_DropDown" title="Тип контента"><option value="0" selected="selected">Тип контента 1</option><option value="1">Тип контента 2</option>'+
                '<option value="1">Тип контента 3</option></select><br></span></td></tr></tbody>';
                // Добавляем drop down на страницу
                $(".ms-formtable > tbody").before(htmlAppender);
                // Проверяем какой тип контента в адресе и выставляем текущую строчку для drop down
                if (location.search.split('ContentTypeId=').length > 1) {
                        var ctId = location.search.split('ContentTypeId=')[1].split('&')[0];
                        switch (ctId) {
                            case "0x0100 ... ...":
                                $("#My_CT_DropDown").val(0);
                                break;
                            case "0x0100 ... ...":
                                $("#My_CT_DropDown").val(1);
                                break;
    						case "0x0100 ... ...":
                                $("#My_CT_DropDown").val(2);
                                break;
                            default:
                                $("#My_CT_DropDown").val(0);
                                break;
                        }
                    }
                // Если в адресе нет типа контента - значит тип контента по умолчанию
                else {
                    $("#My_CT_DropDown").val(0);
                }
                // Вешаем обработчик изенения значения drop down
                $("#My_CT_DropDown").change(function() {
                        var val = $("#My_CT_DropDown").val();
                        switch (val) {
                            case "0":
                                location.search = location.search.split('&ContentTypeId=')[0]+"&ContentTypeId=0x0100 ... ...";
                                break;
                            case "1":
                                location.search = location.search.split('&ContentTypeId=')[0]+"&ContentTypeId=0x0100 ... ...";
                                break;
    						case "2":
                                location.search = location.search.split('&ContentTypeId=')[0]+"&ContentTypeId=0x0100 ... ...";
                                break;
                            default:
                                location.search = location.search.split('&ContentTypeId=')[0]+"&ContentTypeId=0x0100 ... ...";
                                break;
                        };
                });
            }
        }
    
        ExecuteOrDelayUntilScriptLoaded(fillDropDown, 'core.js');
    })();
    Когда будете вставлять его на страницу - не забудьте поменять id типов контента на ваши, адрес jQuery и свои варианты для drop down.


    • Изменено Dmitrii Ermakov 5 октября 2016 г. 14:22
    • Помечено в качестве ответа Sergey Koshkin 6 октября 2016 г. 6:23
    5 октября 2016 г. 14:20
  • И за пример большущее спасибо. Здоровья вам ) 
    5 октября 2016 г. 14:27