काई: कार्यात्मक उदाहरण-कस्टम डेटा प्रकार

व्यापार परिदृश्य:

एंटरप्राइज़-वाइड कार्यान्वयन काई के साथ विनिर्माण कंपनी के लिए 30+ साइटों और कुछ दर्जन कॉर्पोरेट विभागों.

व्यवसाय उद्देश्य:

व्यापार समूहों की एक भीड़ के बावजूद (विभागों, स्थानों, आदि), निश्चित डेटा एक वैश्विक स्तर पर बनाए रखा जाना चाहिए. उदाहरण के लिए, कंपनी के सभी भौतिक स्थानों की एक आधिकारिक मास्टर सूची (जैसे. विनिर्माण सुविधाओं, गोदाम स्थान, बिक्री कार्यालयों) में एक केंद्रीय स्थान बनाए रखा जाना चाहिए.

तकनीकी समस्या:

एंटरप्राइज़ टेक्सॉनॉमी एकाधिक साइट संग्रह का उपयोग कर लागू किया गया था. हम भौतिक स्थानों की आधिकारिक सूची में कस्टम WSS सूची बनाने के लिए पसंद आया होगा. तब, जब हम किसी सामग्री प्रकार में कोई स्तंभ है जरूरी (या कोई स्तंभ किसी सूची या डॉक्टर लायब्रेरी पर जोड़ा गया) कि कॉर्पोरेट स्थानों समाहित, हम एक स्तंभ "लुकअप का उपयोग कर से पैदा होगा" डेटा प्रकार और इस बात के लिए मास्टर सूची.

दुर्भाग्य से, लुकअप डेटाटाइप्स "स्थानीय रूप से एक स्रोत सूची का उपयोग करना होगा" जिसका अर्थ है कि हमारे आधिकारिक सूची साइट संग्रहों का विस्तार नहीं कर सकता.

तकनीकी समाधान:

एक नई कस्टम डेटा प्रकार के आधार पर SPField कार्यान्वित किया और जिसका ListItems मास्टर WSS सूची से आबाद UI में एक DropDownList के रूप में प्रतिनिधित्व किया कार्यान्वित.

हम नामक एक नया साइट संग्रह बनाया "http://localhost/EnterpriseData". वहाँ, हम "कॉर्पोरेट स्थानों" नामक एक कस्टम सूची बनाई. यह सूची सिर्फ मानक "शीर्षक का उपयोग करता है" वास्तविक कॉर्पोरेट स्थानों की सूची शामिल करने के लिए फ़ील्ड.

एक WSS में कोई कस्टम डेटा प्रकार बनाने के लिए कई असतत कदम इस प्रकार. वे कर रहे हैं:

  1. एक वर्ग है जो से SPField संभालते परिभाषित करें (एक अन्य फ़ील्ड्स से वारिस हो सकता यदि आवश्यक).

यहाँ है कि के लिए कोड:

सार्वजनिक वर्ग XYZZYCorporateLocationField : SPFieldText
{
सार्वजनिक XYZZYCorporateLocationField
(SPFieldCollection फ़ील्ड् स, स्ट्रिंग typeName, स्ट्रिंग displayName)
: बेस(फ़ील्ड् स, typeName, displayName) { }

सार्वजनिक XYZZYCorporateLocationField
(SPFieldCollection फ़ील्ड् स, स्ट्रिंग displayName)
: बेस(फ़ील्ड् स, displayName) { }

सार्वजनिक ओवरराइड करें BaseFieldControl FieldRenderingControl
{
हो जाओ
{
BaseFieldControl नियंत्रण = नई XYZZYCorporateLocationFieldControl();
नियंत्रण। FieldName = यह.InternalName;
वापस जाएँ नियंत्रण;
} //हो जाओ
} // fieldrenderingcontrol

सार्वजनिक ओवरराइड करें स्ट्रिंग GetValidatedString(ऑब्जेक्ट मान)
{
अगर (यह.की आवश्यकता || मान। ToString().के बराबर होती है(स्ट्रिंग.खाली))
{
फेंक नई SPFieldValidationException ("विभाग सौंपा नहीं है।");
}
वापस जाएँ बेस.GetValidatedString(मान);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. आधार फ़ील्ड नियंत्रण से इनहेरीट करता एक और वर्ग को परिभाषित, के रूप में:

सार्वजनिक वर्ग XYZZYCorporateLocationFieldControl : BaseFieldControl
{
संरक्षित DropDownList XYZZYCorporateLocationSelector;

संरक्षित ओवरराइड करें स्ट्रिंग DefaultTemplateName
{
हो जाओ
{
वापस जाएँ "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

सार्वजनिक ओवरराइड करें ऑब्जेक्ट मान
{
हो जाओ
{
EnsureChildControls();
वापस जाएँ यह.XYZZYCorporateLocationSelector.SelectedValue;
} // हो जाओ
सेट करें
{
EnsureChildControls();
यह.XYZZYCorporateLocationSelector.SelectedValue = (स्ट्रिंग)यह.ItemFieldValue;
} // सेट करें
} // ऑब्जेक्ट मान को ओवरराइड

संरक्षित ओवरराइड करें शून्य CreateChildControls()
{

अगर (यह.फ़ील्ड = = अशक्त || यह.ControlMode = = SPControlMode.प्रदर्शन)
वापस जाएँ;

बेस.CreateChildControls();

यह.XYZZYCorporateLocationSelector =
(DropDownList)TemplateContainer.FindControl("XYZZYCorporateLocationSelector");

अगर (यह.XYZZYCorporateLocationSelector = = अशक्त)
फेंक नई अपवाद("त्रुटि: लोड नहीं कर सकता। ASCX फ़ाइल!");

अगर (!यह.Page.IsPostBack)
{

का उपयोग कर (SPSite साइट = नई SPSite("http://लोकलहोस्ट/enterprisedata"))
{
का उपयोग कर (SPWeb वेब साइट =। OpenWeb())
{

SPList currentList वेब =। सूचियाँ["कॉर्पोरेट स्थानों"];

foreach (SPItem XYZZYCorporateLocation में currentList.Items)
{
अगर (XYZZYCorporateLocation["शीर्षक"] == अशक्त) «««;

स्ट्रिंग theTitle;
theTitle = XYZZYCorporateLocation["शीर्षक"].ToString();

यह.XYZZYCorporateLocationSelector.Items.Add
(नई ListItem(theTitle, theTitle));

} // foreach

} // spweb वेब का उपयोग = site.openweb()
} // spsite साइट का उपयोग करके नए spsite =("http://लोकलहोस्ट/enterprisedata")

} // नहीं तो एक postback

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

इसके बाद के संस्करण कोड मूल रूप से DropDownList WSS कस्टम सूची में स्थित से मूल्यों के साथ populating के लिए तर्क लागू करता है http://localhost/enterprisedata और नामांकित "कॉर्पोरेट विभागों".

मैं एक एकल .cs फ़ाइल में दोनों वर्गों परिभाषित, इसे संकलित किया और इसे GAC में डाल (मजबूत की आवश्यकता, बेशक).

  1. किसी नियंत्रण टेम्पलेट को लागू (.ascx) के रूप में दिखाया गया:

<%@ नियंत्रण भाषा"सी # =" संभालते="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,संस्करण 12.0.0.0, संस्कृति = = तटस्थ,PublicKeyToken = 71e9bce111e9429c" compilationMode"हमेशा =" %>
<%
@ पंजीकृत करें Tagprefix"wssawc =" Namespace="Microsoft.SharePoint.WebControls" विधानसभा="Microsoft.SharePoint, संस्करण = 12.0.0.0, संस्कृति तटस्थ =, PublicKeyToken = 71e9bce111e9429c" %> <%@ पंजीकृत करें Tagprefix"SharePoint =" Namespace="Microsoft.SharePoint.WebControls" विधानसभा="Microsoft.SharePoint, संस्करण = 12.0.0.0, संस्कृति तटस्थ =, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID"XYZZYCorporateLocationFieldControl =" runat"सर्वर" =>
<टेम्पलेट>
<एएसपी:DropDownList ID"XYZZYCorporateLocationSelector =" runat"सर्वर =" />
</टेम्पलेट>
</
SharePoint:RenderingTemplate>

इसके बाद के संस्करण में सी सहेजी जाती है:\प्रोग्राम प्रोग्राम filesmicrosoft sharedweb सर्वर extensions12controltemplates.

  1. अंत में, हम में सहेजने के लिए एक XML फ़ाइल बनाएँ... 12XML निर्देशिका. इस CAML कि हमारे कस्टम डेटा प्रकार को परिभाषित करता है और मेरे उदाहरण के लिए, इस तरह दिखता है:

<?xml संस्करण="1.0" एन्कोडिंग="utf-8" ?>
<
FieldTypes>
<
FieldType>
<
फ़ील्ड नाम="TypeName">CorporateLocations</फ़ील्ड>
<
फ़ील्ड नाम="ParentType">पाठ</फ़ील्ड>
<
फ़ील्ड नाम="TypeDisplayName">कॉर्पोरेट स्थानों</फ़ील्ड>
<
फ़ील्ड नाम="TypeShortDescription">सब XYZZY कॉर्पोरेट विनिर्माण या अन्य सुविधाओं सहित स्थान.</फ़ील्ड>
<
फ़ील्ड नाम="UserCreatable">सच</फ़ील्ड>
<
फ़ील्ड नाम="ShowInListCreate">सच</फ़ील्ड>
<
फ़ील्ड नाम="ShowInDocumentLibraryCreate">सच</फ़ील्ड>
<
फ़ील्ड नाम="ShowInSurveyCreate">सच</फ़ील्ड>
<
फ़ील्ड नाम="ShowInColumnTemplateCreate">सच</फ़ील्ड>
<
फ़ील्ड नाम="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, संस्करण = 1.0.0.0, संस्कृति तटस्थ =, PublicKeyToken = b0b19e85410990c4</फ़ील्ड>
<
RenderPattern नाम="DisplayPattern">
<
स्विच>
<
Expr>
<
स्तंभ />
</
Expr>

<मामला मान=""/>

<डिफ़ॉल्ट>
<
HTML>
<![CDATA[
<अवधि शैली = "रंग:लाल"><ख>]]>
</
HTML>

<
स्तंभ SubColumnNumber="0" HTMLEncode="सच"/>

<HTML><![CDATA[</ख></काल>]]></HTML>

</
डिफ़ॉल्ट>
</
स्विच>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
यह XML फ़ाइल कस्टम डेटा प्रकार जोड़ता है WSS "लायब्रेरी करने के लिए" और यह GAC के खिलाफ मैच था विधानसभा.

जगह में इन सभी बिट्स स्थानांतरण के बाद, iisreset पर सर्वर है और यह सब अच्छी तरह से कार्य करना प्रारंभ करना चाहिए.

3 पर विचार "काई: कार्यात्मक उदाहरण-कस्टम डेटा प्रकार

  1. ऐलेजैंड्रो
    हाय पॉल,
    सबसे पहले, लेख के लिए धन्यवाद, यह बहुत दिलचस्प है, क्योंकि. केवल एक प्रश्न;
    तुम्हें पता है अगर यह सही ढंग से एक कस्टम फ़ील्ड प्रकार सूची का डेटा पत्रक दृश्य में प्रस्तुत करने के लिए posible?
    क्योंकि मैं इसे बनाएँ हर कस्टम फ़ील्ड प्रकार केवल पठन डेटा पत्रक दृश्य में दिखाया गया है (और MSDN, उदाहरण के लिए, मुझे बहुत ही ज्यादा मदद नहीं करता :-एस).
    धन्यवाद
  2. Lyndsay

    मैं अपने समाधान लागू करने का प्रयास कर रहा हूँ. हालांकि मैं DropDownList के बजाय, मैं केवल एक DropDownChoiceList के लिए विकल्प है. तुम एक DropDownChoiceList करने के लिए आइटम जोड़ने के लिए कैसे जानते हो? हम SharePoint का उपयोग कर रहे हैं 2007 SP1 और दृश्य स्टूडियो 2005 SP1.

कोई जवाब दो

आपका ईमेल पता प्रकाशित नहीं किया जाएगा. अपेक्षित स्थानों को रेखांकित कर दिया गया है *