Засоби Visual Studio 2010 для розробки в середовищі SharePoint

Розробка в середовищі SharePoint мала легкий наліт загадковості для багатьох розробників: їм здавалося, що розробка для даної платформи вимагає занадто багато зусиль і її важко освоїти. Крім того, в співтоваристві розробників з’явилося кілька різних думок щодо того, який набір засобів слід використовувати. Наприклад, деякі розробники успішно поєднували бібліотеки класів, папки створюваних вручну проектів з файлами конфігурації у форматі XML і вихідні події після побудови, щоб створювати компоненти і рішення для SharePoint. Інші використовували розроблене співтовариством засіб STSDEV або Visual Studio Extensions для Windows SharePoint Services (VSeWSS), щоб створювати різні додатки та рішення і розгортати їх в SharePoint. Іншими словами, розробники могли використовувати величезну кількість різних способів розгортання компонентів і пакетів рішень в SharePoint. Незважаючи на складності спільнота розробників SharePoint зросла до значного розміру – близько 600000 чоловік – і продовжує зростати. У майбутньому розробники зможуть використовувати багато можливості розробки SharePoint прямо в Visual Studio 2010, Користуючись включеними в комплект новими засобами SharePoint.


SharePoint 2010 являє собою важливий етап на шляху створення платформи розробки не тільки через підтримуваного платформою великого набору можливостей, але і через значні доповнень, призначених для того, щоб зробити процес розробки ефективніше і доступніше для розробників з будь-яким рівнем підготовки. Двома основними засобами розробки в SharePoint 2010 є SharePoint Designer 2010 і Visual Studio 2010 (в якості супровідного набору засобів для розробників використовується пакет Expression). У даній статті наведені основні відомості про розробку в SharePoint 2010, описуються засоби SharePoint в Visual Studio 2010 (включаючи короткий огляд нових шаблонів проектів), а також створення і розгортання зразка візуальної веб-частини.


Засоби SharePoint в Visual Studio 2010


Слід згадати кілька областей Visual Studio 2010, призначених для розробників в SharePoint. По-перше, відображається вікно з шаблонами проектів SharePoint, щоб можна було відразу ж починати розробку рішення. По-друге, кошти були стандартизовані у відповідності зі стандартом упаковки пакета Windows SharePoint Package (WSP), тому при імпорті або розгортанні рішення в SharePoint система Visual Studio вважає його пакетом рішення. По-третє, деякі корисні компоненти для розгортання та упаковки, наприклад відгук рішення і настроювані конфігурації розгортання, поставляються разом із засобами SharePoint в Visual Studio 2010. І останнє, новий оглядач SharePoint дозволяє переглянути вбудовані і користувацькі артефакти (наприклад, списки і робочі потоки), існуючі на вашому сервері SharePoint. Звичайно ж, це неповний список можливостей, представлених у розширеному наборі засобів Visual Studio і призначених для того, щоб задовольнити вимоги спільноти і допомогти розробникам в освоєнні платформи SharePoint.


Крім того, слід згадати кілька поліпшень SharePoint 2010, які виразно можуть бути використані в контексті Visual Studio 2010. Наприклад, нова об’єктна модель клієнта дозволяє отримати доступ до об’єкта SharePoint через бібліотеку DLL, на яку вказує посилання, а не тільки за допомогою викликів веб-служби. (В SharePoint 2007 для доступу до даних списку SharePoint використовується, наприклад, веб-служба ASP.NET.) Крім того, LINQ для SharePoint робить доступним функцію LINQ – SharePoint, що дозволяє обробляти списки як, наприклад, строго типізовані об’єкти. Тепер Silverlight (особливо в поєднанні з об’єктною моделлю клієнта) підтримується в якості власного компонента в SharePoint 2010 – вам більше не потрібно редагувати файл web.config для початку розробки. Ізольовані рішення також надають спосіб побудови веб-частин SharePoint і їх розгортання на сайті без необхідності адміністративного втручання – таким чином ви можете розгорнути веб-частина на сайті SharePoint і запустити її в контексті даного сайту в локальному примірнику SharePoint або в хмарі, використовуючи розміщену версію SharePoint. І нарешті, зовнішні списки даних перетворюють взаємодія з бізнес-системами в процес читання і запису. Хоча даний пункт здається не дуже важливим, насправді це величезний крок вперед завдяки наданню такої підтримки засобів, яка дозволяє швидко і ефективно побудувати бізнес-інтеграції. Для кожної з цих інновацій в SharePoint 2010 система Visual Studio 2010 надає певну підтримку за допомогою шаблонів проектів або інтерфейсів API, призначену для професійних розробників. Якщо існує час, коли слід починати розробку в SharePoint, то воно настало!


