Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи по программированию » .NET - Все статьи »

Обсудить на форуме Обсудить на форуме

Создание нового типа опроса в Microsoft Windows SharePoint Services 2.0
Статья для администраторов служб Microsoft Windows SharePoint Services 2.0

Вступление

Статья для администраторов служб Microsoft Windows SharePoint Services 2.0

Возникла необходимость в опросах WSS использовать не только текст, но и картинки. Чтобы пользователи могли высказывать свое мнение, не только прочитав текст, но и увидев предмет (предметы) обсуждения.

В печатных материалах, посвященных WSS, есть статьи о том, как добавлять новые поля к шаблонам списков. Данный материал очень полезен в том случае, когда необходимо создавать списки с уже предзаданным набором полей. Это все хорошо, но нам необходимо изменить не набор предзаданных полей, а изменить "функционал" поля. Сделать поле способным отображать картинку. Стандартных средств SharePoint я не нашел, пришлось разбираться, как реализовать данную потребность иным способом.

В данной статье опишу свое решение.

В работе использую Microsoft Windows SharePoint Services 2.0 русская редакция. Релиз 6.0.2.5530. Для пользователей, имеющих другие локализации WSS в указанных ниже путях необходимо заменять 1049 на свой lcid. Для английской версии WSS это 1033.

В качестве справочной системы применяю руководство по Microsoft Windows SharePoint Services SDK, которое загрузил с узла: http://www.microsoft.com/downloads/details.aspx?Famil`yID=1c64af62-c2e9-4ca3-a2a0-7d4319980011&displaylang=en

Перед развитием темы опишу, как устроены списки в WSS.

Устройство списков

Многие вещи, описанные ниже, относятся только к отдельному виду списков - Опросам.

Списки существуют в двух состояниях: в виде шаблонов и в виде реальных списков. Ввод информации происходит в реальные списки. При создании списка мы выбираем шаблон, указываем имя будущего реального списка, задаем другие характеристики и нажимаем создать. В этот момент, WSS: добавляет элемент в коллекцию SPListCollection, создает виртуальный каталог и создает в нем aspx файлы для работы со списком. Далее, в случае создания опросов, система перенаправляет нас на страницу создания первого вопроса. Создав первый вопрос, мы переходим к созданию следующего и так далее. За создание и редактирование вопросов опроса отвечают две aspx страницы: qstnew.aspx и qstedit.aspx. Внутри этих страниц формируется "начинка" вопроса. Об этом читай ниже.

Все списки в WSS представлены классом SPList. У этого класса есть свойство Fields, через которое можно получить доступ к коллекции полей списка. Поле списка представлено классом SPField. Из этого следует, что столбцы обычного списка и вопросы опроса внутренне представлены объектом одного и того же класса SPField.

В классе SPField есть свойство SchemaXml, значением которого является xml описание данного поля примерно такого содержания:

<Field Name="_x0430__x043f__x044b__x0432__x04" 
FromBaseType="FALSE" 
Type="Choice" 
DisplayName="Новый вопрос" 
Format="RadioButtons" 
FillInChoice="FALSE" 
GridStartNum="1" 
GridEndNum="5" 
GridTxtRng1="Низкая" 
GridTxtRng2="Средняя" 
GridTxtRng3="Высокая" 
ColName="nvarchar2">
<CHOICES>
<CHOICE>Вариант 1</CHOICE>
<CHOICE>Вариант 2</CHOICE>
<CHOICE>Вариант 3</CHOICE>
</CHOICES>
</Field>

Из выше изложенного можно сделать такой вывод: Для того чтобы в опросе можно было использовать картинки необходимо расширить XML описание поля, добавив к нему атрибут, хранящий ссылку на картинку и добавить все необходимые обработки этого атрибута. К примеру, так:

<Field Name="_x0430__x043f__x044b__x0432__x04" 
FromBaseType="FALSE" 
Type="Choice" 
DisplayName="Новый вопрос" 
PictureURL="http://MyWeb/mypict.jpg" 
Format="RadioButtons" 
FillInChoice="FALSE" 
GridStartNum="1" 
GridEndNum="5" 
GridTxtRng1="Низкая" 
GridTxtRng2="Средняя" 
GridTxtRng3="Высокая" 
ColName="nvarchar2">
<CHOICES>
<CHOICE>Вариант 1</CHOICE>
<CHOICE>Вариант 2</CHOICE>
<CHOICE>Вариант 3</CHOICE>
</CHOICES>
</Field>

