Некоторое время назад у нас возникла задача создать список с каскадными полями, данные для которых надо было бы брать из друогого списка. Стандартный формат стобца Lookup для этого не очень подходил, т.к. в исходном списке должно было быть большое количество элементов, отличающихся одним-двумя значениями.
В интернете удалось найти несколько решений по 600-800 баксов. Но хотелось сделать все самостоятельно. Решить эту задачу получилось с помощью SharePoint Designer 2010 и Infopath Designer 2010.
Предположим, у нас есть список клиентов и список заказов. В списке заказов мы хотим получать данные из списка клиентов. При этом, у каждого клиента могут быть офисы в разных городах или несколько офисов в одном городе.
Для этого создадим список Клиеты (со столбцами Название, Город, Адрес) и Заказы (со столбцами Название заказа, Город, Клиент, Адрес). И перейдем в InfoPath для настройки формы создания нового заказа:
Создадим подключение к данным Data Connection. В правом нижнем углу выбираем Manage Data Connections –> Add.
Указываем Receive Data –> SharePoint List or Library –> Указываем адрес нашего сайта SharePoint –> Выбираем список Клиентов –> Выбираем, какие поля будут доступны в этом подключении: Название, Город, Адрес.
Далее в форме создания нового Заказа добавляем Drop-Down List Box поля City, Client, Address. Откуда брать данные сразу можно не указывать. Вернемся к этому чуть позже. После создания 3 нужных стобцов, переходим к настройке полей формы. Заходим в свойства поля (выбираем правой кнопкой Drop-Down List Box Properties) –> В разделе откуда получать данные выбираем Get Choices from External Data Source –> Указываем созданные в самом начале источник данных –> Указываем значения, которые хотим получать и отображать в этом поле. В качестве Value и Title выбираем одни и те же значения (например, Город и Город или Адрес и Адрес), т.к. иначе некорректно будут работать фильтры.
Настраиваем поле “Клиент”:
Настраиваем поле “Адрес”:
Все, поля созданы и форма работает. Однако обратие внимание, что в каждом поле формы отображаются все значения из соответствующих колонок исходного списка (все организации, все адреса, все города):
Для того, чтобы это исправить возвращаеся обратно в InfoPath и переходим в свойства поля Город. Указываем галочку “Show only entries with unique display names”. Так мы будем отображать только записи с уникальными названиями.
Для того, чтобы настроить связанность между полями переходим в свойства поля Организация (мы хотим, чтобы в этом поле отображались только организации из городов, указанных выше в поле Город) –> В строке Entries нажимаем кнопку Select XPath. И в открывшемся окошке выбираем Filter Data. Теперь настраиваем фильтрацию данных по полю Город:
То же самое делаем для фильтрации офисов Клиента в одном городе (слева выбираем поле Город из списка Заказов, а справа выбираем From List/Library – поле Город из списка Клиентов):
Нажимаем ОК. Сохраняем, публикуем, проверяем работу:
Создание нового элемента с использованием каскадных полей:
Новый элемент был создан:
Вот и все