MOSS: Функцыянальныя Прыклад - карыстацкі тып дадзеных

Бізнес-сцэнар:

У маштабах усяго прадпрыемства рэалізацыя Мос для вытворчай кампаніі з 30+ сайтаў і некалькі дзясяткаў карпаратыўных аддзелаў.

Бізнес-мэты:

Нягледзячы на ​​мноства бізнес-груп (ведамстваў, месцаў, і г.д.), некаторыя дадзеныя павінны быць захаваны на глабальным узроўні. Напрыклад, майстар аўтарытэтны спіс усіх фізічных офісах кампаніі (e.g. вытворчае абсталяванне, складскіх месцаў, офісаў продажаў) павінна быць захавана ў цэнтры горада.

Тэхнічная праблема:

Прадпрыемства таксанаміі быў рэалізаваны з дапамогай некалькіх сямействаў сайтаў. Нам бы хацелася, каб стварыць аўтарытэтны спіс фізічных месцах у спісе карыстацкіх WSS. Затым, Калі мы павінны былі мець слупок ў тыпе кантэнту (або слупок дадаецца ў спіс або бібліятэку Doc) , Якія ўтрымлівалі карпаратыўных месцах, we would create a column using the "lookup" тыпам дадзеных і паказваць на гэта асноўны спіс.

На жаль, lookup datatypes must access a source list "locally" гэта азначае, што наш аўтарытэтны спіс не можа распаўсюджвацца на сайт калекцый.

Тэхнічнае рашэнне:

Рэалізацыя новага карыстацкага тыпу дадзеных ажыццяўляецца на аснове SPField і прадстаўлены ў выглядзе DropDownList ў карыстацкім інтэрфейсе якога ListItems запаўненне з спісу WSS майстры.

Мы стварылі новы сайт пад назвай калекцыі "http://localhost/EnterpriseData". Там, we created a custom list named "Corporate Locations". This list just uses the standard "Title" поле, якое змяшчае спіс фактычных карпаратыўных месцах.

Адзін наступным некалькіх паслядоўных крокаў, каб стварыць карыстацкі тып дадзеных у WSS. Гэта:

  1. Вызначце клас, які атрымліваецца ў спадчыну ад SPField (можна успадкаваць ад іншых палёў пры неабходнасці).

Вось код для гэтага:

грамадскасць клас XYZZYCorporateLocationField : SPFieldText
{
грамадскасць XYZZYCorporateLocationField
(SPFieldCollection палёў, радок typeName, радок displayName)
: база(палёў, typeName, displayName) { }

грамадскасць XYZZYCorporateLocationField
(SPFieldCollection палёў, радок displayName)
: база(палёў, displayName) { }

грамадскасць адмяняць BaseFieldControl FieldRenderingControl
{
атрымліваць
{
BaseFieldControl control = новы XYZZYCorporateLocationFieldControl();
control.FieldName = гэта.Ўнутранае імя;
вяртанне control;
} //атрымліваць
} // fieldrenderingcontrol

грамадскасць адмяняць радок GetValidatedString(аб'ект значэнне)
{
калі (гэта.Required || value.ToString().Роўна(Радок.Пусты))
{
кідаць новы SPFieldValidationException ("Department is not assigned.");
}
вяртанне база.GetValidatedString(значэнне);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Вызначыце іншы клас, які атрымлівае ў спадчыну ад кіраўніка поля базы, як у:

грамадскасць клас XYZZYCorporateLocationFieldControl : BaseFieldControl
{
абаронены DropDownList XYZZYCorporateLocationSelector;

абаронены адмяняць радок DefaultTemplateName
{
атрымліваць
{
вяртанне "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

грамадскасць адмяняць аб'ект Значэнне
{
атрымліваць
{
EnsureChildControls();
вяртанне гэта.XYZZYCorporateLocationSelector.SelectedValue;
} // атрымліваць
набор
{
EnsureChildControls();
гэта.XYZZYCorporateLocationSelector.SelectedValue = (радок)гэта.ItemFieldValue;
} // набор
} // override object Value

абаронены адмяняць ануляваць CreateChildControls()
{

калі (гэта.Field == нулявы || гэта.ControlMode == SPControlMode.Адлюстроўваць)
вяртанне;

база.CreateChildControls();

гэта.XYZZYCorporateLocationSelector =
(DropDownList)TemplateContainer.FindControl("XYZZYCorporateLocationSelector");

калі (гэта.XYZZYCorporateLocationSelector == нулявы)
кідаць новы Выключэнне("ERROR: Cannot load .ASCX file!");

калі (!гэта.Page.IsPostBack)
{

выкарыстанне (SPSite site = новы SPSite("http://лакальны / enterprisedata"))
{
выкарыстанне (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists["Corporate Locations"];

Еогеасп (Пляваць XYZZYCorporateLocation ў currentList.Items)
{
калі (XYZZYCorporateLocation["Title"] == нулявы) працягваць;

радок theTitle;
theTitle = XYZZYCorporateLocation["Title"].ToString();

гэта.XYZZYCorporateLocationSelector.Items.Add
(новы ListItem(theTitle, theTitle));

} // Еогеасп

} // using spweb web = site.openweb()
} // using spsite site = new spsite("http://localhost/enterprisedata")

} // if not a postback

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Прыведзены вышэй код у асноўным рэалізуе логіку для запаўнення DropDownList значэннямі з карыстацкага спісу WSS размешчаны на http://localhost/enterprisedata and named "Corporate Departments".

Я вызначыў абодвух класаў у адным. Выява CS, скампіляваў яго і паклаў яго ў GAC (моцная неабходных, вядома).

  1. Рэалізацыя пра шаблон элемента кіравання (.ASCX) як паказана на малюнку:

<%@ Кіраванне Мова="C#" Спадчыну="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Version = 12.0.0.0, культура = нейтральнай,PublicKeyToken = 71e9bce111e9429c" CompilationMode="Always" %>
<%
@ Рэестр TagPrefix="wssawc" Прастора імёнаў="Microsoft.SharePoint.WebControls" Зборка="Microsoft.SharePoint, Version = 12.0.0.0, Культура = нейтральнай, PublicKeyToken = 71e9bce111e9429c" %> <%@ Рэестр TagPrefix="SharePoint" Прастора імёнаў="Microsoft.SharePoint.WebControls" Зборка="Microsoft.SharePoint, Version = 12.0.0.0, Культура = нейтральнай, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:Шаблон візуалізацыі ID="XYZZYCorporateLocationFieldControl" runat="server">
<Шаблон>
<аспід:DropDownList ID="XYZZYCorporateLocationSelector" runat="server" />
</Шаблон>
</
SharePoint:Шаблон візуалізацыі>

Вышэй захоўваецца ў C:\Program Files Common Files Microsoft Shared пашырэньні вэб-сервера 12 ControlTemplates.

  1. У рэшце рэшт, мы ствараем XML-файла для захавання ў ..... 12 каталога XML. Гэта CAML, які вызначае нашу карыстацкі тып дадзеных і для майго прыкладу, выглядае наступным чынам:

<?XML версія="1.0" кадаваньне="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Поле Імя="TypeName">CorporateLocations</Поле>
<
Поле Імя="ParentType">Тэкст</Поле>
<
Поле Імя="TypeDisplayName">Corporate Locations</Поле>
<
Поле Імя="TypeShortDescription">All XYZZY Corporate locations including manufacturing or other facilities.</Поле>
<
Поле Імя="UserCreatable">TRUE,</Поле>
<
Поле Імя="ShowInListCreate">TRUE,</Поле>
<
Поле Імя="ShowInDocumentLibraryCreate">TRUE,</Поле>
<
Поле Імя="ShowInSurveyCreate">TRUE,</Поле>
<
Поле Імя="ShowInColumnTemplateCreate">TRUE,</Поле>
<
Поле Імя="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Version = 1.0.0.0, Культура = нейтральнай, PublicKeyToken=b0b19e85410990c4</Поле>
<
RenderPattern Імя="DisplayPattern">
<
Пераключэнне>
<
Expr>
<
Калонка />
</
Expr>

<Выпадак Значэнне=""/>

<Змаўчанне>
<
HTML>
<![CDATA[
<span style="color:Red"><B>]]>
</
HTML>

<
Калонка SubcolumnNumber="0" HTMLEncode="TRUE,"/>

<HTML><![CDATA[</B></пралёт>]]></HTML>

</
Змаўчанне>
</
Пераключэнне>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
This XML file adds the custom data type to the WSS "library" і адпавядае яго супраць GAC'd зборкі.

Пасля пераезду ўсе гэтыя біты на месца, Iisreset на серверы і ўсё павінна пачаць працаваць прыгожа.

3 думкі пра «MOSS: Функцыянальныя Прыклад - карыстацкі тып дадзеных

  1. Аляксандр
    Прывітанне Павел,
    У першую чаргу, дзякуй за артыкул, , Таму што гэта вельмі цікава. Толькі адно пытанне;
    Вы ведаеце, калі гэта Магчымае карэктнага адлюстравання карыстацкага тыпу поля ў рэжыме табліцы спісу?
    Таму што кожны тып наладжвальнага поля я ствараю гэта паказана толькі для чытання ў рэжыме табліцы (і MSDN, напрыклад, не мне вельмі дапамагае :-S).
    Дзякуй
  2. Lyndsay

    I am attempting to implement your solution. However I instead of DropDownList, I only have the option for a DropDownChoiceList. Do you happen to know how to add items to a DropDownChoiceList? Мы выкарыстоўваем SharePoint 2007 SP1 і Visual Studio 2005 SP1.

Пакінуць каментар

Ваш электронны адрас не будзе апублікаваны. Абавязковыя палі пазначаныя * *