Изменения затронут те страницы, с помощью которых создаются, редактируются и отображаются вопросы. За создание вопроса отвечает страница qstnew.aspx, за редактирование qstedit.aspx, а за отображение ответственность несет шаблон опроса, хранящийся в файле Schema.xml.

Начнем вносить изменения в следующем порядке:

  1. Создадим новый шаблон опроса. Это позволит нам на следующем шаге ссылаться на новый вид опроса.
  2. Изменим файлы создания и редактирования вопросов. Это позволит расширить XML описание поля
  3. Внесем изменения в файл определения Schema.xml. Это позволит увидеть работу нового опроса в действии.

Создание нового шаблона

Шаблон списка состоит из двух частей: объявления шаблона и папки с файлами шаблона.

Наш Графический опрос - будет очень похож на имеющийся в системе стандартный опрос. Поэтому новый шаблон создадим на базе имеющегося шаблона "Опрос" (voting).

Добавление объявления шаблона

  1. Откроем файл Local_Drive:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\60\TEMPLATE\1049\Site_Template_Name\XML\ONET.xml.
  2. Найдем элемент ListTemplates
  3. Внутри элемента ListTemplates скопируем дочерний элемент,
    <ListTemplate 
    Name="voting" 
    DisplayName="Опрос" 
    Type="102" 
    BaseType="4" 
    OnQuickLaunch="TRUE" 
    SecurityBits="12" 
    Description="Опросы служат для выяснения мнений других посетителей веб-узла. 
    Опросы имеют специальные возможности, позволяющие быстро создавать вопросы и определять, 
    каким образом пользователи должны отвечать на них." 
    Image="/_layouts/images/itsurvey.gif"> 
    </ListTemplate>
    
    а затем создадим копию в этом же элементе ListTemplates.
  4. В копии изменим значения атрибутов:
    • Name с "voting" на "graphvoting" (Читай примечание ниже)
    • DisplayName с "Опрос" на "Графический опрос"
    • Type с "102" на "777". (Читай примечание ниже)
    • Значение атрибута Description измените на свое усмотрение.

Создание папки с файлами шаблона

Файлы шаблона расположены в отдельной папке. Имя папки должно строго совпадать со значением атрибута Name элемента ListTemplate. В нашем случае это graphvoting. Создадим папку с файлами шаблона. Для этого:

  1. Откроем папку Local_Drive:\Program Files\Common Files\Microsoft Shared\web server extensions\60\TEMPLATE\1049\ Site_Template_Name \LISTS
  2. В ней сделаем копию папки Voting. Копии дадим имя, совпадающее со значением атрибута Name в новом элементе ListTemplate. В нашем случае это имя будет graphvoting. У меня получилось так: Local_Drive:\Program Files\Common Files\Microsoft Shared\web server extensions\60\TEMPLATE\1049\ Site_Template_Name \LISTS\GRAPHVOTING)
  3. В новой папке откроем файл SCHEMA.xml
  4. Изменим значения атрибутов элемента List таким образом, чтобы они соответствовали нашему шаблону. <List xmlns:ows="Microsoft SharePoint" Name="GraphVoting" Title="Графическое голосование/опрос" Direction="0" Url="Lists/graphvoting" BaseType="4">
  5. Проверим правильность внесенных изменений. Для этого:
    1. сохраним все открытые файлы
    2. перезапустим WSS
    3. в веб браузере откроем страницу SharePoint
    4. перейдем в раздел "Создать"

В разделе "Опросы" должны содержаться два элемента: Опрос и Графический опрос. Если это так, значит все сделано верно.

При попытке создать "Графический опрос" будет создан обычный опрос, с той лишь разницей, что у нового списка номер родителя (базового шаблона - BaseTemplate) будет не 102, а 777.

Подробнее о создании шаблонов списков можно прочесть в статье "Creating a List Definition". Адрес статьи: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/spptsdk/html/tsptCreateListTemplate.asp.

