- •1.1 Обзор состояния вопроса
- •Концепция единого информационно-коммуникационного поля
- •1.1.3 СравнениеSharePointcаналогичными системами других производителей
- •1.2 МодельAs-is
- •3.1 Выбор методологий моделирования и инструментария
- •3.2 Разработка диаграмм вариантов использования
- •3.2.1 Действующие лица
- •3.2.2 Варианты использования
- •3.2.3 Диаграмма вариантов использования
- •3.2.4 Описание вариантов использования
- •3.3 Идентификация классов анализа
- •3.3.1 Глоссарий предметной области
- •3.4 Поведение предмета разработки
- •3.5 Взаимодействие объектов и экранные формы
- •4.1 Выбор среды разработки, языка программирования и инструментальных средств разработки
- •4.2.1 Списки для хранения данных
- •4.2.2 Работа со списками
- •4.3 Компоненты предмета разработки
- •5.1 Назначение и описание компонентов программного обеспечения
- •6.2.4 Окончание работы с порталом или вход в роли другого пользователя
4.2.2 Работа со списками
Работа со списками SharePoint осуществляется четырьмя путями:
Через объектную модель SharePoint при помощи кода;
При помощи LinQ to SharePoint;
При помощи CAML запросов;
При помощи клиенткой объектной модели SharePoint, последней существует три разновидности (Silverlight client object model, JavaScript client object model, Server client object model).
Для доступа к спискам был выбран первый подход. Все вышеперечисленные способы имеют свои плюсы и минусы. Для доступа к данным списка все библиотеки, использующие первые три подхода, должны располагаться на том же компьютере, где установлен SharePoint. Клиентская объектная модель используется для доступа к данным списков с удалённого компьютера, по своей сути, она является обёрткой для WCF сервисов, идущих в стандартной поставке SharePoint и позволяющих обращаться к спискам с удалённого компьютера.
Функции для работы со списками приведены на рисунках 4.7 – 4.9.
LoadPartOfData – используется для доступа к данным списка приложений, в качестве возвращаемого параметра используется список всех найденных приложений, удовлетворяющих условию выборки.
LoadData– используется для доступа к данным списка “Телефонный справочник”, в качестве возвращаемого параметра используется список номеров телефонов.
CreatePublishingPage– используется для доступа к данным списка опросов. Функция параметров не возвращает.
public IEnumerable<DepartmentNewsItem> LoadPartOfData(SPWeb spWeb, string id, string ifPersonColumnName, string ifCompanyColumnName, string descriptionColumnName, string foldervithNewsName, string listWithDepartment, string columnwithPicture, string departmentNamecolumn, uint newsPerPage, int numberOfPage, SortBy sortType) //, string viewName, string caml, string[] columnNames, int pageIndex, int pageItemCount, params object[] inputParams)
{
string listName = SPUtility.GetLocalizedString("$Resources:cmscore,PagesListDisplayName",
"cmscore", spWeb.Language);
string expression = string.Empty;
SPQuery queryAll = new SPQuery();
SPQuery queryDepartment = new SPQuery();
SPQuery query = new SPQuery();
SPListItemCollection colection = default(SPListItemCollection);
SPList oList = spWeb.Lists[listName];
string departmentName = String.IsNullOrEmpty(id) ? string.Empty : GetDepartmentName(spWeb, listWithDepartment, id);
SPListItem fold = oList.Folders.Cast<SPListItem>().Single(fd => fd.Name.Equals(foldervithNewsName));
SPFolder folder = fold.Folder;
queryAll.Query = sortType.Equals(SortBy.Asc) ? Camlex.Query().Where(it => ((int)it[_UIVersion] >= 512)
&& (bool)it[_ifCompanyInternalName] == false && it[_departmentNamecolumnInternalName] != null).OrderBy(it => it["Created"]).ToString()
: Camlex.Query().Where(it => ((int)it[_UIVersion] >= 512)
&& (bool)it[_ifCompanyInternalName] == false && it[_departmentNamecolumnInternalName] != null).OrderBy(it => it["Created"] as Camlex.Desc).ToString();
queryAll.Folder = folder;
queryAll.RowLimit = newsPerPage;
queryDepartment.Query = sortType.Equals(SortBy.Asc) ? Camlex.Query().Where(it => ((int)it[_UIVersion] >= 512)
&& (bool)it[_ifCompanyInternalName] == false && it[_departmentNamecolumnInternalName] != null && it[_departmentNamecolumnInternalName] == (DataTypes.LookupValue)departmentName).OrderBy(it => it["Created"]).ToString()
: Camlex.Query().Where(it => ((int)it[_UIVersion] >= 512)
&& (bool)it[_ifCompanyInternalName] == false && it[_departmentNamecolumnInternalName] != null && it[_departmentNamecolumnInternalName] == (DataTypes.LookupValue)departmentName).OrderBy(it => it["Created"] as Camlex.Desc).ToString();
queryDepartment.Folder = folder;
queryDepartment.RowLimit = newsPerPage;
query = String.IsNullOrEmpty(departmentName) ? queryAll : queryDepartment;
List<string> myPagingDataCount = new List<string>();
SPListItemCollectionPosition objSPListColPos = default(SPListItemCollectionPosition);
if (numberOfPage == 0)
{
objSPListColPos =
new SPListItemCollectionPosition("Paged=TRUE&p_SortBehavior=0&p_ID=06&RootFolder=%2fPages%2fSaM%2dNews");
query.ListItemCollectionPosition = objSPListColPos;
colection = oList.GetItems(query);
} else
{
for (int i = 0; i <= numberOfPage; i++)
{
colection = oList.GetItems(query);
query.ListItemCollectionPosition = colection.ListItemCollectionPosition;
}
}
var news = colection.Cast<SPListItem>().Select(nw => new DepartmentNewsItem()
{
Created =
((System.DateTime)
(nw.Versions.GetVersionFromLabel(
string.Format("{0}.0",
nw.File.
MajorVersion))
["Created"])),
IsPersonNews =
(bool)
(nw.Versions.GetVersionFromLabel(
string.Format("{0}.0",
nw.File.
MajorVersion))
[ifPersonColumnName]),
ShortDescription =
Convert.ToString(
nw.Versions.GetVersionFromLabel(
string.Format("{0}.0",
nw.File.
MajorVersion))[
descriptionColumnName
]) ??
string.Empty,
Url =
String.Format("{0}/{1}", spWeb.Url,
nw.Url) ??
String.Empty,
PersonImageUrl =
GetImageUrl(nw.File.Author.LoginName),
DepartmentImageUrl =
GetDepartmentImageUrl(spWeb,
listWithDepartment,
nw[
departmentNamecolumn
].
ToString(),
columnwithPicture)
}
);
return sortType.Equals(SortBy.Asc) ? news.OrderBy(nw => nw.Created) : news.OrderByDescending(nw => nw.Created);
}
Рисунок 4.7 – Доступ к данным списка приложений
private List<Job> LoadData()
{
try
{
List<Job> job = new List<Job>();
SPWeb spWeb = SPContext.Current.Web; //should not be explicitly disposed in code
SPList spList = spWeb.Lists["Телефонный справочник"];
foreach (SPListItem item in spList.Items)
{
job.Add(new Job()
{
SurName = (item["LastName"] ?? string.Empty).ToString(),
Name = String.Format("{0} {1}", (item["FirstName"] ?? string.Empty).ToString(), (item["SecondName"] ?? string.Empty).ToString()),
Floor = (item["Floor"] ?? "-").ToString(),
Room = (item["Room"] ?? "-").ToString(),
Number = (item["InsidePhone"] ?? "-").ToString().Replace(' ', '-'),
});
}
return job.OrderBy(jb => jb.SurName).ToList();
}
catch (Exception ex)
{
if (ex.Message.Equals("Value cannot be null. Parameter name: source") ||
ex.Message.Equals("Object reference not set to an instance of an object."))
{
exControl.Text = "Невозможно установить соединение с источником данных";
}
else
{
exControl.Text = ex.Message;
}
return null;
}
}
Рисунок 4.8 – Доступ к данным телефонного справочника
private void CreatePublishingPage(SPWeb spWeb, string pageRelativeUrl, string pageLayoutName, string content)
{
if ((PublishingWeb.IsPublishingWeb(spWeb)))// Assign an object to the pubSite variable
{
PublishingWeb pubWeb = PublishingWeb.GetPublishingWeb(spWeb);
PageLayout currentPageLayout = FindPageLayout(spWeb, pageLayoutName);
// Check or the Page Layout could be found in the collection
// if not (== null, return because the page has to be based on
// an excisting Page Layout
if (currentPageLayout == null)
{
return;
}
PublishingPageCollection pages = pubWeb.GetPublishingPages();
PublishingPage newPage = pages.Add(pageRelativeUrl, currentPageLayout);
newPage.Description = pageRelativeUrl.Replace(".aspx", "");
newPage.Title = Regex.Split(pageRelativeUrl.Replace(".aspx", ""), "/")[Regex.Split(pageRelativeUrl.Replace(".aspx", ""), "/").Length - 1];
//Here you can set some properties like:
//newPage.IncludeInCurrentNavigation = true;
//newPage.IncludeInGlobalNavigation = true;
//add content to page
if(!String.IsNullOrEmpty(content))
{
newPage.ListItem[FieldId.PublishingPageContent] = content;
newPage.ListItem[FieldId.Description] = string.Empty;
}
// End of setting properties
SPFile publishFile = newPage.ListItem.File;
publishFile.Update();
newPage.Update();
// Check the file in (a major version)
publishFile.CheckIn("Initial", SPCheckinType.MajorCheckIn);
publishFile.Publish("Initial");
// In case of content approval, approve the file
if (pubWeb.PagesList.EnableModeration)
{
publishFile.Approve("Initial");
}
} }
Рисунок 4.9 – Доступ к данным списка опросов