Розробка проекту візуальної веб-частини


Одним з найбільш поширених артефактів, який розробники створюють і розгортають в SharePoint, є веб-частину. Це має сенс за умови, що веб-частини є одними з базових стандартних блоків в SharePoint. Оскільки середу SharePoint побудована на основі ASP.NET, веб-частина успадковує ключові компоненти з архітектури веб-частини ASP.NET.


Одним з нових шаблонів проектів в Visual Studio 2010 є шаблон проекту візуальної веб-частини, який дозволяє розробникам у візуальній формі створювати веб-частину, яку можна розгорнути в SharePoint. Якщо у вас немає досвіду роботи в SharePoint, то це відмінний спосіб почати побудову користувацьких додатків для SharePoint 2010. Візуальна веб-частина містить автономний код, який обчислює вартість продуктів і передає інформацію в звичайний користувальницький інтерфейс веб-частини.



Рис. 1. Нові шаблони проектів SharePoint



Рис. 2. Подання конструктора для візуальної веб-частини


Переконайтеся, що у вас в 64-розрядній операційній системі Windows Server 2008 встановлена ​​бета-версія 2 Visual Studio 2010 і бета-версія 2 SharePoint 2010. Відкрийте Visual Studio 2010, виберіть “File” (Файл), “New Project” (Створити проект) і перейдіть до вузла SharePoint в розділі “Installed Templates” (Встановлені шаблони). На рис. 1 показані різні типи доступних шаблонів проектів. Наприклад, шаблон “Import VSeWSS Project “(Імпорт проекту VSeWSS) надає шлях оновлення для поточних проектів VSeWSS, шаблони робочих процесів дозволяють створювати та розгортати проекти робочих процесів в SharePoint, шаблон “Site Definition” (Визначення вузла) надає інфраструктуру рівня сайту, яку можна побудувати і розвернути, а шаблон “Import SharePoint Solution Package” (Імпорт пакета рішення SharePoint) дозволяє імпортувати пакети WSP для повторного розгортання на локальному примірнику сервера. Для даного покрокового керівництва виберіть шаблон проекту “Visual Web Part” (Візуальна веб-частина), вкажіть ім’я (наприклад, SampleWebPartProject) і розташування проекту, а потім натисніть кнопку “ОК”.


Після створення проекту Visual Studio 2010 створює ряд файлів за умовчанням. Розгорніть вузли проекту в оглядачі рішень, щоб відобразити ці файли. Основні файли, з якими виконується робота в даній статті, знаходяться у вузлі SampleWebPartProject. Зверніть увагу на те, що веб-частина за замовчуванням називається VisualWebPart1. Щоб змінити це ім’я, клацніть вузол VisualWebPart1 правою кнопкою миші в оглядачі рішень, виберіть пункт “Rename” (Перейменувати) і введіть нове ім’я для веб-частини.


Крім того, зверніть увагу на наявність в оглядачі рішень вузлів “Features” (Компоненти) і “Package” (Пакет). Це нові інфраструктурні частини системи Visual Studio 2010, які упаковують рішення SharePoint з використанням компонента SharePoint. Розробникам, які не мають досвіду роботи в SharePoint, слід знати, що компонент використовується для організації додатка таким способом, який зрозумілий для SharePoint. Компоненти можна розгортати в SharePoint, наприклад на рівні сайту або на веб-рівні. Структура компонента являє собою набір файлів конфігурації у форматі XML, крім того, компонент посилається (в залежності від рівня довіри до додатка) на збірку з глобального кеша зборок. Зокрема кожен компонент має в ієрархії папок SharePoint свою власну папку, в якій знаходяться його файли конфігурації, що надають йому необхідні метадані. Пакет містить компоненти та інші ресурси, використовувані при розгортанні рішень в SharePoint. Пакет також знаходиться в місці розгортання збірки. У Visual Studio 2010 представлений конструктор пакетів, який значно спрощує перегляд пакетів і управління ними. Якщо двічі клацнути вузол “Package” (Пакет), відкривається конструктор. У ньому можна додавати і видаляти компоненти з розгортається пакета. Цей конструктор значно розширює можливості розробників з формування рішень SharePoint шляхом додавання компонентів.