Примечание. Почему я задал значение атрибута Type равным 777. В выше указанной статье есть такие строки:

 

"Important The Name attribute must be set to the exact name of the new list folder. To identify the list, assign a numerical ID that is not being used elsewhere and that is less than 1000 to the Type attribute."

 

Исходя из которых - значение атрибута Type должно быть уникальным и меньше 1000. Почему 777? Просто мне так захотелось J. В начале своих исследований вместо 777 я использовал 1020. В этом случае тоже работало, но если просят, пусть будет меньше 1000.

Изменение файлов создания и редактирования опросов

В начале раздела еще раз замечу, что обработка опросов отличается от обработки обычных списков и код ответственный за это располагается в других файлах. За создание вопросов опроса отвечает файл qstnew.aspx, за редактирование - qstedit.aspx. Эти файлы расположены в папке Local_Drive:\Program Files\Common Files\Microsoft Shared\web server extensions\60\TEMPLATE\LAYOUTS\1049\

Так как версии WSS могут не совпадать, и, следовательно, не совпадать программный код, перед детальным описанием дам общее словесное описание будущих изменений.

Файлы qstnew.aspx и qstedit.aspx будут работать как для базового, так и графического опросов. Основная логика этих страниц заключается в создании HTML формы, через которую пользователь настраивает содержание вопроса, его тип, и, если необходимо, варианты ответов и в подготовке XML схемы вопроса. Через скрытое поле HTML формы схема отправляется службе WSS и сохраняется ею в свойстве SchemaXML объекта класса SPField.

Наша задача - в случае использования графического опроса:

  1. расширить HTML форму настройки вопроса, добавив в нее поле для ввода URL картинки
  2. внести изменения в процедуру подготовки XML схемы перед отправкой службе WSS.

Так как логика работы в обоих файлах практически одинаковая начнем вносить изменения сразу в оба файла.

  1. Откроем в редакторе файлы qstnew.aspx и qstedit.aspx
  2. В серверном скрипте, который начинается после HTML тэга </HEAD> добавим объявление двух переменных. Первая будет содержать URL картинки, а вторая номер шаблона. У меня получилось так:
    ...
    </HEAD>
    <%
    //Sima
    String strPictureURL = "";
    String strBaseTemplate = spList.BaseTemplate.ToString();
    //Sima
    ...
    
  3. Отыщем в коде java функцию SubmitPage(). После объявления переменной DisplayName добавит следующий код:
    ...
    <% if( strBaseTemplate == "777" ){ %> 
        var PictureURL = TrimSpaces( frm.PictureURL.value ); 
    <% } %>
    ...
    
  4. В этой же java функции отыщем объявление переменной Schema (var Schema = ...). В этой части функции начинается формирование XML схема описания вопроса. Ниже строки:
    (DisplayName ? ´DisplayName="´ + SimpleHTMLEncode(DisplayName) + ´" ´ : ´´) + 
    
    добавим:
    <% if( strBaseTemplate == "777" ){ %> 
        (PictureURL ? ´PictureURL="´ + SimpleHTMLEncode(PictureURL) + ´" ´ : ´´) + 
    <% } %>
    
  5. Повторим действия описанные в п.5 в районе еще одного описания переменной Schema, которое находиться ниже по тексту функции.
  6. Ниже по тексту файла найдем объявление HTML формы:
    <FORM name=frmFieldData method=post style="margin: 0" onSubmit="return false;">
    
  7. Теперь найдем место в HTML форме где объявляется поле ввода вопроса:
    <LABEL for="idColName">Вопрос:</LABEL><FONT size=3> </FONT><BR>
    <TABLE border=0 cellspacing=1>
    	<TR>
    		<TD colspan=2>
    			<TEXTAREA cols=40 rows=3 
    				name="DisplayName" 
    				id="idColName" 
    				size=30>
    				< %SPEncode.WriteHtmlEncode(Response, strDisplayName);% >
    				</TEXTAREA>
    		</TD>
    	</TR>
    </TABLE>
    
  8. Ниже добавим:
    <% if( strBaseTemplate == "777" ){ %>
    <LABEL for="idPictureURL">Адрес картинки:</LABEL><FONT size=3> </FONT><BR>
    <TABLE border=0 cellspacing=1>
    	<TR>
    		<TD colspan=2>
    			<TEXTAREA cols=40 rows=1 
    				name="PictureURL" 
    				id="idPictureURL" 
    				size=30>
    				<%SPEncode.WriteHtmlEncode(Response, strPictureURL);%>
    				</TEXTAREA>
    		</TD>
    	</TR>
    </TABLE>
    <% } %>
    

    Теперь, при использовании графического опроса будет отображаться дополнительное поле для ввода (редактирования) URL картинки.

  9. Последнее изменение относится только к файлу редактирования вопроса qstedit.aspx. Оно связано с получением значения URL картинки из схемы редактируемого вопроса. В тексте найдем следующий строки:
    ...
    strField = Request.QueryString.GetValues("Field")[0];
    spField = spFields.GetFieldByInternalName(strField);
    

    ниже добавим код по извлечению URL из XML схемы:

    //Sima
    if( strBaseTemplate == "777" )
    {
    	System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
    
    	xmlDoc.LoadXml(spField.SchemaXml.ToString());
    	System.Xml.XmlNode xn = xmlDoc.FirstChild;
    	System.Xml.XmlAttribute xa = xn.Attributes["PictureURL"];
    	if( xa != null )
    	{
    		strPictureURL =  xa.Value;
    	}
    }
    //Sima
    

