خزه: به عنوان مثال تابعی - نوع داده های سفارشی

سناریوی کسب و کار:

اجرای سرمایه گذاری گسترده ای از خزه برای تولید شرکت با 30+ سایت و چند ده بخش های شرکت.

هدف کسب و کار:

با وجود بسیاری از گروه های کسب و کار (گروه ها, مکان, غیره), داده های خاص باید در سطح جهانی حفظ. مثلا, لیست کارشناسی ارشد معتبر از تمام مکان های فیزیکی شرکت (e.g. امکانات تولید, مکان های انبار, دفاتر فروش) باید در یک محل مرکزی نگهداری.

مشکل فنی:

طبقه بندی سازمانی با استفاده از مجموعه سایت های مختلف اجرا شد. ما می خواهیم دوست دارم برای ایجاد لیست معتبر از مکان های فیزیکی در یک لیست WSS سفارشی. سپس, زمانی که ما نیاز به یک ستون در یک نوع محتوا (و یا یک ستون به یک لیست یا کتابخانه توضیحات اضافه:) که محل شرکت موجود, 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 = این.InternalName;
برگشت 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://localhost را / enterprisedata"))
{
با استفاده از (SPWeb web = site.OpenWeb())
{

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

حلقه foreach (SPItem XYZZYCorporateLocation به currentList.Items)
{
اگر (XYZZYCorporateLocation["Title"] == صفر) ادامه;

رشته theTitle;
theTitle = XYZZYCorporateLocation["Title"].ToString();

این.XYZZYCorporateLocationSelector.Items.Add
(جدید ListItem می(theTitle, theTitle));

} // حلقه foreach

} // 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 یا vb تک تعریف, وارد و آن را در GAC قرار داده است (قوی لازم, البته).

  1. پیاده سازی یک قالب کنترل (.ASCX) به عنوان نشان داده شده است:

<%@ کنترل زبان="C#" به ارث می برد="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,نسخه = 12.0.0.0، فرهنگ = خنثی,PublicKeyToken = 71e9bce111e9429c" compilationMode="Always" %>
<%
@ ثبات Tagprefix="wssawc" فضای نام="Microsoft.SharePoint.WebControls" مجلس="Microsoft.SharePoint, نسخه = 12.0.0.0, فرهنگ = بی طرف, PublicKeyToken = 71e9bce111e9429c" %> <%@ ثبات Tagprefix="SharePoint" فضای نام="Microsoft.SharePoint.WebControls" مجلس="Microsoft.SharePoint, نسخه = 12.0.0.0, فرهنگ = بی طرف, PublicKeyToken = 71e9bce111e9429c" %>
<شیرپوینت:RenderingTemplate شناسایی="XYZZYCorporateLocationFieldControl" runat="server">
<قالب>
<افعی:DropDownList را شناسایی="XYZZYCorporateLocationSelector" runat="server" />
</قالب>
</
شیرپوینت:RenderingTemplate>

بالا به ج نجات داد:\فایل برنامه فایل های مشترک MICROSOFT مشترک الحاقات وب سرور 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, نسخه = 1.0.0.0, فرهنگ = بی طرف, PublicKeyToken=b0b19e85410990c4</رشته>
<
RenderPattern نام="DisplayPattern">
<
تعویض>
<
اصطلاح>
<
ستون />
</
اصطلاح>

<مورد ارزش=""/>

<قصور>
<
HTML>
<![CDATA[
<span style="color:Red"><ب>]]>
</
HTML>

<
ستون SubColumnNumber="0" HTMLEncode="TRUE"/>

<HTML><![CDATA[</ب></محدوده>]]></HTML>

</
قصور>
</
تعویض>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
This XML file adds the custom data type to the WSS "library" و آن را منطبق بر علیه مجمع GAC'd.

پس از حرکت همه این بیت ها را به محل, iisreset بر روی سرور و همه آن را باید شروع به کار به سادگی.

3 دیدگاه در "خزه: به عنوان مثال تابعی - نوع داده های سفارشی

  1. و Alejandro
    سلام پل,
    اول از همه, با تشکر برای مقاله, دلیل آن بسیار جالب است. فقط یک سوال;
    آیا می دانید که اگر آن را عبارت درستی ارائه یک نوع رشته سفارشی در نظر DATASHEET از لیست?
    از آنجا که هر نوع زمینه سفارشی من آن را ایجاد به عنوان فقط خواندنی در DATASHEET نمایش نشان داده شده است (و 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? ما با استفاده از شیرپوینت 2007 SP1 و ویژوال استودیو 2005 SP1.

    پاسخ

پاسخ

آدرس ایمیل شما منتشر نخواهد شد. بخشهای موردنیاز علامتگذاری شدهاند *