Перейдіть назад в уявлення оглядача рішень, клацніть правою кнопкою миші файл ProductInfoUserControl.ascx і виберіть пункт “View in Designer” (Відкрити в конструкторі). Відкривається уявлення, в якому можна перетягувати елементи керування з панелі елементів на робочу область конструктора веб-частин. Доступні три вистави: “Design” (Конструювання), “Split” (Поділ) та “Code” (Код). У даному прикладі доданий (за допомогою введення) заголовок і кілька елементів управління, включаючи текстові поля і кнопку для розрахунку вартості продукту. Крім того, введені мітки для доданих на сторінку елементів управління (див. рис. 2).


Після завершення роботи з макетом візуальної веб-частини можна додати обробники подій для кнопки. Але перед цим давайте швидко переглянемо вихідний код для даної візуальної веб-частини. Як можна бачити з фрагмента коду на рис. 3, Visual Studio додає в користувальницький інтерфейс автоматично використовувані стилі у формі синтаксису CSS. Можна також зауважити дійсні елементи управління (а в разі списку, що розкривається – І колекцію елементів), що складають користувальницький інтерфейс. Зверніть увагу на те, що для стислості були видалені директиви, створювані автоматично і включаються в верхню частину вихідного коду.


Щоб додати до веб-частину обробників подій двічі клацніть кнопку. Відкривається вікно з відповідним кодом програмної частини. Крім того, при цьому в проект елемента управління ASCX додається подія onClick. Наприклад, на рис. 3 зверніть увагу на подію onclick = “btnCalcPrice_Click”, включене в btnCalcPrice. Код програмної частини, який наведено на рис. 4, Містить простий код, що дозволяє розраховувати вартість обраного в списку продукту. Ключовими елементами даного коду є змінні рівня класу (типу double), що представляють звичайний спосіб розрахунку вартості продукту, колекція List of Products (яка містить число об’єктів Products, доданих до списку) і подія btnCalcPrice_Click. При завантаженні сторінки в SharePoint даний код викликає метод generateProductList, що заповнює список. Потім подія btnCalcPrice_Click розраховує вартість певного продукту (в залежності від обраного користувачем елементу) і відображає інформацію в списку в інтерфейсі.


Рис. 3. Вихідний код для файлу SalaryCalcWebPartUserControl.ascx


<style type=”text/css”>
.style1
{
font-family: Calibri;
font-size: medium;
font-weight: bold;
}
.style2
{
font-family: Calibri;
font-size: small;
font-weight: bold;
}
</style>
<p class=”style1″>
Product Catalog</p>
<p class=”style2″>
Product:  
<asp:DropDownList ID=”dropdwnProducts”
runat=”server” Height=”20px”
style=”margin-left: 21px” Width=”200px”>
<asp:ListItem>Helmet</asp:ListItem>
<asp:ListItem>Stick</asp:ListItem>
<asp:ListItem>Skates</asp:ListItem>
<asp:ListItem>Elbow Pads</asp:ListItem>
<asp:ListItem>Kneepads</asp:ListItem>
</asp:DropDownList>
</p>
<p class=”style2″>
Description: <asp:TextBox ID=”txtbxDescription” runat=”server”
Width=”200px” Enabled=”False”></asp:TextBox>
</p>
<p class=”style2″>
SKU:
<asp:TextBox ID=”txtbxSKU” runat=”server” style=”margin-left: 48px”
Width=”200px” Enabled=”False”></asp:TextBox>
</p>
<p class=”style2″>
Price:<asp:TextBox ID=”txtbxPrice” runat=”server”
style=”margin-left: 48px”
Width=”200px” Enabled=”False”></asp:TextBox>
</p>
<p class=”style2″>
Quantity:
<asp:TextBox ID=”txtbxQuantity” runat=”server”
Width=”200px” Enabled=”False”></asp:TextBox>
</p>
<p class=”style1″>
<asp:Button ID=”btnCalcPrice” runat=”server”
onclick=”btnCalcPrice_Click”
Text=”Calc.” />
</p>