Протестируем наши дополнения. Для этого:

  1. Перейдем в раздел по созданию элементов WSS
  2. Начнем создавать графический опрос
  3. После указания название опроса и других данных мы перейдем к формированию первого вопроса.
  4. Ниже поля "Вопрос:" мы должны увидеть поле "Адрес картинки:"
  5. Если все так, напишем вопрос и укажем URL адрес картинки.
  6. После нажатия на кнопку "Готово" перейдем на страницу настройки опроса.
  7. В разделе "Вопросы" щелкнем на наш вопрос и перейдем на страницу редактирования вопроса
  8. Ниже поля "Вопрос:" должно быть поле "Адрес картинки:", в котором отображен введенный нами URL картинки.
  9. Если все так, значит, мы все сделали верно, и можно приступать к последней заключительной части.

Мы пришли к тому, что у нас есть новый вид опроса, мы может задавать и редактировать значение дополнительного поля PictureURL, но мы не видим никаких картинок в процессе ответа на опрос. Почему так?

Все дело в том, что форма, которая выводится на этапе ответа, не отображает картинку. Чтобы исправить эту ситуацию необходимо внести изменения в файл Schema.xml, который определяет все формы будущих графических опросов. Как это сделать описано ниже.

Примечание: быть может, перед выполнением выше описанного теста придется перезапустить службы WSS. После проведения теста, созданный опрос можно удалить. На следующем этапе мы будем создавать новые опросы.

Изменение файла определения Shema.xml

Продолжим изменение файла Local_Drive:\Program Files\Common Files\Microsoft Shared\web server extensions\60\TEMPLATE\1049\ Site_Template_Name \LISTS\GRAPHVOTING\SCHEMA.xml.

Согласно документа http://msdn.microsoft.com/library/default.asp?url=/library/en-us/spptsdk/html/tscamlovSCHEMA.asp файл schema.xml определяет виды, формы, панели инструментов и специфические поля для списков, созданных на базе шаблона списка. Сказать проще, данные из файла SCHEMA.XML участвуют в формировании страниц для пользовательской работы со списками. WSS подгружает файлы схем в момент старта приложения. Поэтому чтобы мы могли видеть все наши изменения, придется каждый раз перезапускать службы WSS.

Перед началом редактирования хочу указать цель. Цель редактирования одна: сделать так, чтобы пользователи, отвечающие на опрос могли видеть картинку.

