Вот так ма получаем переменную:
SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.UtcNow)
четверг, 28 февраля 2008 г.
Кастомизация поиска.
Мой источник для начала.
Все оказалось довольно просто.
1. Создаем столбец в списке по которому назначаем индексирование.
после индексирования в настройках поиска в общих службах
Создаем свойство обхода содержимого на основании этого столбца.(Обязательно из группы sharepoint)
Еще раз индексируем.
Создаем страницу поиска и страницу результатов на которых размещаем соответсвующие вебчасти. Веб части: AdvancedSearch и основные результаты поиска+ по желанию обрамление.
Далее модифицируем схему вебчастей поиска изменяем Свойства (схема дополнительных параметров) и указываем свою страницу результатов.
Получается

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

В результате имеем произвольно настраиваемую параметризированную форму поиска.
И также произвольно настраиваемую страницу результатов.
Все оказалось довольно просто.
1. Создаем столбец в списке по которому назначаем индексирование.
после индексирования в настройках поиска в общих службах
Создаем свойство обхода содержимого на основании этого столбца.(Обязательно из группы sharepoint)
Еще раз индексируем.
Создаем страницу поиска и страницу результатов на которых размещаем соответсвующие вебчасти. Веб части: AdvancedSearch и основные результаты поиска+ по желанию обрамление.
Далее модифицируем схему вебчастей поиска изменяем Свойства (схема дополнительных параметров) и указываем свою страницу результатов.
Получается
Далее модифицируем схему результатов как это делается написано в источнике.
Кроме того меняем выбранные столбцы добавляя туда свое свойство.
Получается
В результате имеем произвольно настраиваемую параметризированную форму поиска.
И также произвольно настраиваемую страницу результатов.
Ярлыки:
поиск,
Sharepoint
четверг, 14 февраля 2008 г.
вторник, 12 февраля 2008 г.
Custom field - отрисовка HTML
Думаю многим приходилось создавать свои поля, особый интерес представляет в этом процессе формирование HTML отрисовки значения поля в xml схеме его определения.
используя тег CDATA мы можем нарисовать любое окружение вокруг информации в нашем поле.
Например можно создать поле из нескольких колонок.
Используя различную HTML разметку и информацию из колонок можно создать интересный пользовательский интерфейс: свои меню, кнопки, радио, чекбоксы, подсказки и т.п.
Как результат можно обогатить интерфейс пользователя при работе со списками и отображении информации - подсветку строк, ячеек, и т.п.
Совместив этот механизм с веб частями и скриптами на мастер странице можно преобразить интерфейс пользователя до неузнаваемости очень скромным объемом кода.
используя тег CDATA мы можем нарисовать любое окружение вокруг информации в нашем поле.
Например можно создать поле из нескольких колонок.
Используя различную HTML разметку и информацию из колонок можно создать интересный пользовательский интерфейс: свои меню, кнопки, радио, чекбоксы, подсказки и т.п.
Как результат можно обогатить интерфейс пользователя при работе со списками и отображении информации - подсветку строк, ячеек, и т.п.
Совместив этот механизм с веб частями и скриптами на мастер странице можно преобразить интерфейс пользователя до неузнаваемости очень скромным объемом кода.
Ярлыки:
Кастомизация,
Sharepoint
Изменение перечня столбцов в ListViewWebPart "на лету".
Доброго времени суток!
Итак передо мно возникла проблема: отображать различную информацию на одной странице веб частей в зависимости от пользователя, параметра или состояния процесса(проекта) информация о котором отображается.
Задача возникла из необходимости придерживаться одного интерфейса для редактирования и просмотра элементов списка (редактирование косвенное через мой интерфейс). Причем со всеми возможностями Sharepoint.
Итак имеем: список, набор полей которые отображаются всегда, + поле редактирование(мое кастомизированное поле) + набор столбцов - соответствующих пользователям.
Каждый пользователь должен видеть либо мой столбец, либо свой результат.
Или при передаче параметра результат другого человека.
Решение:
Создаем свою веб часть. В ней обращаемся к SPWebPartManager.
SPWebPartManager spwp = (SPWebPartManager)this.WebPartManager;
Ищем необходимую веб часть и меняем у нее listViewWebPart.ListViewXml через XmlDocument xmlDoc = new XmlDocument();
xmlDoc.InnerXml = listViewWebPart.ListViewXml
node = xmlDoc.DocumentElement;
Меняем схему - она довольно сложна поэтому я просто создал веб часть с необходимым мне представлением (со столбцом результата вместо моего кастомного поля) скопировал эту схему вместо текущей схемы.
Заменил в ней параметры:
node.Attributes[0].Value = viewName;//View Name веб части
и название поля на мое - обязательно внутренне(internalName)( для примера Название-Title)
Присвоил listViewWebPart.ListViewXml = xmlDoc.InnerXml;
Все.
Кроме того что я указал также можно написать веб часть поиска, т.к. в схеме указывается CAML запрос. Т.е. можно изменить не только перечень столбцов но и перечень элементов, группировку и т.п. смотрите xml схему.
Итак передо мно возникла проблема: отображать различную информацию на одной странице веб частей в зависимости от пользователя, параметра или состояния процесса(проекта) информация о котором отображается.
Задача возникла из необходимости придерживаться одного интерфейса для редактирования и просмотра элементов списка (редактирование косвенное через мой интерфейс). Причем со всеми возможностями Sharepoint.
Итак имеем: список, набор полей которые отображаются всегда, + поле редактирование(мое кастомизированное поле) + набор столбцов - соответствующих пользователям.
Каждый пользователь должен видеть либо мой столбец, либо свой результат.
Или при передаче параметра результат другого человека.
Решение:
Создаем свою веб часть. В ней обращаемся к SPWebPartManager.
SPWebPartManager spwp = (SPWebPartManager)this.WebPartManager;
Ищем необходимую веб часть и меняем у нее listViewWebPart.ListViewXml через XmlDocument xmlDoc = new XmlDocument();
xmlDoc.InnerXml = listViewWebPart.ListViewXml
node = xmlDoc.DocumentElement;
Меняем схему - она довольно сложна поэтому я просто создал веб часть с необходимым мне представлением (со столбцом результата вместо моего кастомного поля) скопировал эту схему вместо текущей схемы.
Заменил в ней параметры:
node.Attributes[0].Value = viewName;//View Name веб части
и название поля на мое - обязательно внутренне(internalName)( для примера Название-Title)
Присвоил listViewWebPart.ListViewXml = xmlDoc.InnerXml;
Все.
Кроме того что я указал также можно написать веб часть поиска, т.к. в схеме указывается CAML запрос. Т.е. можно изменить не только перечень столбцов но и перечень элементов, группировку и т.п. смотрите xml схему.
пятница, 1 февраля 2008 г.
Создание своей веб части представления списка. Проблемы дизайна.
У меня возникла необходимость создать свое представление списка - веб часть с расширенной функциональностью.
Главная задача - правильное отображение - дизайн(причем при смене темы должна измениться и моя вебчасть).
1. Приходится использовать таблицу т.к. заголовки при отображении это тоже таблицы
2. Приходится переопределять стили названия шрифтов - самое тонкое место пока просто поставил такие же как и в стандартной вебчасти.
Проблема в том, что для моя кастомная вебчасть обрамляется div с указанием класса - ms-WPBody - который и меняет шрифты (для стандартной вебчасти этот div пустой).
Желательно конечно получать перечень шрифтов динамически, что бы они правильно изменялись.
Главная задача - правильное отображение - дизайн(причем при смене темы должна измениться и моя вебчасть).
1. Приходится использовать таблицу т.к. заголовки при отображении это тоже таблицы
2. Приходится переопределять стили названия шрифтов - самое тонкое место пока просто поставил такие же как и в стандартной вебчасти.
Проблема в том, что для моя кастомная вебчасть обрамляется div с указанием класса - ms-WPBody - который и меняет шрифты (для стандартной вебчасти этот div пустой).
Желательно конечно получать перечень шрифтов динамически, что бы они правильно изменялись.
четверг, 31 января 2008 г.
Копирование семейства узлов через backup/restore.
Думаю каждый сталкивался с необходимостью перенести семейство узлов из одного приложения в другое или даже на другой сервер.
Я делаю это так:
Простой backup (можно написать простой командный файл и запускать его по расписанию с помощью Scheduled Tasks):
Stsadm -o backup -url http://server:port/SITES/name/ -filename name.bak -overwrite
Stsadm -o restore -url http://server:port/SITES/name/ -filename name.bak -overwrite
Перенос на другой сервер возможен при условии, что версия сервера (sharepoint) не ниже чем у исходного:
Stsadm -o restore -url http://server2:port/SITES/name/ -filename name.bak -overwrite
А вот теперь более интересное:
Хочу размножить семейство узлов у себя на сервере...
Stsadm -o restore -url http://server:port/SITES/name2/ -filename name.bak -overwrite
При попытке это сделать выдается ошибка - нужно создать базу данных содержимого - в центре администрирования, управление приложениями, базы данных содержимого.
Это происходит по причине прямого копирования семейства узлов - включая уникальные идентификаторы в базе данных.
Я делаю это так:
Простой backup (можно написать простой командный файл и запускать его по расписанию с помощью Scheduled Tasks):
Stsadm -o backup -url http://server:port/SITES/name/ -filename name.bak -overwrite
Stsadm -o restore -url http://server:port/SITES/name/ -filename name.bak -overwrite
Перенос на другой сервер возможен при условии, что версия сервера (sharepoint) не ниже чем у исходного:
Stsadm -o restore -url http://server2:port/SITES/name/ -filename name.bak -overwrite
А вот теперь более интересное:
Хочу размножить семейство узлов у себя на сервере...
Stsadm -o restore -url http://server:port/SITES/name2/ -filename name.bak -overwrite
При попытке это сделать выдается ошибка - нужно создать базу данных содержимого - в центре администрирования, управление приложениями, базы данных содержимого.
Это происходит по причине прямого копирования семейства узлов - включая уникальные идентификаторы в базе данных.
Ярлыки:
Администрирование,
Sharepoint
пятница, 18 января 2008 г.
Наследование : BaseFieldControl - проблема с чтением Value.
Итак имеем следующий код:
public override object Value
{
get
{
EnsureChildControls();
SPFieldValue fieldValue = new SPFieldValue();
count = 0;
_names = "";
_SelectedNodeID = "";
SetValues();
fieldValue.Names = _names;
fieldValue.Index = _SelectedNodeID;
return fieldValue;
}
set
{
EnsureChildControls();
SPFieldValue fieldValue = (SPFieldValue)value;
_names = fieldValue.Names;
_SelectedNodeID = fieldValue.Index;
}
}
Проблема состоит в следующем т.к. изначально ( и в процессе работы значение поля может быть нулевым необходимо организовать заполнение поля по постбеку и после чтения значения поля.
public override object Value
{
get
{
EnsureChildControls();
SPFieldValue fieldValue = new SPFieldValue();
count = 0;
_names = "";
_SelectedNodeID = "";
SetValues();
fieldValue.Names = _names;
fieldValue.Index = _SelectedNodeID;
return fieldValue;
}
set
{
EnsureChildControls();
SPFieldValue fieldValue = (SPFieldValue)value;
_names = fieldValue.Names;
_SelectedNodeID = fieldValue.Index;
}
}
Проблема состоит в следующем т.к. изначально ( и в процессе работы значение поля может быть нулевым необходимо организовать заполнение поля по постбеку и после чтения значения поля.
Поле - деревянный список для списка Shrepoint из списка. Продолжение 2.
Доброго времени суток!
Довел работу до логического завершения.
Добавил редактор поля:
Добавляем в определение поля (fldtypes_TreeField.xml)
^Field Name="FieldEditorUserControl"^ /_controltemplates/ControlTemplates_TreeFieldFieldEditorControl.ascx^/Field^
+ в свойства PropertySchema добавляем Hidden="TRUE" - что бы отображался только мой контрол.
Далее создаем
public class TreeFieldEditor : UserControl, IFieldEditor
и переопределяем методы
public bool DisplayAsNewSection
{
get { return false; }
}
public void InitializeWithField(Microsoft.SharePoint.SPField field)
{
}
public void OnSaveChange(Microsoft.SharePoint.SPField field, bool isNewField)
{
}
и
protected override void CreateChildControls()
{
base.CreateChildControls();
TreeFieldTargetList.SelectedIndexChanged += new EventHandler(TreeFieldTargetList_SelectedIndexChanged);
if (!this.Page.IsPostBack)
{
FillDDL(); //- заполняем dropDownLists
}
и контрол
Control Language="C#" Inherits="TreeField.TreeFieldEditor, TreeField, Version=1.0.0.0, Culture=neutral, PublicKeyToken=!!!" AutoEventWireup="false" compilationMode="Always"
Переделал из LookUp контрола.
Откопал полезный вариант свойств поля: - удобно обращаться напрямую.
public SPTreeFieldField(SPFieldCollection fields, string fieldName)
: base(fields, fieldName)
{
this.Init();
}
public SPTreeFieldField(SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName)
{
this.Init();
}
private void Init()
{
this.ListName = this.GetCustomProperty("ListName") + "";
}
public override void Update()
{
this.SetCustomProperty("ListName", this.ListName);
base.Update();
}
private string listName;
public string ListName
{
get
{
return this.listName;
}
set
{
this.listName = value;
}
}
Хорошая ссылка по теме чел делает связанные дропдаунлисты
Пример кода и готовый солюшн
Довел работу до логического завершения.
Добавил редактор поля:
Добавляем в определение поля (fldtypes_TreeField.xml)
^Field Name="FieldEditorUserControl"^ /_controltemplates/ControlTemplates_TreeFieldFieldEditorControl.ascx^/Field^
+ в свойства PropertySchema добавляем Hidden="TRUE" - что бы отображался только мой контрол.
Далее создаем
public class TreeFieldEditor : UserControl, IFieldEditor
и переопределяем методы
public bool DisplayAsNewSection
{
get { return false; }
}
public void InitializeWithField(Microsoft.SharePoint.SPField field)
{
}
public void OnSaveChange(Microsoft.SharePoint.SPField field, bool isNewField)
{
}
и
protected override void CreateChildControls()
{
base.CreateChildControls();
TreeFieldTargetList.SelectedIndexChanged += new EventHandler(TreeFieldTargetList_SelectedIndexChanged);
if (!this.Page.IsPostBack)
{
FillDDL(); //- заполняем dropDownLists
}
и контрол
Control Language="C#" Inherits="TreeField.TreeFieldEditor, TreeField, Version=1.0.0.0, Culture=neutral, PublicKeyToken=!!!" AutoEventWireup="false" compilationMode="Always"
Переделал из LookUp контрола.
Откопал полезный вариант свойств поля: - удобно обращаться напрямую.
public SPTreeFieldField(SPFieldCollection fields, string fieldName)
: base(fields, fieldName)
{
this.Init();
}
public SPTreeFieldField(SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName)
{
this.Init();
}
private void Init()
{
this.ListName = this.GetCustomProperty("ListName") + "";
}
public override void Update()
{
this.SetCustomProperty("ListName", this.ListName);
base.Update();
}
private string listName;
public string ListName
{
get
{
return this.listName;
}
set
{
this.listName = value;
}
}
Хорошая ссылка по теме чел делает связанные дропдаунлисты
Пример кода и готовый солюшн
среда, 16 января 2008 г.
Поле - деревянный список для списка Shrepoint из списка. продолжение.
Пришлось довольно много помучиться, да и другой работы было много.
Итак:
1.Создаем свое поле:
две колонки в одной храним имена в другом значения ИД из списка источника. Отображаем только первую колонку.
как сделать:Блог Сергея Шаповалова
Что добавить:
берем из ascx дерево
TreeView1 = (TreeView)TemplateContainer.FindControl("TreeView1");
берем параметры:
_listTreeView = Field.GetCustomProperty("ListName").ToString();
_nodeNameField = Field.GetCustomProperty("FieldName").ToString();
_parentIdField = Field.GetCustomProperty("FieldParentID").ToString();
Работа с полем:
public override object Value
{
get
{
EnsureChildControls();
SPFieldTreeFieldValue fieldValue = new SPFieldTreeFieldValue();
count = 0;
_names = "";
_text = "";
parent = TreeView1.Nodes[0];
ReturnCheckedNames(parent);
fieldValue.Names = _names;
fieldValue.Index = _text;
return fieldValue;
}
set
{
EnsureChildControls();
SPFieldTreeFieldValue fieldValue = (SPFieldTreeFieldValue)value;
ValueBox.Text = fieldValue.Names;
_text = fieldValue.Index;
try
{
FillTreeView();
}
catch { }
}
}
FillTreeView() - заполнение контрола TreeView.
(Моя реализация великовата для этого блога, но думаю что особых проблем с этим быть не должно.)
- определяем заполнение поля
(ReturnCheckedNames(parent); - то как вы запишите выделенные элементы в строку.
использую глобальные переменные т.к. в своем методе использую рекурсию для перебора ChildNodes)
Names - вместо prefix:
2.У поля должны быть свойства в которых указаны: список источник, поле с именами и поле ParentId.
fldtypes_TreeField.xml
^propertyschema^
^fields^
^field name="ListName" displayname="ListName" displaysize="20" type="Text"^
^/field^
^field name="FieldName" displayname="FieldName" displaysize="20" type="Text"^
^/field^
^field name="FieldParentID" displayname="FieldParentID" displaysize="20" type="Text"^
^/field^
^/fields^
^/propertyschema^
Отображаем только первую колонку:
^renderpattern name="DisplayPattern"^
^switch^
^expr^
^column/^
^/expr^
^case value=""^
^/case^
^default^
^column subcolumnnumber="0" htmlencode="TRUE"^
^/default^
^/switch^
^/renderpattern^
3.У поля должен быть собственный контрол редактирования treeView и скриптом обработки логики вашего дерева(при необходимости).
ControlTemplates_TreeFieldFieldControl.ascx
Добавляем.
^asp:treeview id="TreeView1" runat="server"^^/asp:treeview^
P.S. при использовании скриптов для реализации "активных" checkBox'ов в дереве приходится использовать ид элементов он формируется следующим образом:
prefix+"TreeView1n"+(i)+"CheckBox"
prefix - сгенерированный sharepoint ключ добавляемый к иду вашего контрола
Для получения:
var prefix
1. Создать функцию на onLoad одного из элементов ascx вашего поля.
В функцию в качестве параметра нужно передавать this.
Потом брать его ид и отрезать конец - известный вам ид элемента, ну и записывать его в глобальную переменную prefix.
i - порядковый номер сквозной сверху в низ ноды дерева. Т.Е. для рутовой ноды это 0, для первого child это 1 для первого child.child это 2 и т.д. Поэтому в скрипте (да и в коде) имеет смысл работать со сквозной нумерацией, после первого заполнения дерева (а не с шарепоинтовскими идами).
"TreeView1n"+(i)+"CheckBox" - формирует ид checkBox в дереве(TreeView1 - ид дерева).
С удовольствием отвечу на комментарии.
Итак:
1.Создаем свое поле:
две колонки в одной храним имена в другом значения ИД из списка источника. Отображаем только первую колонку.
как сделать:Блог Сергея Шаповалова
Что добавить:
берем из ascx дерево
TreeView1 = (TreeView)TemplateContainer.FindControl("TreeView1");
берем параметры:
_listTreeView = Field.GetCustomProperty("ListName").ToString();
_nodeNameField = Field.GetCustomProperty("FieldName").ToString();
_parentIdField = Field.GetCustomProperty("FieldParentID").ToString();
Работа с полем:
public override object Value
{
get
{
EnsureChildControls();
SPFieldTreeFieldValue fieldValue = new SPFieldTreeFieldValue();
count = 0;
_names = "";
_text = "";
parent = TreeView1.Nodes[0];
ReturnCheckedNames(parent);
fieldValue.Names = _names;
fieldValue.Index = _text;
return fieldValue;
}
set
{
EnsureChildControls();
SPFieldTreeFieldValue fieldValue = (SPFieldTreeFieldValue)value;
ValueBox.Text = fieldValue.Names;
_text = fieldValue.Index;
try
{
FillTreeView();
}
catch { }
}
}
FillTreeView() - заполнение контрола TreeView.
(Моя реализация великовата для этого блога, но думаю что особых проблем с этим быть не должно.)
- определяем заполнение поля
(ReturnCheckedNames(parent); - то как вы запишите выделенные элементы в строку.
использую глобальные переменные т.к. в своем методе использую рекурсию для перебора ChildNodes)
Names - вместо prefix:
2.У поля должны быть свойства в которых указаны: список источник, поле с именами и поле ParentId.
fldtypes_TreeField.xml
^propertyschema^
^fields^
^field name="ListName" displayname="ListName" displaysize="20" type="Text"^
^/field^
^field name="FieldName" displayname="FieldName" displaysize="20" type="Text"^
^/field^
^field name="FieldParentID" displayname="FieldParentID" displaysize="20" type="Text"^
^/field^
^/fields^
^/propertyschema^
Отображаем только первую колонку:
^renderpattern name="DisplayPattern"^
^switch^
^expr^
^column/^
^/expr^
^case value=""^
^/case^
^default^
^column subcolumnnumber="0" htmlencode="TRUE"^
^/default^
^/switch^
^/renderpattern^
3.У поля должен быть собственный контрол редактирования treeView и скриптом обработки логики вашего дерева(при необходимости).
ControlTemplates_TreeFieldFieldControl.ascx
Добавляем.
^asp:treeview id="TreeView1" runat="server"^^/asp:treeview^
P.S. при использовании скриптов для реализации "активных" checkBox'ов в дереве приходится использовать ид элементов он формируется следующим образом:
prefix+"TreeView1n"+(i)+"CheckBox"
prefix - сгенерированный sharepoint ключ добавляемый к иду вашего контрола
Для получения:
var prefix
1. Создать функцию на onLoad одного из элементов ascx вашего поля.
В функцию в качестве параметра нужно передавать this.
Потом брать его ид и отрезать конец - известный вам ид элемента, ну и записывать его в глобальную переменную prefix.
i - порядковый номер сквозной сверху в низ ноды дерева. Т.Е. для рутовой ноды это 0, для первого child это 1 для первого child.child это 2 и т.д. Поэтому в скрипте (да и в коде) имеет смысл работать со сквозной нумерацией, после первого заполнения дерева (а не с шарепоинтовскими идами).
"TreeView1n"+(i)+"CheckBox" - формирует ид checkBox в дереве(TreeView1 - ид дерева).
С удовольствием отвечу на комментарии.
Ярлыки:
Кастомизация,
Sharepoint
Подписаться на:
Сообщения (Atom)