Коли користувач натискає кнопку, веб-частина виконує зворотну передачу для запуску події, яка в нашому випадку розраховує вартість продукту. Можливо, цікавіше наведеного на рис. 4 коду, який здебільшого досить простий, є те, як веб-частину підключає цей код в дійсну веб-частину. З урахуванням того, що ми створили для користувача елемент управління ASP для нашої веб-частини, яка включає обкладинку і код програмної частини, структура проекту все ще містить дійсну веб-частину, яка повинна підключати цей елемент керування. Для цього Visual Studio створює рядок _ascxPath, яка представляє шлях до призначеного для користувача елементу управління ASCX, розташованому в ієрархії папок SharePoint 2010. Зверніть увагу і на те, що в методі CreateChildControls створюється екземпляр елемента керування, для якого призначається шлях для користувача елементу управління (за допомогою методу LoadControl). Після цього він додається в колекцію Controls за допомогою методу Add. Це дозволяє веб-частини підключати користувача елемент управління ASP в веб-частини в SharePoint. На рис. 5 наведено відповідний код.


Рис. 4. Вихідний код для файлу ProductInfoUserControl.ascx.cs


using System;
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Collections.Generic;
using System.Data;
namespace SampleWebPartProject.ProductInfo
{
public partial class ProductInfoUserControl : UserControl
{
double tax = .11;
double totalCost = 0.0;
List<Products> lstOfProducts = new List<Products>();
protected void Page_Load(object sender, EventArgs e)
{
generateProductList();
}
private void generateProductList()
{
lstOfProducts.Add(new Products()
{ strName = “Helmet”, strDescr = “Hockey helmet.”, strSKU =
“KLSONHELMT1224”, dblPrice = 59.00, intQuantity = 28 });
lstOfProducts.Add(new Products()
{ strName = “Skates”, strDescr = “Hockey skates.”, strSKU =
“SKATWOKSH0965”, dblPrice = 438.00, intQuantity = 88 });
lstOfProducts.Add(new Products()
{ strName = “Stick”, strDescr = “Composite hockey stick.”,
strSKU = “STIK82910JJKS”, dblPrice = 189.99, intQuantity =
35 });
lstOfProducts.Add(new Products()
{ strName = “Elbow Pads”, strDescr = “Hockey elbow pads.”,
strSKU = “ELBOP563215NN”, dblPrice = 34.00, intQuantity =
12 });
lstOfProducts.Add(new Products()
{ strName = “Knee Pads”, strDescr = “Hockey knee pads.”,
strSKU = “KPDS7827NNJS1”, dblPrice = 47.99, intQuantity =
44 });
}
protected void btnCalcPrice_Click(object sender, EventArgs e)
{
double dblCost = 0;
string strPrice = “”;
if (dropdwnProducts.SelectedValue == “Helmet”)
{
dblCost = lstOfProducts[0].dblPrice;
totalCost = dblCost + (dblCost * tax);
System.Math.Round(totalCost, 2);
strPrice = “$” + totalCost.ToString();
txtbxDescription.Text = lstOfProducts[0].strDescr.
ToString();
txtbxSKU.Text = lstOfProducts[0].strSKU.ToString();
txtbxPrice.Text = strPrice;
txtbxQuantity.Text = lstOfProducts[0].intQuantity.
ToString();
}
else if (dropdwnProducts.SelectedValue == “Skates”)
{
dblCost = lstOfProducts[1].dblPrice;
totalCost = dblCost + (dblCost * tax);
System.Math.Round(totalCost, 2);
strPrice = “$” + totalCost.ToString();
txtbxDescription.Text = lstOfProducts[1].strDescr.
ToString();
txtbxSKU.Text = lstOfProducts[1].strSKU.ToString();
txtbxPrice.Text = strPrice;
txtbxQuantity.Text = lstOfProducts[1].intQuantity.
ToString();
}
else if (dropdwnProducts.SelectedValue == “Stick”)
{
dblCost = lstOfProducts[2].dblPrice;
totalCost = dblCost + (dblCost * tax);
System.Math.Round(totalCost, 2);
strPrice = “$” + totalCost.ToString();
txtbxDescription.Text = lstOfProducts[2].strDescr.
ToString();
txtbxSKU.Text = lstOfProducts[2].strSKU.ToString();
txtbxPrice.Text = strPrice;
txtbxQuantity.Text = lstOfProducts[2].intQuantity.
ToString();
}
else if (dropdwnProducts.SelectedValue == “Elbow Pads”)
{
dblCost = lstOfProducts[3].dblPrice;
totalCost = dblCost + (dblCost * tax);
System.Math.Round(totalCost, 2);
strPrice = “$” + totalCost.ToString();
txtbxDescription.Text = lstOfProducts[3].strDescr.
ToString();
txtbxSKU.Text = lstOfProducts[3].strSKU.ToString();
txtbxPrice.Text = strPrice;
txtbxQuantity.Text = lstOfProducts[3].intQuantity.
ToString();
}
else if (dropdwnProducts.SelectedValue == “Knee Pads”)
{
dblCost = lstOfProducts[4].dblPrice;
totalCost = dblCost + (dblCost * tax);
System.Math.Round(totalCost, 2);
strPrice = “$” + totalCost.ToString();
txtbxDescription.Text = lstOfProducts[4].strDescr.
ToString();
txtbxSKU.Text = lstOfProducts[4].strSKU.ToString();
txtbxPrice.Text = strPrice;
txtbxQuantity.Text = lstOfProducts[4].intQuantity.
ToString();
}
}
}
}

Рис. 5. Вихідний код для файлу ProductInfo.cs


using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
namespace SampleWebPartProject.ProductInfo
{
public class ProductInfo : WebPart
{
private const string _ascxPath =
@”~/CONTROLTEMPLATES/SampleWebPartProject/ProductInfo/” +
@”ProductInfoUserControl.ascx”;
public ProductInfo()
{
}
protected override void CreateChildControls()
{
Control control = this.Page.LoadControl(_ascxPath);
Controls.Add(control);
base.CreateChildControls();
}
protected override void Render(HtmlTextWriter writer)
{
base.RenderContents(writer);
}
}
}

Рис. 6. Файл ProductInfo.webpart у форматі XML


<?xml version=”1.0″ encoding=”utf-8″?>
<webParts>
<webPart xmlns=”http://schemas.microsoft.com/WebPart/v3″>
<metaData>
<type name=”SampleWebPartProject.ProductInfo.ProductInfo,
SampleWebPartProject, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=db3a9f914308c42a” />
<importErrorMessage>
$Resources:core,ImportErrorMessage;
</importErrorMessage>
</metaData>
<data>
<properties>
<property name=”Title” type=”string”>
Product Info Web Part</property>
<property name=”Description” type=”string”>Provides some
information about hockey products.</property>
</properties>
</data>
</webPart>
</webParts>

Тепер, коли візуальна веб-частина побудована, можна розгорнути її на сервері SharePoint. При створенні проекту ви задавали його зіставлення з певним примірником сервера. Тут мається на увазі, що існує деяка програмна зв’язка, яка об’єднує тільки що написаний код з сервером SharePoint. Якщо відкрити ці файли в оглядачі рішень, можна знайти кілька файлів у форматі XML, які забезпечують цю інтеграцію. Наприклад, файл Feature.xml (див. наведений нижче код) задає визначення компонента. У коді XML видно, що цей файл пару раз посилається на інші файли у форматі XML, які також містять певну інформацію про дану веб-частини. Тут можна побачити посилання на файли Elements.xml і ProductInfo.webpart:


<?xml version=”1.0″ encoding=”utf-8″?>
<Feature xmlns=”http://schemas.microsoft.com/sharepoint/”
Id=”416172c1-cfa7-4d7a-93ba-fe093b037fab”
ImageUrl=”” Scope=”Site” Title=”SampleWebPartProject Feature1″>
  <ElementManifests>
    <ElementManifest Location=”ProductInfoElements.xml” />
    <ElementFile Location=”ProductInfoProductInfo.webpart” />
  </ElementManifests>

У файлі Elements.xml наведена інформація про включених до компонент основних збірках, а у файлі ProductInfo.webpart визначаються метадані веб-частини, наприклад заголовок та опис. На рис. 6 наведені властивості за замовчуванням Title і Description. Ці властивості можна оновити, щоб метадані веб-частини, надані в колекції веб-частин, були осмисленими і інтуїтивно зрозумілими. Для даної веб-частини вам, ймовірно, буде потрібно змінити заголовок на “Product Information Web Part” (Веб-частина інформації про продукт), а опис на “Web Part that provides calculated product pricing and information” (Веб-частина, яка надає розраховану вартість та опис продукту).



Рис. 7. Веб-частина на веб-сторінці


Існують і інші файли конфігурації в форматі ML, і якщо ви не маєте досвіду розробки в SharePoint, я рекомендую вам ознайомитися з кожним з таких файлів в проекті, щоб краще зрозуміти їх призначення. Тепер давайте перейдемо до розгортання веб-частини на сервері SharePoint.


Розгортання проекту візуальної веб-частини


До SharePoint 2010 для розгортання додатків в SharePoint зазвичай використовувалося засіб адміністрування на базі командного рядка – Stsadm. Але необхідність в цьому засобі відпала з виходом Visual Studio 2010 (і з появою Window PowerShell, однак це тема для окремої статті). Оскільки проект вже має зв’язок з сервером SharePoint, а зіставлення має заданий рівень довіри, необхідно просто клацнути проект правою кнопкою миші і вибрати пункт “Build” (Побудувати), переконатися в побудові проекту, а потім клацнути правою кнопкою і вибрати пункт “Deploy” (Розгорнути). Звичайно, при налагодженні рішень SharePoint можна використовувати клавішу F5. При цьому в процесі відладки стають можливими такі дії, як приєднання до відповідного процесу і скидання IIS.


Після успішного розгортання веб-частини необхідно відкрити сайт SharePoint і створити нову сторінку веб-частини. При натисканні клавіші F5 для налагодження додатка за замовчуванням викликається сторінка створення веб-частини. В іншому випадку виберіть “View All Site Content” (Проглянути весь контент сайту), а потім “Create” (Створити). Клацніть параметр “Web Part Page” (Сторінка веб-частини) і вкажіть необхідні відомості про дану конкретній сторінці веб-частини. Наприклад, вкажіть ім’я та шаблон макета сторінки. Після введення цих відомостей натисніть кнопку “Create” (Створити), і SharePoint створить сторінку веб-частини.


Тепер необхідно додати візуальну веб-частина, яка була створена і розгорнута на сервері. Для цього перейдіть на сторінку веб-частини, виберіть “Site Actions” (Дії сайту), а потім “Edit Page” (Змінити сторінку). Клацніть зону веб-частин, в яку хочете помістити візуальну веб-частину, виберіть вкладку “Insert” (Вставка) і клацніть елемент “Web Part” (Веб-частина).


Після цього SharePoint надає кілька категорій веб-частин, які можна переглянути для того, щоб вибрати певну веб-частину для додавання в обрану на сторінці зону веб-частин. Перейдіть до категорії “Custom” (Настроювані) і потім до панелі “Web Parts” (Веб-частини), щоб побачити створену і розгорнуту веб-частину. Якщо ви використовували наведений у статті код, клацніть веб-частину ProductInfo і натисніть кнопку “Add” (Додати).


Дана веб-частина додається в зону веб-частин на сторінці веб-частини, зображену на рис. 7. На даному етапі можна налаштувати параметри веб-частини за допомогою панелі “Tools” (Інструменти) чи просто прийняти параметри за замовчуванням і клацнути “Stop Editing” (Завершити редагування).


Участь у розробці SharePoint


Для розробників в середовищі SharePoint система Visual Studio 2010 надає не тільки комплект вбудованих засобів, але і приголомшливу можливість брати участь у розробці SharePoint. Я пропоную вам спробувати ці кошти в роботі. Крім того, доступні чудові функції для розробників, які воліють повністю контролювати код, а також для тих, кому подобається використовувати можливості проектування для побудови і розгортання відмінних рішень у SharePoint.

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


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

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

Ваш отзыв

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

*

*