Файл Schema.xml достаточно объемный и чтобы облегчить поиск места редактирования воспользуемся простым приемом:

  1. Откроем файл Schema.xml
  2. Найдем все вхождения строки "Вернуться к опросу". При этом к каждой найденной строке будем добавлять неповторяющиеся номера. К первой найденной строке добавим 1, ко второй 2 и т.д. У меня получилось шесть вхождений.
  3. Сохраним схему
  4. Перезапустим службу SharePoint.
  5. Обновим страницу нашего опроса (Ctrl+F5)
  6. На обновленной странице видим надпись "Вернуться к опросу" и какой-то номер. У меня получился номер 6. Следовательно, изменения нам необходимо вносить в районе этой самой "шестерки".
  7. Приступим к редактированию файла схемы
  8. Найдем "Вернуться к опросу6".
  9. Ниже найдем тег <ListFormBody>. Внутри элемента ListFormBody и располагается тело шаблона страницы "Ответить на этот опрос".
  10. Далее, заменим текст, располагающийся между тегами <Fields> и <Field/>, на такое содержимое:
    <HTML><![CDATA[<TR><TH colspan="2" nowrap valign=top class="ms-formlabel">]]></HTML>
    <Property Select="DisplayName" HTMLEncode="TRUE" AutoNewLine="TRUE"/>
    <Switch>
    <Expr><Property Select="Required"/></Expr>
    <Case Value="TRUE">
    <HTML><![CDATA[<font color=red> *</font>]]></HTML>
    <SetVar Scope="Request" Name="HasRequired">TRUE</SetVar>
    </Case>
    </Switch>
    <HTML><![CDATA[</TH></tr><tr><td align="center" valign="top">]]></HTML>
    <Switch>
    <Expr><Property Select="PictureURL"/></Expr>
    <Case Value="">
    <HTML><![CDATA[ ]]></HTML>
    </Case>
    <Default>
    <HTML><![CDATA[<IMG align="center" valign="top" SRC="]]></HTML>
    <Property Select="PictureURL" HTMLEncode="TRUE" AutoNewLine="TRUE"/>
    <HTML><![CDATA["/>]]></HTML>
    </Default>
    </Switch>
    <HTML><![CDATA[</td>
    <TD class="ms-formbody"><TABLE cellPadding=2 border=0><tr><td width=20px></td><td>
    ]]></HTML>
    

    В этом фрагменте мы чуть изменили таблицу, с помощью которой формируется внешний вид вопроса. К таблице мы добавили новую ячейку, в которую будем выводить картинку. URL картинки получим из атрибута PictureURL с помощью элемента Property:

    <Property Select="PictureURL" HTMLEncode="TRUE" AutoNewLine="TRUE"/>.  
    

    При этом будем определять, а следует ли вообще вставлять картинку. Если значение атрибута PicrtureURL пустое картинку выводить не будем. Проверку выполним, воспользовавшись структурой:

    <Switch>
    <Expr><Property Select="PictureURL"/></Expr>
    <Case Value="">
    ЗНАЧЕНИЕ ПУСТОЕ - КАРТИНКУ НЕ ВЫВОДИМ <HTML><![CDATA[ ]]></HTML>
    </Case>
    <Default>
    ЗНАЧЕНИЕ НЕПУСТОЕ - ВЫВОДИМ КАРТИНКУ <HTML
    ><![CDATA[<IMG align="center" valign="top" SRC="]]></HTML>
    <Property Select="PictureURL" HTMLEncode="TRUE" AutoNewLine="TRUE"/>
    <HTML><![CDATA["/>]]></HTML>
    </Default>
    </Switch>
    
  11. Теперь сохраним файл Schema.xml, перезапустим службу SharePoint и обновим страницу опроса.
  12. Если, ниже текста вопроса Вы увидели необходимую картинку (см. начало статьи), значит, можете себя поздравить, Вы все сделали правильно.
  13. Последним штрихом осталось еще раз отредактировать файл Schema.xml. Около строки "Вернуться к опросу" уберем ранее добавленные опорный номера, еще раз перезапустим службу Windows SharePoint Services и можно пользоваться новым приятным глазу опросом.

Заключение

В данной статье рассмотрен пример расширения функциональных возможностей Windows SharePoint Services 2.0, показана открытость и расширяемость данного средства.

 

Приятной работы

___________________________

С уважением, Удалов Максим


Может пригодится:


Автор: Максим Удалов
Прочитано: 9690
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (0)

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру