MOSS: Λειτουργική παράδειγμα-προσαρμοσμένα δεδομένα τύπου

Επιχειρηματικό σενάριο:

Υλοποίηση εταιρικών βρύα για κατασκευαστική εταιρεία με 30+ τοποθεσίες και μερικές δεκάδες εταιρικά τμήματα.

Στόχος της επιχείρησης:

Παρά μια πληθώρα επιχειρηματικούς ομίλους (τμήματα, τοποθεσίες, κλπ), ορισμένα δεδομένα πρέπει να διατηρηθούν σε παγκόσμιο επίπεδο. Για παράδειγμα, μια έγκυρη κύρια λίστα όλες οι φυσικές τοποθεσίες της εταιρείας (π.χ.. εγκαταστάσεις παραγωγής, Tοποθεσίες αποθηκών, γραφεία πωλήσεων) θα πρέπει να διατηρηθεί σε μια κεντρική τοποθεσία.

Τεχνικό πρόβλημα:

Η ταξινόμηση του επιχείρηση τέθηκε σε εφαρμογή χρησιμοποιώντας πολλαπλές συλλογές τοποθεσιών. Θα θέλαμε να δημιουργήσετε έγκυρες κατάλογο των φυσικές τοποθεσίες σε μια προσαρμοσμένη λίστα WSS. Στη συνέχεια, όταν έπρεπε να έχουμε μια στήλη σε έναν τύπο περιεχομένου (ή μια στήλη που προστίθενται σε μια λίστα ή doc βιβλιοθήκη) η έκθεση περιείχε ΕΤΑΙΡΙΚΕΣ ΤΟΠΟΘΕΣΙΕΣ, θα μπορούσαμε να δημιουργήσουμε μια στήλη χρησιμοποιώντας την "Αναζήτηση" ο τύπος δεδομένων και σημείο σε αυτόν τον κύριο κατάλογο.

Δυστυχώς, Τύποι αναζήτησης δεδομένων πρέπει να έχετε πρόσβαση σε μια πηγή λίστα "τοπικά" πράγμα που σημαίνει ότι οι έγκυρες λίστα μας δεν μπορεί να επεκταθεί συλλογές τοποθεσιών.

Τεχνική λύση:

Εφαρμογή ενός νέου τύπου προσαρμοσμένα δεδομένα εφαρμόζεται με βάση SPField και αναπαριστώνται από μια αναπτυσσόμενη λίστα στο UI του οποίου ListItems συμπλήρωση από τον κύριο κατάλογο WSS.

Δημιουργήσαμε μια νέα συλλογή τοποθεσιών ονομάζεται "http://localhost/EnterpriseData". Εκεί, έχουμε δημιουργήσει μια προσαρμοσμένη λίστα που ονομάζεται "Εταιρική θέσεις". Αυτή η λίστα χρησιμοποιεί ακριβώς το πρότυπο "Τίτλος" πεδίο που περιέχει τον κατάλογο των πραγματικών ΕΤΑΙΡΙΚΕΣ ΤΟΠΟΘΕΣΙΕΣ.

Ακολουθεί αρκετές διακριτά βήματα για να δημιουργήσετε έναν τύπο προσαρμοσμένα δεδομένα σε WSS. Είναι:

  1. Καθορίσετε μια κατηγορία που κληρονομεί από SPField (μπορεί να κληρονομούν από άλλα πεδία εάν απαιτείται).

Εδώ είναι ο κωδικός για αυτό:

