Вступ

Стаття для адміністраторів служб 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 FilesCommon FilesMicrosoft
    SharedWeb Server
    Extensions60TEMPLATE1049Site_Template_NameXMLONET.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 FilesCommon FilesMicrosoft
    Sharedweb server extensions60TEMPLATE1049 Site_Template_Name
    LISTS
  2. У ній зробимо копію папки Voting. Копії дамо ім'я, що збігається
    зі значенням атрибута Name у новому елементі
    ListTemplate. У нашому випадку це ім'я
    буде graphvoting. У мене вийшло так: Local_Drive: Program
    FilesCommon FilesMicrosoft Sharedweb server
    extensions60TEMPLATE1049 Site_Template_Name LISTSGRAPHVOTING)
  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 FilesCommon FilesMicrosoft Sharedweb server
extensions60TEMPLATELAYOUTS1049

Так як версії 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 FilesCommon
FilesMicrosoft Sharedweb server extensions60TEMPLATE1049
Site_Template_Name LISTSGRAPHVOTINGSCHEMA.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="http://www.ishodniki.ru/""]]> </ 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="http://www.ishodniki.ru/""]]> </ 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, показана відкритість і
розширюваність даного засобу.

 

Приємною роботи

___________________________

З повагою, Удалов Максим

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*