Используйте Web Money - это очень удобно

четверг, 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
При попытке это сделать выдается ошибка - нужно создать базу данных содержимого - в центре администрирования, управление приложениями, базы данных содержимого.
Это происходит по причине прямого копирования семейства узлов - включая уникальные идентификаторы в базе данных.

пятница, 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;
}
}
Проблема состоит в следующем т.к. изначально ( и в процессе работы значение поля может быть нулевым необходимо организовать заполнение поля по постбеку и после чтения значения поля.

Поле - деревянный список для списка 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;
}
}
Хорошая ссылка по теме чел делает связанные дропдаунлисты
Пример кода и готовый солюшн

среда, 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 - ид дерева).
С удовольствием отвечу на комментарии.

среда, 9 января 2008 г.

Поле - деревянный список для списка Shrepoint из списка.

Здравствуйте!
По работе встала задача реализовать деревянный список для заполнения поля в списке Sharepoint.
Решил реализовать следующим образом:
Источник:
1. Лист Sharepoint с полем подстановки из этого же листа (ParentId)
Приемник:
1. Создаем свое поле: две колонки в одной храним имена в другом значения ИД из списка источника. Отображаем только первую колонку.
2. У поля должны быть свойства в которых указаны: список источник, поле с именами и поле ParentId.
3. У поля должен быть собственный контрол редактирования treeView и скриптом обработки логики ващего дерева(при необходимости).
По возможности в дальнейшем опишу реализацию.