δημόσια Κατηγορία XYZZYCorporateLocationField : SPFieldText
{
δημόσια XYZZYCorporateLocationField
(Το SPFieldCollection πεδία, συμβολοσειρά Όνομα τύπου, συμβολοσειρά displayName)
: βάση(πεδία, Όνομα τύπου, displayName) { }

δημόσια XYZZYCorporateLocationField
(Το SPFieldCollection πεδία, συμβολοσειρά displayName)
: βάση(πεδία, displayName) { }

δημόσια παράκαμψη BaseFieldControl FieldRenderingControl
{
πάρετε
{
BaseFieldControl ελέγχου = νέα XYZZYCorporateLocationFieldControl();
ελέγχου. Όνομα πεδίου = αυτό.InternalName;
επιστροφή ελέγχου;
} //πάρετε
} // fieldrenderingcontrol

δημόσια παράκαμψη συμβολοσειρά GetValidatedString(αντικείμενο αξία)
{
Αν (αυτό.Απαιτείται || αξία. ToString().Ισούται με(Συμβολοσειρά.Άδειο))
{
ρίξει νέα SPFieldValidationException ("Το τμήμα δεν έχει εκχωρηθεί.");
}
επιστροφή βάση.GetValidatedString(αξία);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Καθορίσετε μια άλλη κατηγορία που κληρονομεί από τον έλεγχο του πεδίου βάσης, όπως και στην:

δημόσια Κατηγορία XYZZYCorporateLocationFieldControl : BaseFieldControl
{
προστατεύονται ΑΝΑΠΤΥΣΣΟΜΕΝΗ ΛΙΣΤΑ XYZZYCorporateLocationSelector;

προστατεύονται παράκαμψη συμβολοσειρά DefaultTemplateName
{
πάρετε
{
επιστροφή "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

δημόσια παράκαμψη αντικείμενο Αξία
{
πάρετε
{
EnsureChildControls();
επιστροφή αυτό.XYZZYCorporateLocationSelector.SelectedValue;
} // πάρετε
Σύνολο
{
EnsureChildControls();
αυτό.XYZZYCorporateLocationSelector.SelectedValue = (συμβολοσειρά)αυτό.ItemFieldValue;
} // Σύνολο
} // παράκαμψη αντικείμενο αξίας

προστατεύονται παράκαμψη άκυρη CreateChildControls()
{

Αν (αυτό.Πεδίο == τιμή null || αυτό.ControlMode == SPControlMode.Οθόνη)
επιστροφή;

βάση.CreateChildControls();

αυτό.XYZZYCorporateLocationSelector =
(ΑΝΑΠΤΥΣΣΟΜΕΝΗ ΛΙΣΤΑ)FindControl TemplateContainer.("XYZZYCorporateLocationSelector");

Αν (αυτό.XYZZYCorporateLocationSelector == τιμή null)
ρίξει νέα Εξαίρεση("ΣΦΆΛΜΑ: Δεν μπορεί να φορτώσει. Αρχείο ASCX!");

Αν (!αυτό.IsPostBack σελίδα.)
{

χρήση (SPSite ιστοσελίδα = νέα SPSite("http://localhost/enterprisedata"))
{
χρήση (SPWeb Web = site. Επιθετικό())
{

SPList currentList = web. Λίστες[«ΕΤΑΙΡΙΚΕΣ ΤΟΠΟΘΕΣΙΕΣ"];

foreach (SPItem XYZZYCorporateLocation σε currentList.Items)
{
Αν (XYZZYCorporateLocation["Τίτλος"] == τιμή null) «««;

συμβολοσειρά τον τίτλο;
τον τίτλο = XYZZYCorporateLocation["Τίτλος"].ToString();

αυτό.XYZZYCorporateLocationSelector.Items.Add
(νέα Στοιχείο λίστας(τον τίτλο, τον τίτλο));

} // foreach

} // χρησιμοποιώντας spweb web = site.openweb()
} // χρησιμοποιώντας την ιστοσελίδα spsite = νέα spsite("http://localhost/enterprisedata")

} // Αν δεν είναι μια καταχώρηση προς τα πίσω

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Ο παραπάνω κώδικας βασικά υλοποιεί τη λογική για την εποίκηση την αναπτυσσόμενη λίστα με τις τιμές από το WSS προσαρμοσμένη λίστα που βρίσκεται στο http://localhost/enterprisedata και που ονομάζεται "εταιρική τµήµατα".

Εγώ ορίζονται δύο κατηγορίες σε ένα ενιαίο .cs αρχείο, συνέταξε το και το βάζουμε στο GAC (απαιτείται ισχυρή, Φυσικά).

  1. Εφαρμόσει ένα πρότυπο ελέγχου (.ascx) όπως φαίνεται:

<%@ Ελέγχου Γλώσσα= "C#" Κληρονομεί="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:Πρότυπο_απόδοσης για ID= "XYZZYCorporateLocationFieldControl" RUNAT= "διακομιστής">
<Πρότυπο>
<ASP:ΑΝΑΠΤΥΣΣΟΜΕΝΗ ΛΙΣΤΑ ID= "XYZZYCorporateLocationSelector" RUNAT= "διακομιστή" />
</Πρότυπο>
</
SharePoint:Πρότυπο_απόδοσης για>

Τα παραπάνω είναι αποθηκευμένο σε c:\πρόγραμμα ΕφαρμογώνΚοινά filesmicrosoft sharedweb διακομιστή extensions12controltemplates.

  1. Τέλος, δημιουργούμε ένα αρχείο XML για να αποθηκεύσετε σε το... 12XML κατάλογο. Αυτό είναι CAML, η οποία καθορίζει τους κανόνες μας προσαρμοσμένα δεδομένα Τύπος και για παράδειγμα μου, μοιάζει με αυτό:

<?XML έκδοση="1.0" κωδικοποίηση="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Πεδίο Όνομα="Όνομα τύπου">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[
<span style = "χρώμα:Κόκκινο"><β>]]>
</
HTML>

<
Στήλη SubColumnNumber="0" HTMLEncode="ΑΛΉΘΕΙΑ"/>

<HTML><![CDATA[</β></span>]]></HTML>

</
Προεπιλογή>
</
Διακόπτης>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Αυτό το αρχείο XML προσθέτει ο προσαρμοσμένα δεδομένα Τύπος το WSS "βιβλιοθήκη" και αγώνες εναντίον GAC είχε Συνέλευση.

Μετά τη μετακίνηση όλα αυτά τα κομμάτια στη θέση, iisreset στο διακομιστή και αυτό θα πρέπει όλοι να ξεκινήσουμε λειτουργεί πολύ καλά.

3 thoughts on «MOSS: Λειτουργική παράδειγμα-προσαρμοσμένα δεδομένα τύπου

  1. Alejandro
    Γεια σου Paul,
    Πρώτα απ' όλα, Ευχαριστώ για το άρθρο, επειδή είναι πολύ ενδιαφέρον. Μόνο ένα ερώτημα;
    Ξέρετε αν είναι μαζί σας σε render διορθώνω ένα προσαρμοσμένο τύπο πεδίου στην προβολή "φύλλο δεδομένων" ενός καταλόγου?
    Επειδή κάθε τύπο προσαρμοσμένου πεδίου που μπορώ να δημιουργήσω αυτό εμφανίζεται μόνο για ανάγνωση σε προβολή φύλλου δεδομένων (και το MSDN, για παράδειγμα, δεν με βοηθήσει πάρα πολύ :-S).
    Ευχαριστώ
  2. Lyndsay

    Εγώ είμαι προσπαθεί να εφαρμόσει τη λύση σας. Ωστόσο εγώ αντί ΑΝΑΠΤΥΣΣΟΜΕΝΗ ΛΙΣΤΑ, Έχω μόνο την επιλογή για μια DropDownChoiceList. Μήπως τυχαίνει να ξέρετε πώς να προσθέσετε αντικείμενα σε μια DropDownChoiceList? Χρησιμοποιούμε SharePoint 2007 SP1 και Visual Studio 2005 SP1.

Αφήνω μια απάντηση

Η διεύθυνση email σας δεν θα δημοσιευθεί. τα απαιτούμενα πεδία είναι επισημασμένα *